{"id":48459251,"url":"https://github.com/makomweb/fullstack-symfony-react","last_synced_at":"2026-04-07T01:01:54.737Z","repository":{"id":343232880,"uuid":"1176790570","full_name":"makomweb/fullstack-symfony-react","owner":"makomweb","description":"Track game results with this cloud native app. ⚽️ It features Helm and LGTM stack for a full Kubernetes experience.","archived":false,"fork":false,"pushed_at":"2026-04-05T18:09:26.000Z","size":351,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-05T20:19:14.287Z","etag":null,"topics":["clean-architecture","cleancode","cloud-native","docker","docker-compose","full-stack","grafana","helm","hexagonal-architecture","kubernetes","mysql","opentelemetry","php","react","symfony","typescript"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/makomweb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-09T11:32:49.000Z","updated_at":"2026-04-05T18:09:28.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/makomweb/fullstack-symfony-react","commit_stats":null,"previous_names":["makomweb/fullstack-symfony-react"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/makomweb/fullstack-symfony-react","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makomweb%2Ffullstack-symfony-react","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makomweb%2Ffullstack-symfony-react/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makomweb%2Ffullstack-symfony-react/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makomweb%2Ffullstack-symfony-react/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/makomweb","download_url":"https://codeload.github.com/makomweb/fullstack-symfony-react/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makomweb%2Ffullstack-symfony-react/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31495466,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-06T17:22:55.647Z","status":"ssl_error","status_checked_at":"2026-04-06T17:22:54.741Z","response_time":112,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clean-architecture","cleancode","cloud-native","docker","docker-compose","full-stack","grafana","helm","hexagonal-architecture","kubernetes","mysql","opentelemetry","php","react","symfony","typescript"],"created_at":"2026-04-07T01:01:46.857Z","updated_at":"2026-04-07T01:01:54.726Z","avatar_url":"https://github.com/makomweb.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Fullstack Demo: React 19 + Symfony 8 + MySQL 8\n\n![app-ci-workflow](https://github.com/makomweb/games/actions/workflows/app-ci.yaml/badge.svg)\n[![codecov](https://codecov.io/github/makomweb/fullstack-symfony-react/branch/master/graph/badge.svg?token=4J4Q8Z1W11)](https://codecov.io/github/makomweb/fullstack-symfony-react)\n\n\n## Purpose\n\nA modern, full-stack, cloud-native game results tracker built on [Event Sourcing](https://martinfowler.com/eaaDev/EventSourcing.html) and [DDD principles](https://www.domainlanguage.com/ddd/).\\\nTrack and analyze game results using an immutable event log with comprehensive \nmonitoring and observability.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./assets/logo.jpg\" alt=\"logo\" width=\"300\"/\u003e\n\u003c/p\u003e\n\n### Tech Stack\n| Layer | Technology |\n|-------|-----------|\n| Frontend | React 19 + MUI |\n| Backend | PHP 8.4 + Symfony 8 |\n| Database | MySQL 8 |\n| DevOps | Docker, Kubernetes, Helm, Open Telemetry, Grafana |\n\n### Architecture Highlights\n- **Event Sourcing** – All state changes stored as immutable events\n- **Domain-Driven Design (DDD)** – Organized into generic, core, and supporting domains (enforced by [deptrac](https://github.com/deptrac/deptrac))\n- **Full Test Coverage** – Easy to achieve high coverage on the core domain\n- **Observable** – Built-in OpenTelemetry instrumentation with Grafana dashboard\n- **Cloud-Ready** – Deployable to Kubernetes with included Helm charts\n\n## System Architecture\n\n```\n┌─────────────────────────────────────────────────────────────────────────┐\n│                           Client Layer                                  │\n├─────────────────────────────────────────────────────────────────────────┤\n│                                                                         │\n│  ┌──────────────────┐              ┌──────────────────┐                 │\n│  │   React UI       │              │   Classic UI     │                 │\n│  │  (Modern)        │              │  (Legacy)        │                 │\n│  │  Port 8090       │              │  Port 8080       │                 │\n│  └────────┬─────────┘              └────────┬─────────┘                 │\n│           │                                  │                          │\n└───────────┼──────────────────────────────────┼──────────────────────────┘\n            │                                  │\n            └──────────────────┬───────────────┘\n                               │\n┌──────────────────────────────▼───────────────────────────────────────────┐\n│                        API Gateway Layer                                 │\n├──────────────────────────────────────────────────────────────────────────┤\n│                                                                          │\n│              ┌─────────────────────────────────────┐                     │\n│              │   Nginx (Reverse Proxy)             │                     │\n│              │   Port 8080                         │                     │\n│              └─────────────────────────────────────┘                     │\n│                               │                                          │\n└───────────────────────────────┼──────────────────────────────────────────┘\n                                │\n┌───────────────────────────────▼──────────────────────────────────────────┐\n│                      Backend Application Layer                           │\n├──────────────────────────────────────────────────────────────────────────┤\n│                                                                          │\n│  ┌────────────────────────────────────────────────────────────┐          │\n│  │  PHP 8.4 + Symfony 8 Application                           │          │\n│  │  - REST API Endpoints                                      │          │\n│  │  - Business Logic                                          │          │\n│  │  - Event Sourcing                                          │          │\n│  └────────┬──────────────────┬─────────────┬──────────────────┘          │\n│           │                  │             │                             │\n└───────────┼──────────────────┼─────────────┼─────────────────────────────┘\n            │                  │             │\n    ┌───────▼──────┐   ┌──────▼────────┐  ┌─▼──────────────┐\n    │              │   │               │  │                │\n    │   Database   │   │  Redis Cache  │  │ Message Queue  │\n    │   MySQL 8    │   │               │  │ (Messenger)    │\n    │   Port 3306  │   │   Port 6379   │  │ - Async Tasks  │\n    │              │   │               │  │ - Background   │\n    │   Events \u0026   │   │  - Sessions   │  │   Jobs         │\n    │   Data       │   │  - Cache      │  │                │\n    └──────────────┘   └───────────────┘  └────────────────┘\n                                                    │\n                                           ┌────────▼──────────┐\n                                           │ Background Worker │\n                                           │ (Messenger)       │\n                                           │ - Process Events  │\n                                           │ - Async Tasks     │\n                                           └───────────────────┘\n\n┌──────────────────────────────────────────────────────────────────────────┐\n│                    Observability Layer (LGTM Stack)                      │\n├──────────────────────────────────────────────────────────────────────────┤\n│                                                                          │\n│  ┌────────────┐  ┌─────────┐  ┌─────────────┐  ┌─────────┐               │\n│  │ Logs       │  │ Traces  │  │ Metrics     │  │Grafana  │               │\n│  │ (Loki)     │  │ (Tempo) │  │ (Prometheus)│  │Dashboard│               │\n│  │ Port 3100  │  │ 3200    │  │ 9090        │  │3000     │               │\n│  └────────────┘  └─────────┘  └─────────────┘  └─────────┘               │\n│        ▲             ▲             ▲                                     │\n│        └─────────────┴─────────────┘                                     │\n│              OpenTelemetry Collector (Port 4317/4318)                    │\n│                                                                          │\n└──────────────────────────────────────────────────────────────────────────┘\n```\n\n## Prerequisites\n\n- [Make](https://www.gnu.org/software/make/)\n- [Docker](https://www.docker.com/)\n- [Docker Compose](https://docs.docker.com/compose/)\n- (Optional) [Kubernetes](https://kubernetes.io/)\n\nSee the [features](FEATURES.md) page for a complete list.\n\n## Getting Started\n\n**Quick Start (5 minutes):**\n\n```sh\nmake dev      # Build development images\nmake init     # Setup DB, schema \u0026 fixtures\nmake up       # Start all services\nmake open     # Open dashboard in browser\n```\n\n**What's running?** \n- Backend API at [http://localhost:8080](http://localhost:8080)\n- React UI at [http://localhost:8090](http://localhost:8090)\n- Monitoring at [http://localhost:3000](http://localhost:3000)\n\n**Stop everything:**\n```sh\nmake down\n```\n\n**For all available commands**, run `make help` or see the [Makefile](./Makefile).\n\n## Services \u0026 Access Points\n\n**Frontend**\n| Service | URL | Credentials |\n|---------|-----|-------------|\n| Classic UI | [http://localhost:8080](http://localhost:8080) | — |\n| React UI | [http://localhost:8090](http://localhost:8090) | — |\n\n**Backend \u0026 API**\n| Service | URL | Credentials |\n|---------|-----|-------------|\n| API | [http://localhost:8080/api/games](http://localhost:8080/api/games) | — |\n| API Docs | [http://localhost:8080/api/doc](http://localhost:8080/api/doc) | — |\n| Admin UI | [http://localhost:8080/admin](http://localhost:8080/admin) | admin@example.com:secret |\n\n**Monitoring \u0026 Observability**\n| Service | URL | Credentials |\n|---------|-----|-------------|\n| Grafana Dashboard | [http://localhost:3000](http://localhost:3000) (Docker Compose) or [http://kubernetes.docker.internal:30300](http://kubernetes.docker.internal:30300) (Kubernetes) | — |\n\n**Data \u0026 Infrastructure**\n| Service | URL | Credentials |\n|---------|-----|-------------|\n| Database (Adminer) | [http://localhost:8085](http://localhost:8085) | root:secret |\n| Redis Cache | [http://localhost:5540](http://localhost:5540) | — |\n| RabbitMQ | [http://localhost:15672](http://localhost:15672) | guest:guest |\n| Documentation | [http://localhost:8005](http://localhost:8005) | — |\n\n## Quality Assurance \u0026 Development\n\n**Testing**\n```sh\nmake backend-test    # Run backend tests\nmake frontend-test   # Run frontend tests\n```\n\n**Code Quality**\n```sh\nmake qa              # Full QA suite (tests + analysis)\nmake sa              # Static analysis\nmake cs              # Auto-fix code style issues\n```\n\n**Utilities**\n```sh\nmake shell           # Shell access to PHP container\n                     # Then run: php phploc.phar src/ (lines of code)\n```\n\n**All commands:** Run `make help` or see the [Makefile](./Makefile).\n\n## Kubernetes Deployment\n\n**Install with Helm:**\n\n```sh\nhelm install app ./helm/app\n\n# or with 2 replicas (Pods) each:\nhelm install app ./helm/app --set frontend.replicas=2 --set backend.replicas=2\n\n# for telemetry:\nhelm install telemetry ./helm/telemetry\n```\n\n**Access Services**\n| Service | Internal | Local |\n|---------|----------|-------|\n| API | http://kubernetes.docker.internal:30100 | http://localhost:30100 |\n| Webapp | http://kubernetes.docker.internal:30200 | http://localhost:30200 |\n| Dashboard | http://kubernetes.docker.internal:30300 | http://localhost:30300 |\n\nSee [helm](./helm/) for configuration details.\n\n## Learning \u0026 References\n\n**Architecture \u0026 Patterns**\n- [Event Sourcing](https://martinfowler.com/eaaDev/EventSourcing.html) – Design pattern reference\n- [Domain-Driven Design](https://www.domainlanguage.com/ddd/) – DDD principles\n- [Symfony Messenger worker on Kubernetes](https://itnext.io/symfony-messenger-worker-on-kubernetes-77f75725b5ed)\n\n**Observability**\n- [OpenTelemetry](https://opentelemetry.io/docs/what-is-opentelemetry/) – Instrumentation fundamentals\n- [Grafana LGTM Stack](https://grafana.com/go/webinar/getting-started-with-grafana-lgtm-stack/) – Logs, traces, metrics, profiles\n\n**Examples**\n- [Symfony Messenger Example](https://github.com/nielsvandermolen/example-symfony-messenger/blob/master/Dockerfile-php-consume)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmakomweb%2Ffullstack-symfony-react","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmakomweb%2Ffullstack-symfony-react","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmakomweb%2Ffullstack-symfony-react/lists"}