# docker-compose.prod.yml # 生产部署配置 - 使用预构建镜像,不包含 build 指令 # 镜像通过 GitHub Actions 或本地 docker build 预先构建 # # 使用方式: # docker compose -f docker-compose.prod.yml up -d # # 镜像构建 (手动): # docker build -t dreamweaver-backend:latest ./backend # docker build -t dreamweaver-frontend:latest ./frontend # docker build -t dreamweaver-admin-frontend:latest ./admin-frontend services: # ============================================== # 前端服务 (C端用户 App) # ============================================== frontend: image: ${REGISTRY:-}dreamweaver-frontend:${TAG:-latest} container_name: dreamweaver_frontend restart: always ports: - "52080:80" depends_on: - backend # ============================================== # 管理后台前端 (Admin Console) # ============================================== frontend-admin: image: ${REGISTRY:-}dreamweaver-admin-frontend:${TAG:-latest} container_name: dreamweaver_frontend_admin restart: always ports: - "52888:80" depends_on: - backend-admin # ============================================== # 后端服务 (FastAPI) # ============================================== backend: image: ${REGISTRY:-}dreamweaver-backend:${TAG:-latest} container_name: dreamweaver_backend restart: always ports: - "52000:8000" env_file: - ./backend/.env environment: - DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER:-dreamweaver}:${POSTGRES_PASSWORD:-dreamweaver_password}@db:5432/${POSTGRES_DB:-dreamweaver_db} - CELERY_BROKER_URL=redis://redis:6379/0 - CELERY_RESULT_BACKEND=redis://redis:6379/0 volumes: - backend_static:/app/static depends_on: db: condition: service_healthy redis: condition: service_started # ============================================== # 管理后台后端 (Admin Backend) # ============================================== backend-admin: image: ${REGISTRY:-}dreamweaver-backend:${TAG:-latest} container_name: dreamweaver_backend_admin restart: always ports: - "52800:8001" command: ["uvicorn", "app.admin_main:app", "--host", "0.0.0.0", "--port", "8001"] env_file: - ./backend/.env environment: - DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER:-dreamweaver}:${POSTGRES_PASSWORD:-dreamweaver_password}@db:5432/${POSTGRES_DB:-dreamweaver_db} - CELERY_BROKER_URL=redis://redis:6379/0 - CELERY_RESULT_BACKEND=redis://redis:6379/0 volumes: - backend_static:/app/static depends_on: db: condition: service_healthy redis: condition: service_started # ============================================== # 工作节点 (Celery Worker) # ============================================== worker: image: ${REGISTRY:-}dreamweaver-backend:${TAG:-latest} container_name: dreamweaver_worker command: celery -A app.core.celery_app worker --loglevel=info restart: always env_file: ./backend/.env environment: - DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER:-dreamweaver}:${POSTGRES_PASSWORD:-dreamweaver_password}@db:5432/${POSTGRES_DB:-dreamweaver_db} - CELERY_BROKER_URL=redis://redis:6379/0 - CELERY_RESULT_BACKEND=redis://redis:6379/0 depends_on: redis: condition: service_started db: condition: service_healthy # ============================================== # 调度节点 (Celery Beat) # ============================================== celery-beat: image: ${REGISTRY:-}dreamweaver-backend:${TAG:-latest} container_name: dreamweaver_beat command: celery -A app.core.celery_app beat --loglevel=info restart: always env_file: ./backend/.env environment: - DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER:-dreamweaver}:${POSTGRES_PASSWORD:-dreamweaver_password}@db:5432/${POSTGRES_DB:-dreamweaver_db} - CELERY_BROKER_URL=redis://redis:6379/0 - CELERY_RESULT_BACKEND=redis://redis:6379/0 depends_on: redis: condition: service_started # ============================================== # 数据库 (PostgreSQL) # ============================================== db: image: postgres:15-alpine container_name: dreamweaver_db restart: always environment: POSTGRES_USER: ${POSTGRES_USER:-dreamweaver} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-dreamweaver_password} POSTGRES_DB: ${POSTGRES_DB:-dreamweaver_db} ports: - "52432:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-dreamweaver}"] interval: 10s timeout: 5s retries: 5 # ============================================== # 缓存 (Redis) # ============================================== redis: image: redis:7-alpine container_name: dreamweaver_redis restart: always ports: - "52379:6379" volumes: - redis_data:/data command: redis-server --appendonly yes volumes: postgres_data: redis_data: backend_static: