iconsulting/docker-compose.yml

380 lines
11 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-migrations:
image: kong:3.4
container_name: iconsulting-kong-migrations
command: kong migrations bootstrap
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
networks:
- iconsulting-network
restart: on-failure
kong:
image: kong:3.4
container_name: iconsulting-kong
restart: unless-stopped
depends_on:
kong-database:
condition: service_healthy
kong-migrations:
condition: service_completed_successfully
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
# Kong 配置初始化 - 使用统一的初始化脚本
kong-init:
image: curlimages/curl:latest
container_name: iconsulting-kong-init
depends_on:
kong:
condition: service_healthy
volumes:
- ./scripts/init-kong.sh:/init-kong.sh:ro
environment:
KONG_ADMIN_URL: http://kong:8001
command: ["/bin/sh", "/init-kong.sh"]
networks:
- iconsulting-network
restart: on-failure:3
#=============================================================================
# 后端微服务
#=============================================================================
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
POSTGRES_HOST: postgres
POSTGRES_PORT: 5432
POSTGRES_USER: ${POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
POSTGRES_DB: ${POSTGRES_DB:-iconsulting}
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
POSTGRES_HOST: postgres
POSTGRES_PORT: 5432
POSTGRES_USER: ${POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
POSTGRES_DB: ${POSTGRES_DB:-iconsulting}
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
POSTGRES_HOST: postgres
POSTGRES_PORT: 5432
POSTGRES_USER: ${POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
POSTGRES_DB: ${POSTGRES_DB:-iconsulting}
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
POSTGRES_HOST: postgres
POSTGRES_PORT: 5432
POSTGRES_USER: ${POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
POSTGRES_DB: ${POSTGRES_DB:-iconsulting}
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
CORS_ORIGINS: https://iconsulting.szaiai.com,http://localhost:5173
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
POSTGRES_HOST: postgres
POSTGRES_PORT: 5432
POSTGRES_USER: ${POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
POSTGRES_DB: ${POSTGRES_DB:-iconsulting}
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:
- "8080:80"
- "18443: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