services: # Redis 服務 (Celery 後端和緩存) redis: image: panjit-translator:redis build: context: . dockerfile: Dockerfile.redis container_name: panjit-translator-redis-prod volumes: - redis_data:/data restart: unless-stopped command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru networks: - panjit-translator-network deploy: resources: limits: memory: 512M reservations: memory: 256M # 主應用服務 app: image: panjit-translator:main build: context: . dockerfile: Dockerfile container_name: translator-app-prod environment: - FLASK_ENV=production - LOG_LEVEL=INFO - WEBSOCKET_ENABLED=false volumes: - ./uploads:/app/uploads - ./cache:/app/cache - ./logs:/app/logs depends_on: - redis restart: unless-stopped networks: - panjit-translator-network deploy: resources: limits: memory: 2G reservations: memory: 1G healthcheck: test: ["CMD", "curl", "-f", "http://localhost:12010/api/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s # Celery Worker 服務 celery-worker: image: panjit-translator:main container_name: panjit-translator-worker-prod command: celery -A celery_app worker --loglevel=info --concurrency=4 --max-tasks-per-child=1000 environment: - FLASK_ENV=production - LOG_LEVEL=INFO - CELERY_WORKER_CONCURRENCY=4 - CELERY_WORKER_MAX_TASKS_PER_CHILD=1000 volumes: - ./uploads:/app/uploads - ./cache:/app/cache - ./logs:/app/logs depends_on: - redis - app restart: unless-stopped networks: - panjit-translator-network deploy: resources: limits: memory: 3G reservations: memory: 1.5G healthcheck: test: ["CMD", "celery", "-A", "celery_app", "inspect", "ping"] interval: 60s timeout: 30s retries: 3 start_period: 60s # Celery Beat 服務 (定時任務) celery-beat: image: panjit-translator:main container_name: panjit-translator-beat-prod command: celery -A celery_app beat --loglevel=info environment: - FLASK_ENV=production - LOG_LEVEL=INFO volumes: - ./uploads:/app/uploads - ./cache:/app/cache - ./logs:/app/logs depends_on: - redis - app restart: unless-stopped networks: - panjit-translator-network deploy: resources: limits: memory: 512M reservations: memory: 256M healthcheck: test: ["CMD", "sh", "-c", "ps aux | grep 'celery.*beat' | grep -v grep"] interval: 60s timeout: 10s retries: 3 start_period: 30s # Nginx 反向代理 nginx: image: panjit-translator:nginx build: context: . dockerfile: Dockerfile.nginx container_name: panjit-translator-nginx-prod ports: - "12010:12010" depends_on: - app restart: unless-stopped networks: - panjit-translator-network deploy: resources: limits: memory: 256M reservations: memory: 128M healthcheck: test: ["CMD", "curl", "-f", "http://localhost:12010/api/health"] interval: 30s timeout: 10s retries: 3 start_period: 20s volumes: redis_data: driver: local networks: panjit-translator-network: driver: bridge