Major changes across backend, frontend, infrastructure: - Provider system with model selection (Google, DeepL, OpenAI, Ollama, Google Cloud) - Admin panel: user management, pricing, settings - Glossary system with CSV import/export - Subscription and tier quota management - Security hardening (rate limiting, API key auth, path traversal fixes) - Docker compose for dev, prod, and IONOS deployment - Alembic migrations for new tables - Frontend: dashboard, pricing page, landing page, i18n (en/fr) - Test suite and verification scripts Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
9.0 KiB
Story 6.2: Docker Compose Production
Status: done
Story
As a DevOps, I want a production Docker Compose setup, so that I can deploy to VPS.
Acceptance Criteria
- Given docker-compose.yml exists
When I deploy to VPS
Then all services run in production mode
And containers restart automatically on failure
And health checks are configured
And secrets are loaded from environment
Tasks / Subtasks
- Task 1 (AC: #1) — Fichier docker-compose.yml dédié production
- 1.1 Définir les services backend, frontend, postgres, redis (sans mounts de code, images buildées).
- 1.2 Documenter la commande de déploiement :
docker compose up -d(oudocker-compose -f docker-compose.yml up -d).
- Task 2 (AC: #1) — Mode production et redémarrage
- 2.1 Backend et frontend exécutés sans --reload / sans hot reload ; build d’images pour la prod.
- 2.2 Politique restart:
restart: unless-stopped(oualways) pour tous les services applicatifs et dépendances.
- Task 3 (AC: #1) — Health checks
- 3.1 Healthchecks configurés pour backend (ex. GET /health), postgres, redis.
- 3.2 depends_on avec condition: service_healthy pour les services qui dépendent de postgres/redis/backend.
- Task 4 (AC: #1) — Secrets depuis l’environnement
- 4.1 Aucun secret en dur ; usage de env_file et/ou variables d’environnement (NFR10).
- 4.2 Documenter dans .env.example (section Production) les variables requises pour la prod (DATABASE_URL, REDIS_URL, SECRET_KEY, API keys, etc.).
Dev Notes
- Contexte : La story 6-1 a livré
docker-compose.dev.yml(dev avec hot reload, volumes de code, PostgreSQL, Redis). La story 6-2 vise un fichier proddocker-compose.yml(ou équivalent) pour déploiement VPS : pas de mount de code, images buildées, restart policy, healthchecks, secrets via env. - Architecture : [Source: _bmad-output/planning-artifacts/architecture.md] — Infrastructure & Deployment : Docker Compose (Backend + Frontend + Redis + DB), VPS, reverse proxy (Traefik/Nginx) pour HTTPS. Health check format documenté (status, database, redis, providers).
- NFR10 : Secrets et configuration via variables d’environnement uniquement.
- Fichiers à toucher :
docker-compose.yml(prod),.env.example(section Production), éventuellementdocker/backend/Dockerfileetdocker/frontend/Dockerfilesi un stage "prod" ou "production" est nécessaire.
Project Structure Notes
- Racine :
office_translator/avecdocker-compose.yml(prod),docker-compose.dev.yml(dev). Rester cohérent avec l’arbre dans architecture.md. - En prod : pas de volumes montant le code source ; build d’images et exécution des binaires (uvicorn sans --reload, frontend build npm run build + serve).
References
- [Source: _bmad-output/planning-artifacts/architecture.md] — Infrastructure & Deployment, Development Workflow, Complete Project Directory Structure.
- [Source: _bmad-output/planning-artifacts/epics.md] — Epic 6, Story 6.2, AC BDD.
- [Source: _bmad-output/implementation-artifacts/6-1-docker-compose-development.md] — Patterns dev (services, healthchecks, env_file) à réutiliser en prod sans hot reload.
Technical Requirements (Architecture Compliance)
- Backend : Python 3.11+, FastAPI, uvicorn sans --reload. Port 8000. Connexion PostgreSQL (asyncpg) et Redis via variables d’environnement. Image construite depuis docker/backend/Dockerfile (stage prod).
- Frontend : Node 20, Next.js 15, build
npm run build, exécution en prod (ex.npm run startou serveur statique). NEXT_PUBLIC_API_URL doit pointer vers l’URL du backend en prod (ex. https://api.domaine.fr). - PostgreSQL : Image postgres:16-alpine. Healthcheck
pg_isready. Volume persistant pour les données. - Redis : Image redis:7-alpine. Healthcheck
redis-cli ping. Volume persistant si besoin (persistance prod). - Réseau : Même réseau Compose pour backend ↔ postgres, backend ↔ redis. Exposition des ports selon besoin (ex. 8000 backend, 3000 frontend ou derrière reverse proxy uniquement).
- Secrets : Aucun secret en dur ; env_file et/ou variables injectées par l’orchestrateur (NFR10).
Architecture Compliance
- Alignement avec architecture.md : Docker Compose pour orchestration, VPS, reverse proxy (Traefik/Nginx) pour HTTPS — config reverse proxy hors scope de cette story (story 6.5).
- Health check format attendu (documenté dans architecture) : JSON avec status, database, redis, providers.
- Respect de la structure projet : backend/, frontend/, docker/, scripts/.
Library / Framework Requirements
- Docker Compose (Compose Spec v2/v3) : utiliser la syntaxe supportée par le moteur cible (Docker Engine 20.10+, Compose V2 recommandé).
- Aucune librairie applicative supplémentaire ; stack inchangée (FastAPI, Next.js, PostgreSQL, Redis).
File Structure Requirements
docker-compose.ymlà la racine du projet (prod). Ne pas écraser ou fusionner avecdocker-compose.dev.yml; garder deux fichiers distincts (dev vs prod).- Fichiers Dockerfile :
docker/backend/Dockerfile,docker/frontend/Dockerfile— utiliser un stage "prod" ou "production" pour build sans outils de dev si pertinent. .env.example: section « Production / VPS » listant toutes les variables requises (DATABASE_URL, REDIS_URL, SECRET_KEY, GOOGLE_API_KEY, DEEPL_API_KEY, OPENAI_API_KEY, OLLAMA_BASE_URL, etc.) sans valeurs réelles.
Testing Requirements
- Vérifier que
docker compose up -d(ou équivalent) démarre tous les services en mode prod sans erreur. - Vérifier que les healthchecks passent (backend /health, postgres, redis).
- Vérifier qu’un arrêt brutal d’un conteneur déclenche bien un redémarrage (restart policy).
- Vérifier qu’aucun secret n’apparaît en clair dans les fichiers versionnés.
Previous Story Intelligence (6-1 Docker Compose Development)
- Fichiers créés/modifiés :
docker-compose.dev.yml(4 services : postgres, redis, backend, frontend),.env.example(section Docker Compose dev),scripts/verify-dev-compose.sh. - Patterns établis : healthchecks avec
condition: service_healthypour depends_on ; env_file pour variables ; volumes dédiés pour données postgres/redis et pour éviter d’écraser venv/node_modules en dev. - Différence clé pour 6-2 : en prod, pas de volumes montant le code ; pas de
--reloadninpm run dev; images buildées une fois ; restart policy explicite ; mêmes services (backend, frontend, postgres, redis) mais configuration orientée stabilité et secrets externes.
Git Intelligence Summary
- Derniers commits : correctifs sécurité (path traversal, validation UUID), revue de code, évolutions Docker/Kubernetes et PostgreSQL, améliorations production (sécurité, Redis sessions, retry). Pour 6-2 : s’appuyer sur l’infra Docker/PostgreSQL existante et ne pas introduire de régression sur la sécurité (pas de secrets en clair, bonnes pratiques de build).
Latest Tech Information
- Docker Compose V2 (
docker compose) est le standard ; privilégier la Compose Specification pour compatibilité. Pour production : utiliser des images multi-stage pour réduire la taille et éviter les outils de dev dans l’image finale.
Project Context Reference
- Aucun fichier
project-context.mdtrouvé à la racine ou dans docs/. Pour contexte métier et stack, s’appuyer sur architecture.md et epics.md.
Dev Agent Record
Agent Model Used
(dev-story workflow)
Debug Log References
Completion Notes List
-
docker-compose.yml : en-tête mis à jour (usage
docker compose up -d), backend/frontend avectarget: productionetenv_file: [.env], healthcheck Redis avecstart_period: 5s. Restart policy et healthchecks déjà en place pour tous les services. -
.env.example : section « Production / VPS » ajoutée en tête listant les variables requises (POSTGRES_, JWT_SECRET_KEY, ADMIN_, DATABASE_URL, REDIS_URL, CORS_ORIGINS, NEXT_PUBLIC_API_URL, clés API optionnelles). Aucun secret en dur (NFR10).
-
Validation :
docker compose confignon exécuté (Docker indisponible dans l’environnement). À vérifier manuellement :docker compose up -d, healthchecks, restart policy. -
Code review fixes : docker-compose.yml — POSTGRES_PASSWORD sans défaut (NFR10), JWT_SECRET_KEY dans environment ; .env.example — section Production précisée ; scripts/verify-prod-compose.sh ajouté.
File List
- docker-compose.yml (modifié — usage doc, target production, env_file, redis healthcheck ; post-review : POSTGRES_PASSWORD sans défaut, JWT_SECRET_KEY)
- .env.example (modifié — section Production / VPS, précision variables sensibles)
- scripts/verify-prod-compose.sh (créé — validation YAML et services prod)
- _bmad-output/implementation-artifacts/6-2-docker-compose-production.md (modifié — statut, tâches, Dev Agent Record)
- _bmad-output/implementation-artifacts/sprint-status.yaml (modifié — 6-2 in-progress puis review)