iconsulting/docker-compose.yml

345 lines
10 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#===============================================================================
# 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
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
# 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
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