services: backend: build: context: ./backend dockerfile: Dockerfile environment: - ASPNETCORE_URLS=http://+:8080 - ConnectionStrings__Default=Data Source=/data/trajets.db # La clé ORS est fournie par l'environnement / .env — jamais intégrée à l'image. - ORS__ApiKey=${ORS_API_KEY:-} # --- Authentification --- # :? fait échouer le démarrage si le secret est absent (jamais de clé vide). - JWT__SecretKey=${JWT_SECRET_KEY:?JWT_SECRET_KEY requis} - JWT__ExpirationMinutes=${JWT_EXPIRATION_MINUTES:-720} - Auth__ResetTokenLifetimeMinutes=${AUTH_RESET_TOKEN_LIFETIME_MINUTES:-60} - Auth__FrontendBaseUrl=${AUTH_FRONTEND_BASE_URL:-http://localhost:2202} # --- SMTP (facultatif) : Smtp__Host vide ⇒ repli journalisation du lien de reset --- - Smtp__Host=${SMTP_HOST:-} - Smtp__Port=${SMTP_PORT:-587} - Smtp__User=${SMTP_USER:-} - Smtp__Password=${SMTP_PASSWORD:-} - Smtp__From=${SMTP_FROM:-} volumes: - trajets-data:/data restart: unless-stopped # Healthcheck sur GET /health. curl est installé dans l'image backend (voir Dockerfile). healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 5s retries: 3 start_period: 20s frontend: build: context: ./frontend dockerfile: Dockerfile ports: - "2202:80" # hôte 2202 -> nginx (frontend) depends_on: backend: condition: service_healthy restart: unless-stopped volumes: trajets-data: # persistance SQLite au-delà du cycle de vie des conteneurs