version: "3.8" # 天工智能体平台 — 生产环境 Docker Compose # 启动: docker compose -f docker-compose.prod.yml up -d # 停止: docker compose -f docker-compose.prod.yml down services: # ─── MySQL ─────────────────────────────────────────────────── mysql: image: mysql:8.0 container_name: aiagent-mysql restart: always environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-change-me} MYSQL_DATABASE: agent_db MYSQL_CHARSET: utf8mb4 MYSQL_COLLATION: utf8mb4_unicode_ci ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql - ./backend/init.sql:/docker-entrypoint-initdb.d/init.sql:ro healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 5 start_period: 30s networks: - aiagent-net # ─── Redis ─────────────────────────────────────────────────── redis: image: redis:7-alpine container_name: aiagent-redis restart: always command: redis-server --appendonly yes --maxmemory 512mb --maxmemory-policy allkeys-lru ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 5 networks: - aiagent-net # ─── FastAPI 后端 ──────────────────────────────────────────── backend: build: context: ./backend dockerfile: Dockerfile container_name: aiagent-backend restart: always environment: - DATABASE_URL=mysql+pymysql://root:${MYSQL_ROOT_PASSWORD:-change-me}@mysql:3306/agent_db?charset=utf8mb4 - REDIS_URL=redis://redis:6379/0 - JWT_SECRET_KEY=${JWT_SECRET_KEY:-prod-jwt-secret-change-me} - SECRET_KEY=${SECRET_KEY:-prod-secret-change-me} - CORS_ORIGINS=${CORS_ORIGINS:-http://localhost:8038,http://localhost:3000} - OPENAI_API_KEY=${OPENAI_API_KEY:-} - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY:-} - EXTERNAL_URL=${EXTERNAL_URL:-http://localhost} ports: - "8037:8037" depends_on: mysql: condition: service_healthy redis: condition: service_healthy volumes: - agent_workspaces:/app/agent_workspaces - uploads:/app/uploads - logs:/app/logs healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8037/docs"] interval: 30s timeout: 10s retries: 3 networks: - aiagent-net # ─── Celery Worker ─────────────────────────────────────────── celery-worker: build: context: ./backend dockerfile: Dockerfile container_name: aiagent-celery-worker restart: always command: celery -A app.core.celery_app worker --loglevel=info --concurrency=4 environment: - DATABASE_URL=mysql+pymysql://root:${MYSQL_ROOT_PASSWORD:-change-me}@mysql:3306/agent_db?charset=utf8mb4 - REDIS_URL=redis://redis:6379/0 - JWT_SECRET_KEY=${JWT_SECRET_KEY:-prod-jwt-secret-change-me} - SECRET_KEY=${SECRET_KEY:-prod-secret-change-me} - OPENAI_API_KEY=${OPENAI_API_KEY:-} - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY:-} depends_on: mysql: condition: service_healthy redis: condition: service_healthy volumes: - agent_workspaces:/app/agent_workspaces - uploads:/app/uploads - logs:/app/logs networks: - aiagent-net # ─── Celery Beat (定时调度) ────────────────────────────────── celery-beat: build: context: ./backend dockerfile: Dockerfile container_name: aiagent-celery-beat restart: always command: celery -A app.core.celery_app beat --loglevel=info environment: - DATABASE_URL=mysql+pymysql://root:${MYSQL_ROOT_PASSWORD:-change-me}@mysql:3306/agent_db?charset=utf8mb4 - REDIS_URL=redis://redis:6379/0 - JWT_SECRET_KEY=${JWT_SECRET_KEY:-prod-jwt-secret-change-me} - SECRET_KEY=${SECRET_KEY:-prod-secret-change-me} depends_on: mysql: condition: service_healthy redis: condition: service_healthy networks: - aiagent-net # ─── 前端 (Nginx) ─────────────────────────────────────────── frontend: build: context: ./frontend dockerfile: Dockerfile container_name: aiagent-frontend restart: always ports: - "8038:80" depends_on: - backend networks: - aiagent-net volumes: mysql_data: driver: local redis_data: driver: local agent_workspaces: driver: local uploads: driver: local logs: driver: local networks: aiagent-net: driver: bridge