# docker-compose.yml (生产环境) version: '3.8' services: # ========== 反向代理 ========== caddy: image: caddy:2-alpine ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile - caddy_data:/data depends_on: - gateway restart: unless-stopped # ========== 后端服务 ========== gateway: build: ./backend/gateway environment: GATEWAY_PORT: "8080" ENV: production JWT_SECRET: ${JWT_SECRET} JWT_EXPIRY_HOURS: "720" AI_CORE_URL: http://ai-core:8081 POSTGRES_HOST: postgres POSTGRES_PORT: "5432" POSTGRES_USER: ${POSTGRES_USER:-cyrene} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB:-cyrene_ai} REDIS_HOST: redis REDIS_PORT: "6379" REDIS_PASSWORD: ${REDIS_PASSWORD:-} depends_on: postgres: condition: service_healthy redis: condition: service_healthy restart: unless-stopped ai-core: build: ./backend/ai-core environment: AI_CORE_PORT: "8081" PERSONA_DIR: "./internal/persona" LLM_API_URL: ${LLM_API_URL} LLM_API_KEY: ${LLM_API_KEY} LLM_MODEL: ${LLM_MODEL:-gpt-4o} LLM_FALLBACK_MODEL: ${LLM_FALLBACK_MODEL:-gpt-4o-mini} POSTGRES_HOST: postgres POSTGRES_PORT: "5432" POSTGRES_USER: ${POSTGRES_USER:-cyrene} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB:-cyrene_ai} depends_on: postgres: condition: service_healthy restart: unless-stopped # ========== 基础设施 ========== postgres: image: pgvector/pgvector:pg16 volumes: - pg_data:/var/lib/postgresql/data environment: POSTGRES_USER: ${POSTGRES_USER:-cyrene} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB:-cyrene_ai} healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-cyrene} -d ${POSTGRES_DB:-cyrene_ai}"] interval: 10s timeout: 3s retries: 5 restart: unless-stopped redis: image: redis:7-alpine volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 5 restart: unless-stopped qdrant: image: qdrant/qdrant:latest volumes: - qdrant_data:/qdrant/storage restart: unless-stopped minio: image: minio/minio:latest command: server /data environment: MINIO_ROOT_USER: ${MINIO_ACCESS_KEY} MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY} volumes: - minio_data:/data restart: unless-stopped volumes: caddy_data: pg_data: redis_data: qdrant_data: minio_data: