services: caddy: image: caddy:2.10-alpine restart: unless-stopped env_file: - ${APP_ENV_FILE:-.env.prod} ports: - "${APP_PORT:-8088}:80" volumes: - ./deploy/Caddyfile:/etc/caddy/Caddyfile:ro - media_data:/srv/media:ro - static_data:/srv/static:ro depends_on: - web web: build: context: ./backend command: sh -c "./entrypoint-web-prod.sh" restart: unless-stopped env_file: - ${APP_ENV_FILE:-.env.prod} volumes: - media_data:/app/media - static_data:/app/staticfiles - backup_data:/app/backups user: "app" depends_on: - db - redis healthcheck: test: ["CMD-SHELL", "python -c \"import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/healthz/', timeout=5)\""] interval: 20s timeout: 8s retries: 5 start_period: 20s worker: build: context: ./backend command: sh -c "./entrypoint-worker-prod.sh" restart: unless-stopped env_file: - ${APP_ENV_FILE:-.env.prod} volumes: - media_data:/app/media - static_data:/app/staticfiles - backup_data:/app/backups user: "app" depends_on: - db - redis db: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB:-workdock} POSTGRES_USER: ${POSTGRES_USER:-workdock} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-workdock} volumes: - postgres_data:/var/lib/postgresql/data redis: image: redis:7-alpine restart: unless-stopped volumes: postgres_data: media_data: static_data: backup_data: