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 read_only: true tmpfs: - /var/cache/nginx - /var/run healthcheck: test: ["CMD-SHELL", "wget -q -O /dev/null http://127.0.0.1/health/ || exit 1"] interval: 15s timeout: 5s retries: 5 start_period: 10s 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} --access-logfile - --error-logfile - volumes: - .:/app - node_modules_data:/app/node_modules - 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 start_period: 20s restart: unless-stopped tailwind: build: context: . dockerfile: Dockerfile env_file: - .env command: npm run dev volumes: - .:/app - node_modules_data:/app/node_modules 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 start_period: 30s 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 start_period: 20s restart: unless-stopped postgres: image: postgres:16-alpine environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} 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: node_modules_data: