# πŸ™οΈ CityGame β€” Fullstack Template > **NX Monorepo** Β· Spring Boot 3 Β· React 18 Β· TypeScript Β· Vite Β· Docker Compose --- ## Stack | Layer | Technology | |---|---| | **Backend** | Spring Boot 3.4, Java 21, Maven, Lombok, JPA, Actuator | | **Frontend** | React 18, TypeScript, Vite 5, Vitest | | **Database** | H2 (dev) / PostgreSQL 16 (prod) | | **Infra** | Docker Compose, nginx, multi-stage builds | | **Monorepo** | NX 21 β€” caching, task graph, affected builds | --- ## Quickstart ### PrΓ©requis - Node.js β‰₯ 20 - pnpm β‰₯ 10 (`npm install -g pnpm` ou `corepack enable`) - Java 21 - Docker + Docker Compose ### Installation ```bash git clone citygame cd citygame pnpm install ``` --- ## Commandes ### πŸ”₯ Mode DΓ©veloppement (hot reload) ```bash # Lance frontend (Vite HMR :5173) + backend (Spring DevTools :8080) en parallΓ¨le pnpm dev # Ou individuellement : pnpm dev:frontend # Vite dev server β†’ http://localhost:5173 pnpm dev:backend # Spring Boot β†’ http://localhost:8080 ``` > Le backend utilise H2 en mΓ©moire en mode dev. Pas besoin de Docker. > Pour utiliser PostgreSQL en dev : `docker compose -f docker-compose.dev.yml up -d` ### πŸ—οΈ Build ```bash # Build tout (frontend Vite + backend Maven JAR) pnpm build # Build individuellement : pnpm build:frontend # β†’ dist/apps/frontend/ pnpm build:backend # β†’ apps/backend/target/*.jar # Build les images Docker pnpm docker:build pnpm docker:build:frontend pnpm docker:build:backend ``` ### πŸš€ Production (Docker Compose) ```bash # Copier et configurer les variables d'environnement cp .env.example .env # DΓ©marrer la stack prod (aprΓ¨s docker:build) pnpm start # docker compose up (foreground) pnpm start:detach # docker compose up -d (background) pnpm stop # docker compose down pnpm logs # docker compose logs -f ``` ### πŸ§ͺ Tests ```bash pnpm test # Tous les tests pnpm test:frontend # Vitest pnpm test:backend # Maven Surefire (JUnit 5) ``` ### πŸ“Š NX Tools ```bash npx nx graph # Visualise le graphe de dΓ©pendances npx nx affected -t test # Tests des projets affectΓ©s par les changements npx nx affected -t build # Build uniquement ce qui a changΓ© npx nx reset # Nettoie le cache NX ``` --- ## Structure ``` CityGame/ β”œβ”€β”€ apps/ β”‚ β”œβ”€β”€ backend/ # Spring Boot (Maven) β”‚ β”‚ β”œβ”€β”€ src/main/java/com/citygame/ β”‚ β”‚ β”‚ β”œβ”€β”€ CityGameApplication.java β”‚ β”‚ β”‚ β”œβ”€β”€ api/HealthController.java β”‚ β”‚ β”‚ └── config/CorsConfig.java β”‚ β”‚ β”œβ”€β”€ src/main/resources/ β”‚ β”‚ β”‚ β”œβ”€β”€ application.yml # Base config β”‚ β”‚ β”‚ β”œβ”€β”€ application-dev.yml # H2 + DevTools β”‚ β”‚ β”‚ └── application-prod.yml # PostgreSQL β”‚ β”‚ β”œβ”€β”€ pom.xml β”‚ β”‚ β”œβ”€β”€ project.json # NX targets β”‚ β”‚ └── Dockerfile # Multi-stage β”‚ β”‚ β”‚ └── frontend/ # Vite + React + TypeScript β”‚ β”œβ”€β”€ src/ β”‚ β”‚ β”œβ”€β”€ api/health.ts # Client API typΓ© β”‚ β”‚ β”œβ”€β”€ App.tsx β”‚ β”‚ └── main.tsx β”‚ β”œβ”€β”€ vite.config.ts # Proxy /api β†’ backend β”‚ β”œβ”€β”€ project.json # NX targets β”‚ └── Dockerfile # Multi-stage (nginx) β”‚ β”œβ”€β”€ docker-compose.yml # Prod stack β”œβ”€β”€ docker-compose.dev.yml # Dev (DB seulement) β”œβ”€β”€ nx.json # Config NX + caching β”œβ”€β”€ package.json # Scripts & workspace └── .env.example # Variables template ``` --- ## API Endpoints | MΓ©thode | URL | Description | |---|---|---| | `GET` | `/api/hello` | Demo endpoint (message + timestamp) | | `GET` | `/actuator/health` | Health check Spring Boot | | `GET` | `/actuator/info` | Infos application | | `GET` | `/h2-console` | Console H2 (dev seulement) | --- ## Ajouter une fonctionnalitΓ© ### Nouveau endpoint backend 1. CrΓ©er un controller dans `apps/backend/src/main/java/com/citygame/api/` 2. RedΓ©marrage automatique via Spring DevTools ### Nouveau composant frontend 1. CrΓ©er dans `apps/backend/src/` 2. HMR Vite β€” mise Γ  jour sans rechargement ### Nouvelle app dans le monorepo ```bash # Nouvelle app React npx nx g @nx/react:app apps/my-new-app --bundler=vite # Nouvelle lib partagΓ©e TypeScript npx nx g @nx/js:lib libs/shared-types ``` --- ## Configuration Docker (prod) Copier `.env.example` β†’ `.env` et configurer : ```env DB_PASSWORD=un_mot_de_passe_fort CORS_ALLOWED_ORIGINS=https://votredomaine.com ``` --- ## License MIT