Files
012-kaopeilian/deploy/docker/docker-compose.prod-multi.yml
yuliang_guo 4f6654d864 feat: 新增崔曦文(cxw)租户配置
- 添加 Nginx 配置 cxw.conf
- 添加 docker-compose 容器配置(frontend/backend/redis)
- 添加 .env.cxw 环境配置
- 端口分配: 前端3016, 后端8016, Redis 6396
2026-01-27 10:37:55 +08:00

568 lines
16 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.
# 多客户生产环境 Docker Compose 配置
# 共享MySQL实例独立前端/后端/Redis容器
#
# 重要说明:
# - 所有租户前端共享同一个 dist 目录: /root/aiedu/kaopeilian-frontend/dist
# - 编译一次前端,所有租户自动更新(无需重新构建镜像)
# - 更新前端步骤cd /root/aiedu/kaopeilian-frontend && npm run build
# - 后端API地址由nginx反向代理根据域名自动路由前端无需区分
#
name: prod-multi
services:
# ============================================
# 共享MySQL数据库服务
# ============================================
prod-mysql:
image: mysql:8.0.43
container_name: prod-mysql
restart: unless-stopped
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: ProdMySQL2025!@#
MYSQL_CHARACTER_SET_SERVER: utf8mb4
MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci
ports:
- "3309:3306"
volumes:
- /data/mysql-data:/var/lib/mysql
- ./kaopeilian-backend/mysql.cnf:/etc/mysql/conf.d/mysql.cnf:ro
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
command: --default-authentication-plugin=mysql_native_password
networks:
- prod-network
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-pProdMySQL2025!@#"]
timeout: 20s
retries: 10
start_period: 30s
# ============================================
# 华尔倍丽 (hua.ireborn.com.cn)
# ============================================
hua-frontend:
# 使用共享的前端镜像挂载统一的dist目录
image: kaopeilian-frontend:shared
container_name: hua-frontend
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
ports:
- "3010:80"
volumes:
- /root/aiedu/kaopeilian-frontend/dist:/usr/share/nginx/html:ro
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
networks:
- prod-network
- kaopeilian-network
depends_on:
- hua-backend
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
hua-backend:
build:
context: ./kaopeilian-backend
dockerfile: Dockerfile
image: prod-multi-hua-backend:latest
container_name: hua-backend
restart: unless-stopped
env_file:
- ./kaopeilian-backend/.env.hua
environment:
- TZ=Asia/Shanghai
- PYTHONPATH=/app
ports:
- "8010:8000"
volumes:
- ./kaopeilian-backend/app:/app/app # 代码热重载
- /data/prod-envs/uploads-hua:/app/uploads
- /data/prod-envs/logs-hua:/app/logs
- /data/prod-envs/secrets:/app/secrets:ro
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
command: ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
networks:
- prod-network
- kaopeilian-network
depends_on:
prod-mysql:
condition: service_healthy
hua-redis:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
hua-redis:
image: redis:7.2-alpine
container_name: hua-redis
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
ports:
- "6390:6379"
volumes:
- /data/redis-data/hua:/data
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
networks:
- prod-network
command: redis-server --appendonly yes --maxmemory 128mb --maxmemory-policy allkeys-lru
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 3s
retries: 3
# ============================================
# 杨扬宠物 (yy.ireborn.com.cn)
# ============================================
yy-frontend:
# 使用共享的前端镜像挂载统一的dist目录
image: kaopeilian-frontend:shared
container_name: yy-frontend
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
ports:
- "3011:80"
volumes:
- /root/aiedu/kaopeilian-frontend/dist:/usr/share/nginx/html:ro
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
networks:
- prod-network
- kaopeilian-network
depends_on:
- yy-backend
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
yy-backend:
build:
context: ./kaopeilian-backend
dockerfile: Dockerfile
image: prod-multi-yy-backend:latest
container_name: yy-backend
restart: unless-stopped
env_file:
- ./kaopeilian-backend/.env.yy
environment:
- TZ=Asia/Shanghai
- PYTHONPATH=/app
ports:
- "8011:8000"
volumes:
- ./kaopeilian-backend/app:/app/app # 代码热重载
- /data/prod-envs/uploads-yy:/app/uploads
- /data/prod-envs/logs-yy:/app/logs
- /data/prod-envs/secrets:/app/secrets:ro
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
command: ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
networks:
- prod-network
- kaopeilian-network
depends_on:
prod-mysql:
condition: service_healthy
yy-redis:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
yy-redis:
image: redis:7.2-alpine
container_name: yy-redis
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
ports:
- "6391:6379"
volumes:
- /data/redis-data/yy:/data
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
networks:
- prod-network
command: redis-server --appendonly yes --maxmemory 128mb --maxmemory-policy allkeys-lru
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 3s
retries: 3
# ============================================
# 武汉禾丽 (hl.ireborn.com.cn)
# ============================================
hl-frontend:
# 使用共享的前端镜像挂载统一的dist目录
image: kaopeilian-frontend:shared
container_name: hl-frontend
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
ports:
- "3012:80"
volumes:
- /root/aiedu/kaopeilian-frontend/dist:/usr/share/nginx/html:ro
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
networks:
- prod-network
- kaopeilian-network
depends_on:
- hl-backend
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
hl-backend:
build:
context: ./kaopeilian-backend
dockerfile: Dockerfile
image: prod-multi-hl-backend:latest
container_name: hl-backend
restart: unless-stopped
env_file:
- ./kaopeilian-backend/.env.hl
environment:
- TZ=Asia/Shanghai
- PYTHONPATH=/app
ports:
- "8012:8000"
volumes:
- ./kaopeilian-backend/app:/app/app # 代码热重载
- /data/prod-envs/uploads-hl:/app/uploads
- /data/prod-envs/logs-hl:/app/logs
- /data/prod-envs/secrets:/app/secrets:ro
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
command: ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
networks:
- prod-network
- kaopeilian-network
depends_on:
prod-mysql:
condition: service_healthy
hl-redis:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
hl-redis:
image: redis:7.2-alpine
container_name: hl-redis
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
ports:
- "6392:6379"
volumes:
- /data/redis-data/hl:/data
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
networks:
- prod-network
command: redis-server --appendonly yes --maxmemory 128mb --maxmemory-policy allkeys-lru
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 3s
retries: 3
# ============================================
# 芯颜定制 (xy.ireborn.com.cn)
# ============================================
xy-frontend:
# 使用共享的前端镜像挂载统一的dist目录
image: kaopeilian-frontend:shared
container_name: xy-frontend
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
ports:
- "3013:80"
volumes:
- /root/aiedu/kaopeilian-frontend/dist:/usr/share/nginx/html:ro
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
networks:
- prod-network
- kaopeilian-network
depends_on:
- xy-backend
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
xy-backend:
build:
context: ./kaopeilian-backend
dockerfile: Dockerfile
image: prod-multi-xy-backend:latest
container_name: xy-backend
restart: unless-stopped
env_file:
- ./kaopeilian-backend/.env.xy
environment:
- TZ=Asia/Shanghai
- PYTHONPATH=/app
ports:
- "8013:8000"
volumes:
- ./kaopeilian-backend/app:/app/app # 代码热重载
- /data/prod-envs/uploads-xy:/app/uploads
- /data/prod-envs/logs-xy:/app/logs
- /data/prod-envs/secrets:/app/secrets:ro
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
command: ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
networks:
- prod-network
- kaopeilian-network
depends_on:
prod-mysql:
condition: service_healthy
xy-redis:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
xy-redis:
image: redis:7.2-alpine
container_name: xy-redis
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
ports:
- "6393:6379"
volumes:
- /data/redis-data/xy:/data
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
networks:
- prod-network
command: redis-server --appendonly yes --maxmemory 128mb --maxmemory-policy allkeys-lru
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 3s
retries: 3
# ============================================
# 飞沃 (fw.ireborn.com.cn)
# ============================================
fw-frontend:
# 使用共享的前端镜像挂载统一的dist目录
# 这样只需编译一次前端,所有租户自动更新
image: kaopeilian-frontend:shared
container_name: fw-frontend
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
ports:
- "3014:80"
volumes:
- /root/aiedu/kaopeilian-frontend/dist:/usr/share/nginx/html:ro
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
networks:
- prod-network
- kaopeilian-network
depends_on:
- fw-backend
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
fw-backend:
build:
context: ./kaopeilian-backend
dockerfile: Dockerfile
image: prod-multi-fw-backend:latest
container_name: fw-backend
restart: unless-stopped
env_file:
- ./kaopeilian-backend/.env.fw
environment:
- TZ=Asia/Shanghai
- PYTHONPATH=/app
ports:
- "8014:8000"
volumes:
- ./kaopeilian-backend/app:/app/app # 代码热重载
- /data/prod-envs/uploads-fw:/app/uploads
- /data/prod-envs/logs-fw:/app/logs
- /data/prod-envs/secrets:/app/secrets:ro
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
command: ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
networks:
- prod-network
- kaopeilian-network
depends_on:
prod-mysql:
condition: service_healthy
fw-redis:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
fw-redis:
image: redis:7.2-alpine
container_name: fw-redis
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
ports:
- "6394:6379"
volumes:
- /data/redis-data/fw:/data
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
networks:
- prod-network
command: redis-server --appendonly yes --maxmemory 128mb --maxmemory-policy allkeys-lru
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 3s
retries: 3
# ============================================
# 崔曦文 (cxw.ireborn.com.cn)
# ============================================
cxw-frontend:
image: kaopeilian-frontend:shared
container_name: cxw-frontend
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
ports:
- "3016:80"
volumes:
- /root/aiedu/kaopeilian-frontend/dist:/usr/share/nginx/html:ro
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
networks:
- prod-network
- kaopeilian-network
depends_on:
- cxw-backend
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
cxw-backend:
build:
context: ./kaopeilian-backend
dockerfile: Dockerfile
image: prod-multi-cxw-backend:latest
container_name: cxw-backend
restart: unless-stopped
env_file:
- ./kaopeilian-backend/.env.cxw
environment:
- TZ=Asia/Shanghai
- PYTHONPATH=/app
ports:
- "8016:8000"
volumes:
- ./kaopeilian-backend/app:/app/app
- /data/prod-envs/uploads-cxw:/app/uploads
- /data/prod-envs/logs-cxw:/app/logs
- /data/prod-envs/secrets:/app/secrets:ro
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
command: ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
networks:
- prod-network
- kaopeilian-network
depends_on:
prod-mysql:
condition: service_healthy
cxw-redis:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
cxw-redis:
image: redis:7.2-alpine
container_name: cxw-redis
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
ports:
- "6396:6379"
volumes:
- /data/redis-data/cxw:/data
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
networks:
- prod-network
command: redis-server --appendonly yes --maxmemory 128mb --maxmemory-policy allkeys-lru
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 3s
retries: 3
# 网络配置
networks:
prod-network:
driver: bridge
name: prod-network
kaopeilian-network:
external: true
name: kaopeilian-network