320 lines
9.5 KiB
YAML
320 lines
9.5 KiB
YAML
#===============================================================================
|
||
# 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
|