version: '3.8' services: # ============================================== # 前端服务 (C端用户 App) # ============================================== frontend: build: context: ./frontend dockerfile: Dockerfile container_name: dreamweaver_frontend restart: always ports: - "52080:80" # User App UI depends_on: - backend # ============================================== # 管理后台前端 (Admin Console) # ============================================== frontend-admin: build: context: ./admin-frontend dockerfile: Dockerfile container_name: dreamweaver_frontend_admin restart: always ports: - "52888:80" # Admin Console UI depends_on: - backend-admin # ============================================== # 后端服务 (FastAPI) # ============================================== backend: build: context: ./backend dockerfile: Dockerfile container_name: dreamweaver_backend restart: always ports: - "52000:8000" # User App API 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: build: context: ./backend dockerfile: Dockerfile container_name: dreamweaver_backend_admin restart: always ports: - "52800:8001" # Admin API command: ["uvicorn", "app.admin_main:app", "--host", "0.0.0.0", "--port", "8001"] env_file: - ./backend/.env environment: # 复用相同的 DB/Redis 连接 - 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) # ============================================== # ============================================== # 工作节点 (Celery Worker) # ============================================== worker: build: context: ./backend 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: - backend - redis # ============================================== # 调度节点 (Celery Beat) # ============================================== celery-beat: build: context: ./backend 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: - backend - redis # ============================================== # 数据库 (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" # DB Host Port 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" # Redis Host Port volumes: - redis_data:/data command: redis-server --appendonly yes # ============================================== # 数据库管理 (Adminer) # ============================================== adminer: image: adminer container_name: dreamweaver_adminer restart: always ports: - "52999:8080" # Adminer UI depends_on: - db volumes: postgres_data: redis_data: backend_static: