2026-05-19 14:29:57 +08:00
|
|
|
|
# =============================================================================
|
|
|
|
|
|
# XuqmGroup 私有化部署 — 业务服务编排
|
|
|
|
|
|
#
|
|
|
|
|
|
# 说明:
|
|
|
|
|
|
# - 基础设施(MySQL / Redis)在 docker-compose.infra.yml 中定义
|
|
|
|
|
|
# - 使用 --profile 控制启动哪些服务(配合 .env 中的 COMPOSE_PROFILES)
|
|
|
|
|
|
# - 所有服务密码通过 config/secrets.env 注入,不写在本文件
|
|
|
|
|
|
# - Spring Boot 数据库 URL 通过 environment: 覆盖,优先级高于 application.yml
|
|
|
|
|
|
# =============================================================================
|
|
|
|
|
|
|
2026-05-18 19:49:31 +08:00
|
|
|
|
services:
|
2026-05-19 14:29:57 +08:00
|
|
|
|
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
# 核心 API 服务(必须)
|
|
|
|
|
|
# 端口:9001(内部),nginx 代理 /api/* 和 /actuator/*
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
2026-05-18 19:49:31 +08:00
|
|
|
|
tenant-service:
|
|
|
|
|
|
image: ${REGISTRY}/tenant-service:${IMAGE_TAG}
|
|
|
|
|
|
profiles: ["base"]
|
2026-05-20 15:30:55 +08:00
|
|
|
|
ports:
|
2026-05-20 15:43:05 +08:00
|
|
|
|
- "127.0.0.1:11224:9001"
|
2026-05-18 19:49:31 +08:00
|
|
|
|
env_file:
|
2026-05-19 14:29:57 +08:00
|
|
|
|
- ./config/xuqm.env # 业务配置:运行模式、域名、功能开关
|
|
|
|
|
|
- ./config/secrets.env # 敏感配置:密码、Token
|
|
|
|
|
|
- ./config/tenant/bootstrap.env # 初始租户配置
|
2026-05-19 00:13:09 +08:00
|
|
|
|
environment:
|
2026-05-19 14:29:57 +08:00
|
|
|
|
# 覆盖 application.yml 中硬编码的生产地址,私有化部署必须保留此块
|
2026-05-21 11:27:47 +08:00
|
|
|
|
# SPRING_DATASOURCE_PASSWORD / SPRING_DATA_REDIS_PASSWORD 由 secrets.env 注入,
|
|
|
|
|
|
# 不在此处设置,避免 compose 变量替换时因 shell 缺少变量而覆盖成空字符串
|
2026-05-19 14:29:57 +08:00
|
|
|
|
SPRING_DATASOURCE_URL: "jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT:-3306}/${MYSQL_DATABASE:-xuqm_private}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true"
|
2026-05-19 00:13:09 +08:00
|
|
|
|
SPRING_DATASOURCE_USERNAME: "${MYSQL_USERNAME:-xuqm}"
|
|
|
|
|
|
SPRING_DATA_REDIS_HOST: "${REDIS_HOST}"
|
|
|
|
|
|
SPRING_DATA_REDIS_PORT: "${REDIS_PORT:-6379}"
|
|
|
|
|
|
SPRING_DATA_REDIS_DATABASE: "${REDIS_DATABASE:-0}"
|
2026-05-18 19:49:31 +08:00
|
|
|
|
restart: unless-stopped
|
|
|
|
|
|
|
2026-05-19 14:29:57 +08:00
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
# 文件服务(必须)
|
|
|
|
|
|
# 端口:8086(内部),nginx 代理 /file/*
|
|
|
|
|
|
# 文件数据持久化到 ./data/uploads
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
2026-05-18 19:49:31 +08:00
|
|
|
|
file-service:
|
|
|
|
|
|
image: ${REGISTRY}/file-service:${IMAGE_TAG}
|
|
|
|
|
|
profiles: ["base"]
|
2026-05-20 15:30:55 +08:00
|
|
|
|
ports:
|
2026-05-20 15:43:05 +08:00
|
|
|
|
- "127.0.0.1:11225:8086"
|
2026-05-18 19:49:31 +08:00
|
|
|
|
env_file:
|
|
|
|
|
|
- ./config/xuqm.env
|
|
|
|
|
|
- ./config/secrets.env
|
2026-05-19 00:13:09 +08:00
|
|
|
|
environment:
|
2026-05-19 14:29:57 +08:00
|
|
|
|
SPRING_DATASOURCE_URL: "jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT:-3306}/${MYSQL_DATABASE:-xuqm_private}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true"
|
2026-05-19 00:13:09 +08:00
|
|
|
|
SPRING_DATASOURCE_USERNAME: "${MYSQL_USERNAME:-xuqm}"
|
|
|
|
|
|
SPRING_DATA_REDIS_HOST: "${REDIS_HOST}"
|
|
|
|
|
|
SPRING_DATA_REDIS_PORT: "${REDIS_PORT:-6379}"
|
|
|
|
|
|
SPRING_DATA_REDIS_DATABASE: "${REDIS_DATABASE:-0}"
|
2026-05-18 19:49:31 +08:00
|
|
|
|
volumes:
|
2026-05-19 14:29:57 +08:00
|
|
|
|
- ./data/uploads:/data/uploads # 上传文件持久化目录
|
2026-05-18 19:49:31 +08:00
|
|
|
|
restart: unless-stopped
|
|
|
|
|
|
|
2026-05-19 14:29:57 +08:00
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
# 控制台前端(必须)
|
|
|
|
|
|
# 租户登录、App 管理、功能配置界面
|
|
|
|
|
|
# nginx 代理 / 根路径
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
2026-05-18 19:49:31 +08:00
|
|
|
|
tenant-web:
|
|
|
|
|
|
image: ${REGISTRY}/tenant-web:${IMAGE_TAG}
|
|
|
|
|
|
profiles: ["base"]
|
2026-05-20 15:30:55 +08:00
|
|
|
|
ports:
|
2026-05-20 15:43:05 +08:00
|
|
|
|
- "127.0.0.1:11226:80"
|
2026-05-18 19:49:31 +08:00
|
|
|
|
restart: unless-stopped
|
|
|
|
|
|
|
2026-05-19 14:29:57 +08:00
|
|
|
|
# ---------------------------------------------------------------------------
|
2026-05-20 16:13:04 +08:00
|
|
|
|
# 内置路由 nginx(必须)
|
2026-05-20 17:20:02 +08:00
|
|
|
|
# 统一处理所有内部路由,绑定端口由 .env NGINX_BIND 控制:
|
|
|
|
|
|
# NGINX_BIND=80 → 直接监听宿主机 80(无宿主机 nginx 场景)
|
|
|
|
|
|
# NGINX_BIND=127.0.0.1:11223 → 本地监听(宿主机已有 nginx 场景)
|
2026-05-19 14:29:57 +08:00
|
|
|
|
# ---------------------------------------------------------------------------
|
2026-05-18 19:49:31 +08:00
|
|
|
|
nginx:
|
|
|
|
|
|
image: nginx:1.27-alpine
|
2026-05-20 16:13:04 +08:00
|
|
|
|
profiles: ["base"]
|
2026-05-18 19:49:31 +08:00
|
|
|
|
ports:
|
2026-05-20 17:20:02 +08:00
|
|
|
|
- "${NGINX_BIND:-80}:80"
|
2026-05-18 19:49:31 +08:00
|
|
|
|
volumes:
|
|
|
|
|
|
- ./config/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
|
|
|
|
|
|
- ./config/nginx/conf.d:/etc/nginx/conf.d:ro
|
|
|
|
|
|
depends_on:
|
2026-05-19 14:29:57 +08:00
|
|
|
|
tenant-service:
|
|
|
|
|
|
condition: service_started
|
|
|
|
|
|
tenant-web:
|
|
|
|
|
|
condition: service_started
|
2026-05-18 19:49:31 +08:00
|
|
|
|
restart: unless-stopped
|
|
|
|
|
|
|
2026-05-19 14:29:57 +08:00
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
# IM 服务(可选,profile: im)
|
|
|
|
|
|
# 端口:8082(内部)
|
|
|
|
|
|
# 提供:IM HTTP API(/api/im/)和 WebSocket(/ws/im/)
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
2026-05-18 19:49:31 +08:00
|
|
|
|
im-service:
|
|
|
|
|
|
image: ${REGISTRY}/im-service:${IMAGE_TAG}
|
|
|
|
|
|
profiles: ["im"]
|
2026-05-20 15:30:55 +08:00
|
|
|
|
ports:
|
2026-05-20 15:43:05 +08:00
|
|
|
|
- "127.0.0.1:11228:8082"
|
2026-05-18 19:49:31 +08:00
|
|
|
|
env_file:
|
|
|
|
|
|
- ./config/xuqm.env
|
|
|
|
|
|
- ./config/secrets.env
|
2026-05-19 14:29:57 +08:00
|
|
|
|
environment:
|
2026-05-19 18:23:27 +08:00
|
|
|
|
SPRING_DATASOURCE_URL: "jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT:-3306}/${MYSQL_DATABASE:-xuqm_private}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true"
|
|
|
|
|
|
SPRING_DATASOURCE_USERNAME: "${MYSQL_USERNAME:-xuqm}"
|
|
|
|
|
|
SPRING_DATA_REDIS_HOST: "${REDIS_HOST}"
|
|
|
|
|
|
SPRING_DATA_REDIS_PORT: "${REDIS_PORT:-6379}"
|
|
|
|
|
|
SPRING_DATA_REDIS_DATABASE: "${REDIS_DATABASE:-0}"
|
2026-05-19 14:29:57 +08:00
|
|
|
|
TENANT_SERVICE_URL: "http://tenant-service:9001"
|
|
|
|
|
|
PUSH_SERVICE_URL: "http://push-service:8083"
|
2026-05-18 19:49:31 +08:00
|
|
|
|
restart: unless-stopped
|
|
|
|
|
|
|
2026-05-19 14:29:57 +08:00
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
# 推送服务(可选,profile: push)
|
|
|
|
|
|
# 端口:8083(内部)
|
|
|
|
|
|
# 负责通过华为/小米/OPPO/vivo/荣耀/APNs/FCM 下发推送通知
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
2026-05-18 19:49:31 +08:00
|
|
|
|
push-service:
|
|
|
|
|
|
image: ${REGISTRY}/push-service:${IMAGE_TAG}
|
|
|
|
|
|
profiles: ["push"]
|
2026-05-20 15:30:55 +08:00
|
|
|
|
ports:
|
2026-05-20 15:43:05 +08:00
|
|
|
|
- "127.0.0.1:11229:8083"
|
2026-05-18 19:49:31 +08:00
|
|
|
|
env_file:
|
|
|
|
|
|
- ./config/xuqm.env
|
|
|
|
|
|
- ./config/secrets.env
|
2026-05-19 14:29:57 +08:00
|
|
|
|
- ./config/vendors/push.env # 各厂商推送凭据
|
2026-05-19 18:23:27 +08:00
|
|
|
|
environment:
|
|
|
|
|
|
SPRING_DATASOURCE_URL: "jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT:-3306}/${MYSQL_DATABASE:-xuqm_private}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true"
|
|
|
|
|
|
SPRING_DATASOURCE_USERNAME: "${MYSQL_USERNAME:-xuqm}"
|
2026-05-18 19:49:31 +08:00
|
|
|
|
restart: unless-stopped
|
|
|
|
|
|
|
2026-05-19 14:29:57 +08:00
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
# 版本管理服务(可选,profile: update)
|
|
|
|
|
|
# 端口:8084(内部)
|
|
|
|
|
|
# 负责:APP 版本发布、RN 热更新包、应用市场自动提交
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
2026-05-18 19:49:31 +08:00
|
|
|
|
update-service:
|
|
|
|
|
|
image: ${REGISTRY}/update-service:${IMAGE_TAG}
|
|
|
|
|
|
profiles: ["update"]
|
2026-05-20 15:30:55 +08:00
|
|
|
|
ports:
|
2026-05-20 15:43:05 +08:00
|
|
|
|
- "127.0.0.1:11230:8084"
|
2026-05-18 19:49:31 +08:00
|
|
|
|
env_file:
|
|
|
|
|
|
- ./config/xuqm.env
|
|
|
|
|
|
- ./config/secrets.env
|
2026-05-19 14:29:57 +08:00
|
|
|
|
- ./config/vendors/store-submit.env # 各应用市场发布凭据
|
|
|
|
|
|
environment:
|
2026-05-19 18:23:27 +08:00
|
|
|
|
SPRING_DATASOURCE_URL: "jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT:-3306}/${MYSQL_DATABASE:-xuqm_private}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true"
|
|
|
|
|
|
SPRING_DATASOURCE_USERNAME: "${MYSQL_USERNAME:-xuqm}"
|
2026-05-19 14:29:57 +08:00
|
|
|
|
SDK_TENANT_SERVICE_URL: "http://tenant-service:9001"
|
2026-05-18 19:49:31 +08:00
|
|
|
|
volumes:
|
2026-05-19 14:29:57 +08:00
|
|
|
|
- ./data/update:/data/update # 版本包存储目录
|
2026-05-18 19:49:31 +08:00
|
|
|
|
restart: unless-stopped
|
|
|
|
|
|
|
2026-05-19 14:29:57 +08:00
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
# License 服务(可选,profile: license)
|
|
|
|
|
|
# 端口:8085(内部)
|
|
|
|
|
|
# 负责设备激活数量校验和 License 有效期管理
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
2026-05-18 19:49:31 +08:00
|
|
|
|
license-service:
|
|
|
|
|
|
image: ${REGISTRY}/license-service:${IMAGE_TAG}
|
|
|
|
|
|
profiles: ["license"]
|
2026-05-20 15:30:55 +08:00
|
|
|
|
ports:
|
2026-05-20 15:43:05 +08:00
|
|
|
|
- "127.0.0.1:11231:8085"
|
2026-05-18 19:49:31 +08:00
|
|
|
|
env_file:
|
|
|
|
|
|
- ./config/xuqm.env
|
|
|
|
|
|
- ./config/secrets.env
|
2026-05-19 18:23:27 +08:00
|
|
|
|
environment:
|
|
|
|
|
|
SPRING_DATASOURCE_URL: "jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT:-3306}/${MYSQL_DATABASE:-xuqm_private}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true"
|
|
|
|
|
|
SPRING_DATASOURCE_USERNAME: "${MYSQL_USERNAME:-xuqm}"
|
2026-05-18 19:49:31 +08:00
|
|
|
|
restart: unless-stopped
|