services: reverse-proxy: image: nginx:1.27-alpine volumes: - ./deploy/nginx/server-panel.conf:/etc/nginx/conf.d/default.conf:ro ports: - "80:80" depends_on: - frontend - backend restart: unless-stopped backend: build: context: ./backend env_file: - ${SERVER_PANEL_ENV_FILE:-.env.production} environment: ACTION_EXECUTION_MODE: worker depends_on: postgres: condition: service_healthy redis: condition: service_healthy restart: unless-stopped worker: build: context: ./backend command: ["python", "-m", "app.worker"] env_file: - ${SERVER_PANEL_ENV_FILE:-.env.production} environment: ACTION_EXECUTION_MODE: worker depends_on: postgres: condition: service_healthy redis: condition: service_healthy restart: unless-stopped frontend: build: context: ./frontend dockerfile: Dockerfile.prod args: VITE_API_BASE_URL: ${FRONTEND_PUBLIC_API_BASE_URL:-/api/v1} depends_on: - backend restart: unless-stopped bot: build: context: ./bot env_file: - ${SERVER_PANEL_ENV_FILE:-.env.production} depends_on: - backend restart: unless-stopped postgres: image: postgres:16-alpine environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} healthcheck: test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] interval: 5s timeout: 5s retries: 12 start_period: 5s volumes: - postgres_data:/var/lib/postgresql/data restart: unless-stopped redis: image: redis:7-alpine command: ["redis-server", "--appendonly", "yes"] healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 12 start_period: 2s volumes: - redis_data:/data restart: unless-stopped volumes: postgres_data: redis_data: