services: backend: build: # Contexte = racine du dépôt pour pouvoir embarquer .kiro/specs dans l'image. context: . dockerfile: backend/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: # Bind mount : la base SQLite est directement accessible sur l'hôte dans ./data/trajets.db, # sans entrer dans le conteneur (inspection, sauvegarde). Le dossier ./data est créé au # premier démarrage s'il n'existe pas. - ./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