# Déploiement production — stack complète (app + db + redis + nginx) # Usage : docker compose -f docker-compose.prod.yml up -d services: app: build: context: . dockerfile: docker/Dockerfile container_name: mesreleves_app restart: unless-stopped environment: APP_ENV: production APP_KEY: ${APP_KEY} DB_CONNECTION: pgsql DB_HOST: db DB_PORT: 5432 DB_DATABASE: ${DB_DATABASE:-mesreleves} DB_USERNAME: ${DB_USERNAME:-mesreleves} DB_PASSWORD: ${DB_PASSWORD} CACHE_STORE: redis SESSION_DRIVER: redis QUEUE_CONNECTION: redis REDIS_HOST: redis depends_on: db: condition: service_healthy redis: condition: service_started volumes: # Le code est monté depuis l'hôte : les mises à jour ne nécessitent pas de rebuild image - .:/var/www/html # Le storage est un volume nommé (uploads, logs, sessions — persisté indépendamment du code) - app_storage:/var/www/html/storage networks: - internal nginx: image: nginx:alpine container_name: mesreleves_nginx restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./docker/nginx.conf:/etc/nginx/conf.d/default.conf:ro - ./public:/var/www/html/public:ro - app_storage:/var/www/html/storage:ro depends_on: - app networks: - internal db: image: postgres:18-alpine container_name: mesreleves_db restart: unless-stopped environment: POSTGRES_DB: ${DB_DATABASE:-mesreleves} POSTGRES_USER: ${DB_USERNAME:-mesreleves} POSTGRES_PASSWORD: ${DB_PASSWORD} volumes: - pgdata:/var/lib/postgresql healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USERNAME:-mesreleves}"] interval: 10s timeout: 5s retries: 5 networks: - internal redis: image: redis:7-alpine container_name: mesreleves_redis restart: unless-stopped volumes: - redisdata:/data networks: - internal volumes: pgdata: redisdata: app_storage: networks: internal: driver: bridge