#=============================================================================== # iConsulting Docker Compose 配置 # # 服务架构: # - 基础设施: PostgreSQL, Redis, Neo4j # - API网关: Kong # - 后端服务: conversation, user, payment, knowledge, evolution # - 前端服务: nginx (托管 web-client 和 admin-client) # # 网络配置: # - 对外网卡: 14.215.128.96 (用户访问) # - 出口网卡: 154.84.135.121 (Claude API 调用) # #=============================================================================== # version 属性已弃用,移除以避免警告 services: #============================================================================= # 基础设施服务 #============================================================================= postgres: image: postgres:15-alpine container_name: iconsulting-postgres restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} POSTGRES_DB: ${POSTGRES_DB:-iconsulting} ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./scripts/init-db.sql:/docker-entrypoint-initdb.d/init.sql:ro healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5 networks: - iconsulting-network redis: image: redis:7-alpine container_name: iconsulting-redis restart: unless-stopped command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD:-redis123} ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 networks: - iconsulting-network neo4j: image: neo4j:5-community container_name: iconsulting-neo4j restart: unless-stopped environment: NEO4J_AUTH: ${NEO4J_USER:-neo4j}/${NEO4J_PASSWORD:-neo4j123} NEO4J_PLUGINS: '["apoc"]' NEO4J_dbms_memory_heap_max__size: 1G ports: - "7474:7474" # HTTP - "7687:7687" # Bolt volumes: - neo4j_data:/data - neo4j_logs:/logs healthcheck: test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:7474 || exit 1"] interval: 10s timeout: 5s retries: 5 networks: - iconsulting-network #============================================================================= # Kong API 网关 #============================================================================= kong-database: image: postgres:15-alpine container_name: iconsulting-kong-db restart: unless-stopped environment: POSTGRES_USER: kong POSTGRES_PASSWORD: kong POSTGRES_DB: kong volumes: - kong_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U kong"] interval: 10s timeout: 5s retries: 5 networks: - iconsulting-network kong: image: kong:3.4 container_name: iconsulting-kong restart: unless-stopped depends_on: kong-database: condition: service_healthy environment: KONG_DATABASE: postgres KONG_PG_HOST: kong-database KONG_PG_USER: kong KONG_PG_PASSWORD: kong KONG_PG_DATABASE: kong KONG_PROXY_ACCESS_LOG: /dev/stdout KONG_ADMIN_ACCESS_LOG: /dev/stdout KONG_PROXY_ERROR_LOG: /dev/stderr KONG_ADMIN_ERROR_LOG: /dev/stderr KONG_ADMIN_LISTEN: 0.0.0.0:8001 KONG_PROXY_LISTEN: 0.0.0.0:8000, 0.0.0.0:8443 ssl ports: - "8000:8000" # Proxy - "8443:8443" # Proxy SSL - "8001:8001" # Admin API healthcheck: test: ["CMD", "kong", "health"] interval: 10s timeout: 5s retries: 5 networks: - iconsulting-network #============================================================================= # 后端微服务 #============================================================================= user-service: build: context: . dockerfile: packages/services/user-service/Dockerfile container_name: iconsulting-user restart: unless-stopped depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: NODE_ENV: production PORT: 3001 DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-iconsulting} REDIS_URL: redis://:${REDIS_PASSWORD:-redis123}@redis:6379 JWT_SECRET: ${JWT_SECRET:-your-jwt-secret-key} JWT_EXPIRES_IN: ${JWT_EXPIRES_IN:-7d} ports: - "3001:3001" networks: - iconsulting-network payment-service: build: context: . dockerfile: packages/services/payment-service/Dockerfile container_name: iconsulting-payment restart: unless-stopped depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: NODE_ENV: production PORT: 3002 DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-iconsulting} REDIS_URL: redis://:${REDIS_PASSWORD:-redis123}@redis:6379 ALIPAY_APP_ID: ${ALIPAY_APP_ID} ALIPAY_PRIVATE_KEY: ${ALIPAY_PRIVATE_KEY} WECHAT_APP_ID: ${WECHAT_APP_ID} WECHAT_MCH_ID: ${WECHAT_MCH_ID} WECHAT_API_KEY: ${WECHAT_API_KEY} STRIPE_SECRET_KEY: ${STRIPE_SECRET_KEY} ports: - "3002:3002" networks: - iconsulting-network knowledge-service: build: context: . dockerfile: packages/services/knowledge-service/Dockerfile container_name: iconsulting-knowledge restart: unless-stopped depends_on: postgres: condition: service_healthy redis: condition: service_healthy neo4j: condition: service_healthy environment: NODE_ENV: production PORT: 3003 DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-iconsulting} REDIS_URL: redis://:${REDIS_PASSWORD:-redis123}@redis:6379 NEO4J_URI: bolt://neo4j:7687 NEO4J_USER: ${NEO4J_USER:-neo4j} NEO4J_PASSWORD: ${NEO4J_PASSWORD:-neo4j123} OPENAI_API_KEY: ${OPENAI_API_KEY} ports: - "3003:3003" networks: - iconsulting-network conversation-service: build: context: . dockerfile: packages/services/conversation-service/Dockerfile container_name: iconsulting-conversation restart: unless-stopped depends_on: postgres: condition: service_healthy redis: condition: service_healthy knowledge-service: condition: service_started environment: NODE_ENV: production PORT: 3004 DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-iconsulting} REDIS_URL: redis://:${REDIS_PASSWORD:-redis123}@redis:6379 ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY} ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL:-https://api.anthropic.com} KNOWLEDGE_SERVICE_URL: http://knowledge-service:3003 # Claude API 出口配置 (如需指定出口IP,在宿主机配置路由) ports: - "3004:3004" networks: - iconsulting-network evolution-service: build: context: . dockerfile: packages/services/evolution-service/Dockerfile container_name: iconsulting-evolution restart: unless-stopped depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: NODE_ENV: production PORT: 3005 DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/${POSTGRES_DB:-iconsulting} REDIS_URL: redis://:${REDIS_PASSWORD:-redis123}@redis:6379 ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY} ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL:-https://api.anthropic.com} ports: - "3005:3005" networks: - iconsulting-network #============================================================================= # 前端 Nginx #============================================================================= nginx: image: nginx:alpine container_name: iconsulting-nginx restart: unless-stopped depends_on: - kong ports: - "80:80" - "443:443" volumes: - ./packages/web-client/dist:/usr/share/nginx/html/web:ro - ./packages/admin-client/dist:/usr/share/nginx/html/admin:ro - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./nginx/conf.d:/etc/nginx/conf.d:ro - ./nginx/ssl:/etc/nginx/ssl:ro healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost/health"] interval: 10s timeout: 5s retries: 3 networks: - iconsulting-network #=============================================================================== # 网络配置 #=============================================================================== networks: iconsulting-network: driver: bridge ipam: config: - subnet: 172.20.0.0/16 #=============================================================================== # 数据卷 #=============================================================================== volumes: postgres_data: driver: local redis_data: driver: local neo4j_data: driver: local neo4j_logs: driver: local kong_data: driver: local