Les trois couches à orchestrer
- database — MongoDB, avec un volume pour persister les campagnes.
- api — l'API Spring (image construite au chapitre 3), reliée à la base.
- web — le front (build Flutter web servi par Nginx, ou une appli web). Le mobile natif se build à part, mais l'appli web Flutter s'intègre très bien ici.
web (Nginx :80) → api (Spring :8080) → database (Mongo :27017)
Le compose.yaml des 3 couches
services: database: image: mongo:7 volumes: [ "fioul-data:/data/db" ] healthcheck: test: ["CMD","mongosh","--eval","db.adminCommand('ping')"] interval: 10s retries: 5 api: build: ./api environment: SPRING_DATA_MONGODB_URI: mongodb://database:27017/fioul JWT_SECRET: ${JWT_SECRET} depends_on: database: condition: service_healthy ports: [ "8080:8080" ] web: build: ./web # build Flutter web servi par Nginx depends_on: [ api ] ports: [ "80:80" ] volumes: fioul-data:
Variables & secrets (.env)
Les valeurs sensibles (comme JWT_SECRET) ne sont pas écrites en dur : Compose lit un fichier .env (non versionné) à côté du compose.yaml.
# .env (à mettre dans .gitignore !)
JWT_SECRET=change-moi-en-prod
.env reste local ; en production on injecte les variables par l'hôte ou un gestionnaire de secrets.Le healthcheck & l'ordre de démarrage
Le healthcheck de la base + condition: service_healthy garantissent que l'API ne démarre qu'une fois MongoDB réellement prête à accepter des connexions (et pas juste « lancée »).
Lancer toute la stack
docker compose up -d --build docker compose ps # web → http://localhost (front) # api → http://localhost:8080 (API + Swagger) # base → interne, non exposée
Structure le dépôt avec compose.yaml, api/ (Dockerfile Spring) et web/ (build Flutter web + Nginx). Un docker compose up -d --build et toute l'appli tourne : base persistée, API sécurisée, front servi. C'est le livrable « ça marche partout » du projet — parfait pour une démo de soutenance.
- Un seul
compose.yamldécrit les 3 couches database / api / web. - Elles se joignent par leur nom de service ; seule l'utile est exposée.
.envpour les secrets ;healthcheck+service_healthypour l'ordre.