iconsulting/docker-compose.yml

431 lines
13 KiB
YAML

#===============================================================================
# iConsulting Docker Compose 配置
#
# 服务架构:
# - 基础设施: PostgreSQL, Redis, Neo4j, MinIO
# - API网关: Kong
# - 后端服务: conversation, user, payment, knowledge, evolution, file
# - 前端服务: 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
minio:
image: minio/minio:latest
container_name: iconsulting-minio
restart: unless-stopped
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin123}
ports:
- "9000:9000" # API
- "9001:9001" # Console
volumes:
- minio_data:/data
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
networks:
- iconsulting-network
minio-init:
image: minio/mc:latest
container_name: iconsulting-minio-init
depends_on:
minio:
condition: service_healthy
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin123}
volumes:
- ./infrastructure/minio/init-buckets.sh:/init-buckets.sh:ro
entrypoint: ["/bin/sh", "/init-buckets.sh"]
networks:
- iconsulting-network
#=============================================================================
# Kong API 网关 (DB-less 模式)
#=============================================================================
kong:
image: kong:3.4
container_name: iconsulting-kong
restart: unless-stopped
environment:
KONG_DATABASE: "off"
KONG_DECLARATIVE_CONFIG: /etc/kong/kong.yml
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
volumes:
- ./kong/kong.yml:/etc/kong/kong.yml:ro
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"
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:3001/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
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"
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:3002/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
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"
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:3003/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
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"
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:3004/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
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"
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:3005/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
networks:
- iconsulting-network
file-service:
build:
context: .
dockerfile: packages/services/file-service/Dockerfile
container_name: iconsulting-file
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
minio:
condition: service_healthy
environment:
NODE_ENV: production
PORT: 3006
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
MINIO_ENDPOINT: minio
MINIO_PORT: 9000
MINIO_ACCESS_KEY: ${MINIO_ROOT_USER:-minioadmin}
MINIO_SECRET_KEY: ${MINIO_ROOT_PASSWORD:-minioadmin123}
MINIO_BUCKET: iconsulting
MINIO_USE_SSL: "false"
ports:
- "3006:3006"
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:3006/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
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://127.0.0.1/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
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
minio_data:
driver: local