services: nginx: image: nginx:1.27-alpine depends_on: web: condition: service_healthy ports: - "80:80" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - static_data:/var/www/static:ro - media_data:/var/www/media:ro healthcheck: test: ["CMD-SHELL", "wget -q -O /dev/null http://127.0.0.1/health/ || exit 1"] interval: 15s timeout: 5s retries: 5 restart: unless-stopped web: build: context: . dockerfile: Dockerfile env_file: - .env depends_on: postgres: condition: service_healthy redis: condition: service_healthy command: gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers ${GUNICORN_WORKERS:-3} volumes: - .:/app - static_data:/app/staticfiles - media_data:/app/media - runtime_data:/app/runtime expose: - "8000" healthcheck: test: ["CMD-SHELL", "curl -f http://127.0.0.1:8000/health/ || exit 1"] interval: 15s timeout: 5s retries: 8 restart: unless-stopped celery_worker: build: context: . dockerfile: Dockerfile env_file: - .env depends_on: postgres: condition: service_healthy redis: condition: service_healthy command: celery -A config worker -l info volumes: - .:/app - runtime_data:/app/runtime healthcheck: test: ["CMD-SHELL", "celery -A config inspect ping -d celery@$$HOSTNAME | grep -q pong || exit 1"] interval: 30s timeout: 10s retries: 5 restart: unless-stopped celery_beat: build: context: . dockerfile: Dockerfile env_file: - .env depends_on: postgres: condition: service_healthy redis: condition: service_healthy command: celery -A config beat -l info --schedule=/app/runtime/celerybeat-schedule volumes: - .:/app - runtime_data:/app/runtime healthcheck: test: ["CMD-SHELL", "test -f /app/runtime/celerybeat-schedule || exit 1"] interval: 30s timeout: 5s retries: 10 restart: unless-stopped postgres: image: postgres:16-alpine env_file: - .env volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped redis: image: redis:7-alpine command: redis-server --save 60 1 --loglevel warning volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped volumes: postgres_data: static_data: media_data: runtime_data: redis_data: