services: # ── Base de données PostgreSQL ────────────────────────── db: image: postgres:16-alpine restart: always volumes: - postgres_data:/var/lib/postgresql/data env_file: .env.prod healthcheck: test: ["CMD-SHELL", "pg_isready"] interval: 10s timeout: 5s retries: 5 # ── Application Django (Gunicorn) ─────────────────────── web: build: . restart: always env_file: .env.prod volumes: - static_volume:/app/staticfiles - media_volume:/app/media depends_on: db: condition: service_healthy command: > sh -c "python manage.py migrate --noinput && gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers 3 --timeout 60 --access-logfile - --error-logfile -" # ── Nginx (reverse proxy + static files) ─────────────── nginx: image: nginx:alpine restart: always ports: - "80:80" - "443:443" volumes: - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro - static_volume:/app/staticfiles:ro - media_volume:/app/media:ro - certbot_www:/var/www/certbot:ro - certbot_certs:/etc/letsencrypt:ro depends_on: - web # ── Certbot (SSL Let's Encrypt) ───────────────────────── certbot: image: certbot/certbot volumes: - certbot_www:/var/www/certbot - certbot_certs:/etc/letsencrypt entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'" volumes: postgres_data: static_volume: media_volume: certbot_www: certbot_certs: