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.5 KiB
9.5 KiB
Story 6.1: Docker Compose Development
Status: done
Story
As a Developer, I want a Docker Compose setup for local development, so that I can run all services consistently.
Acceptance Criteria
- Given docker-compose.dev.yml exists
When I rundocker-compose -f docker-compose.dev.yml up
Then backend (FastAPI :8000), frontend (Next.js :3000), PostgreSQL, Redis start
And volumes mount for hot reload
And environment variables are loaded from .env files
Tasks / Subtasks
- Task 1 (AC: #1) — Fichier docker-compose.dev.yml complet avec tous les services
- 1.1 Définir les services backend, frontend, postgres, redis dans docker-compose.dev.yml (ou combiner avec un fichier base si le workflow actuel utilise -f compose.yml -f compose.dev.yml).
- 1.2 S'assurer que la commande d'exécution documentée est claire :
docker compose -f docker-compose.dev.yml up(ou équivalent avec docker-compose v1).
- Task 2 (AC: #1) — Backend FastAPI :8000 avec hot reload
- 2.1 Backend utilise le Dockerfile existant (docker/backend/Dockerfile) avec une cible adaptée au dev (ex. builder ou stage avec venv).
- 2.2 Monter le code backend en volume pour hot reload (uvicorn --reload). Exclure venv/node_modules du mount si nécessaire (volume anonyme pour /app/venv).
- 2.3 Exposer le port 8000. Vérifier que GET http://localhost:8000/health répond une fois les dépendances (DB, Redis) disponibles.
- Task 3 (AC: #1) — Frontend Next.js :3000 avec hot reload
- 3.1 Frontend utilise docker/frontend/Dockerfile avec une cible dev/builder si présente, sinon adapter pour
npm run dev. - 3.2 Monter le code frontend en volume ; préserver node_modules et .next via volumes anonymes pour éviter d'écraser les dépendances.
- 3.3 Exposer le port 3000. NEXT_PUBLIC_API_URL doit pointer vers l'URL du backend accessible depuis le navigateur (ex. http://localhost:8000).
- 3.1 Frontend utilise docker/frontend/Dockerfile avec une cible dev/builder si présente, sinon adapter pour
- Task 4 (AC: #1) — PostgreSQL et Redis
- 4.1 Inclure le service postgres (image postgres:16-alpine recommandée dans l'archi). Variables : POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB. Volume persistant pour les données.
- 4.2 Inclure le service redis (image redis:7-alpine). Optionnel : persistence (volume) et maxmemory pour dev. Healthcheck recommandé.
- 4.3 Backend dépend de postgres et redis (depends_on avec condition: service_healthy si healthchecks définis).
- Task 5 (AC: #1) — Variables d'environnement depuis .env
- 5.1 Utiliser env_file: [.env] ou equivalent pour backend et frontend (et postgres/redis si besoin). Docker Compose charge par défaut le fichier .env à la racine du projet pour la substitution dans le fichier YAML.
- 5.2 Documenter dans README ou .env.example les variables requises pour le dev (DATABASE_URL, REDIS_URL, SECRET_KEY, etc.) sans exposer de secrets.
- Task 6 — Vérification end-to-end
- 6.1 Tester
docker compose -f docker-compose.dev.yml up(oudocker-compose -f docker-compose.dev.yml up) : tous les services démarrent, backend et frontend accessibles sur :8000 et :3000, pas d'erreur au démarrage. - 6.2 Vérifier qu'un changement dans le code backend ou frontend déclenche bien un rechargement (hot reload).
- 6.1 Tester
Dev Notes
- Contexte actuel : Le projet contient déjà
docker-compose.dev.yml(backend + frontend, uvicorn --reload, npm run dev) etdocker-compose.yml(prod avec postgres, redis, nginx). La story 6-1 exige que le dev inclue aussi PostgreSQL et Redis, avec hot reload et chargement des variables depuis .env. Adapter ou fusionner les fichiers existants sans casser la prod. - Architecture : [Source: _bmad-output/planning-artifacts/architecture.md] — Stack : FastAPI (backend), Next.js 15 (frontend), PostgreSQL 16, Redis 7. Docker Compose pour orchestration locale. Structure : backend/ (FastAPI, app/, alembic/), frontend/ (Next.js, src/app/), docker/backend/Dockerfile, docker/frontend/Dockerfile. Démarrage local documenté :
docker-compose -f docker-compose.dev.yml up -davec Backend :8000, Frontend :3000, API Docs :8000/docs. - NFR10 : Secrets et configuration via variables d'environnement, jamais en dur dans le code.
- Fichiers à toucher :
docker-compose.dev.yml(principal), éventuellementdocker/backend/Dockerfile/docker/frontend/Dockerfilesi un stage "dev" ou "builder" est ajouté,.env.exampleou README pour la doc des variables.
Project Structure Notes
- Racine projet :
office_translator/avecbackend/,frontend/,docker/,docker-compose.yml,docker-compose.dev.yml. Rester cohérent avec l’arbre dans architecture.md (Complete Project Directory Structure). - Backend : contexte de build souvent
backend/ou.selon comment le Dockerfile est écrit (COPY . .). Les mounts dev doivent pointer vers le répertoire contenantmain.py/app/pour uvicorn --reload. - Frontend : contexte
frontend/dans le Dockerfile actuel. Mount dev typiquement./frontend:/appavec préservation denode_moduleset.next.
References
- [Source: _bmad-output/planning-artifacts/architecture.md] — Infrastructure & Deployment, Development Workflow, Project Structure.
- [Source: _bmad-output/planning-artifacts/epics.md] — Epic 6, Story 6.1, AC BDD.
- Docker Compose : chargement automatique de
.envà la racine ;env_filepour les services. Compose V2 :develop.watchpour sync/rebuild (optionnel pour cette story).
Technical Requirements (Architecture Compliance)
- Backend : Python 3.11+, FastAPI, uvicorn avec
--reload. Port 8000. Connexion à PostgreSQL (asyncpg) et Redis depuis les variables d'environnement. - Frontend : Node 20, Next.js 15,
npm run dev. Port 3000. NEXT_PUBLIC_API_URL pour les appels API. - PostgreSQL : Image postgres:16-alpine (alignée avec l’archi). Healthcheck
pg_isreadypour depends_on. - Redis : Image redis:7-alpine. Healthcheck
redis-cli ping. Optionnel en dev :--appendonly yeset volume pour persistance. - Réseau : Tous les services sur le même réseau Compose pour que backend atteigne postgres et redis par nom de service (postgres:5432, redis:6379).
- Secrets : Aucun secret en dur ; tout via .env / env_file (NFR10).
Testing Requirements
- Vérifier manuellement ou par script que
docker compose -f docker-compose.dev.yml up(ou équivalent) démarre les quatre services sans erreur. - Vérifier que GET http://localhost:8000/health et http://localhost:3000 retournent des réponses valides.
- Vérifier qu’un changement dans un fichier backend ou frontend déclenche un rechargement (hot reload) sans redémarrage manuel des conteneurs.
- Optionnel : test d’intégration ou script E2E qui lance le stack et appelle /health (à placer dans scripts/ ou tests/ si souhaité).
Dev Agent Record
Agent Model Used
{{agent_model_name_version}}
Debug Log References
Completion Notes List
- docker-compose.dev.yml réécrit en fichier autonome : 4 services (postgres, redis, backend, frontend), réseau translate-network, volumes dédiés dev (postgres_data_dev, redis_data_dev, backend_venv, frontend_node_modules, frontend_next). Commande documentée :
docker compose -f docker-compose.dev.yml up(ou docker-compose). - Backend : build target builder, mount .:/app + volume backend_venv pour /opt/venv, command uvicorn main:app --reload, env_file .env, DATABASE_URL et REDIS_URL définis pour postgres/redis par nom de service, depends_on postgres/redis condition service_healthy.
- Frontend : build target builder, mount ./frontend:/app + volumes node_modules et .next, command npm run dev, env_file .env, NEXT_PUBLIC_API_URL=http://localhost:8000.
- PostgreSQL 16-alpine et Redis 7-alpine avec healthchecks ; backend attend leur santé avant démarrage.
- .env.example : bloc « Docker Compose (dev) » ajouté en tête (commande, variables optionnelles POSTGRES_*, NEXT_PUBLIC_API_URL, variables requises backend).
- scripts/verify-dev-compose.sh : script de vérification (fichier présent, YAML si PyYAML dispo, docker compose config si disponible). Pas de Docker dans l’environnement d’exécution ; validation manuelle à faire par le dev avec
docker compose -f docker-compose.dev.yml up. - Code review (AI) – correctifs appliqués : (1) scripts/verify-dev-compose.sh ajouté à git. (2) Script renforcé : vérification des 4 services requis (postgres, redis, backend, frontend), chemin passé en argument au Python (pas d’interpolation dans la chaîne). (3) docker-compose.dev.yml : Redis healthcheck start_period: 5s ; backend healthcheck (Python urllib) ; frontend depends_on backend avec condition: service_healthy. (4) File List complétée avec mention des fichiers modifiés hors scope 6-1.
File List
- docker-compose.dev.yml (modifié — réécrit complet ; après revue : healthcheck Redis start_period, healthcheck backend, frontend depends_on backend condition service_healthy)
- .env.example (modifié — section Docker Compose dev)
- scripts/verify-dev-compose.sh (nouveau ; ajouté à git après revue ; validation des 4 services requises, chemin passé en argument Python)
- _bmad-output/implementation-artifacts/6-1-docker-compose-development.md (modifié — statut, tâches, Dev Agent Record)
- _bmad-output/implementation-artifacts/sprint-status.yaml (modifié — 6-1 in-progress puis review)
Fichiers modifiés dans le dépôt mais hors périmètre 6-1 (documentés pour traçabilité revue) : .env.production, alembic/env.py