2026-05-18 19:49:31 +08:00
|
|
|
|
# 私有化部署运行手册
|
|
|
|
|
|
|
|
|
|
|
|
## 目标
|
|
|
|
|
|
|
|
|
|
|
|
本仓库用于客户私有环境交付,只编排已有 Docker 镜像,不包含业务源码、不构建 demo 服务。
|
|
|
|
|
|
|
|
|
|
|
|
## 标准流程
|
|
|
|
|
|
|
|
|
|
|
|
1. 执行 `./scripts/configure.sh` 生成 `.env` 和 `config/secrets.env`。
|
|
|
|
|
|
2. 修改 `.env`:镜像仓库、镜像版本、域名、可选服务、MySQL/Redis 模式。
|
|
|
|
|
|
3. 修改 `config/secrets.env`:数据库密码、Redis 密码、SMTP 密码等敏感配置。
|
|
|
|
|
|
4. 修改 `config/mail/smtp.env`、`config/vendors/*.env`。
|
|
|
|
|
|
5. 执行 `./scripts/install.sh --profile base` 部署基础服务。
|
|
|
|
|
|
6. 按需执行 `./scripts/enable-service.sh im|push|update|license` 启用可选服务。
|
|
|
|
|
|
7. 执行 `./scripts/healthcheck.sh` 并检查 `.deploy-state/last-healthcheck.json`。
|
|
|
|
|
|
|
|
|
|
|
|
## MySQL/Redis 模式
|
|
|
|
|
|
|
|
|
|
|
|
`external` 模式:
|
|
|
|
|
|
|
|
|
|
|
|
- 客户提供连接地址、账号、密码、数据库名。
|
|
|
|
|
|
- 部署脚本只使用连接配置,不启动新服务。
|
|
|
|
|
|
- 生产默认使用该模式。
|
|
|
|
|
|
|
|
|
|
|
|
`managed` 模式:
|
|
|
|
|
|
|
|
|
|
|
|
- 部署脚本通过 Docker Compose 启动 MySQL/Redis。
|
|
|
|
|
|
- 密码为空或为 `change-me` 时自动生成并写入 `config/secrets.env`。
|
|
|
|
|
|
- 数据目录写入 `data/mysql` 和 `data/redis`。
|
|
|
|
|
|
|
|
|
|
|
|
## 可选服务
|
|
|
|
|
|
|
|
|
|
|
|
`im`、`push`、`update`、`license` 均可不部署,后期独立启用。
|
|
|
|
|
|
|
|
|
|
|
|
启用命令:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
./scripts/enable-service.sh im
|
|
|
|
|
|
./scripts/install.sh --profile base,im
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
禁用命令:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
./scripts/disable-service.sh im
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
禁用服务不会删除数据,重新启用后继续使用原配置和数据目录。
|
|
|
|
|
|
|
2026-05-19 08:01:19 +08:00
|
|
|
|
## 租户迁移(公有化 → 私有化)
|
|
|
|
|
|
|
|
|
|
|
|
将公有化平台的存量租户迁移到私有化部署。
|
|
|
|
|
|
|
|
|
|
|
|
### 前提条件
|
|
|
|
|
|
|
|
|
|
|
|
- 私有化基础服务已通过 `healthcheck.sh`。
|
|
|
|
|
|
- 源 MySQL 可从部署机器网络连通(`mysql -h SRC_HOST ...` 成功)。
|
|
|
|
|
|
- 私有化部署为单租户模式:迁移会**清空**当前 bootstrap 租户后写入迁移租户。
|
|
|
|
|
|
|
|
|
|
|
|
### 执行迁移
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Dry-run 确认要迁移的数据
|
|
|
|
|
|
./scripts/migrate-tenant.sh \
|
|
|
|
|
|
--src-host <生产MySQL> \
|
|
|
|
|
|
--src-user <用户名> \
|
|
|
|
|
|
--src-password '<密码>' \
|
|
|
|
|
|
--src-db xuqm_tenant \
|
|
|
|
|
|
--tenant <租户邮箱或用户名> \
|
|
|
|
|
|
--dry-run
|
|
|
|
|
|
|
|
|
|
|
|
# 确认无误后正式执行
|
|
|
|
|
|
./scripts/migrate-tenant.sh \
|
|
|
|
|
|
--src-host <生产MySQL> \
|
|
|
|
|
|
--src-user <用户名> \
|
|
|
|
|
|
--src-password '<密码>' \
|
|
|
|
|
|
--src-db xuqm_tenant \
|
|
|
|
|
|
--tenant <租户邮箱或用户名>
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
迁移脚本会自动:
|
|
|
|
|
|
1. 从源库导出 `t_tenant`、`t_app`、`t_feature_service`(含厂商配置)。
|
|
|
|
|
|
2. 用显式列名 INSERT 规避生产与私有化 MySQL 的列序差异。
|
|
|
|
|
|
3. 清空私有化部署的 bootstrap 租户后写入迁移数据。
|
|
|
|
|
|
4. 重启 `tenant-service` 清空内存缓存。
|
|
|
|
|
|
5. 通过 `/api/sdk/config` 和 `/api/private/deployment/status` 验证结果。
|
|
|
|
|
|
|
|
|
|
|
|
### 验证
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# SDK config 应返回 200
|
|
|
|
|
|
curl "http://DEPLOY_HOST/api/sdk/config?appKey=<app_key>&platform=ANDROID"
|
|
|
|
|
|
|
|
|
|
|
|
# 部署状态应为 PRIVATE,注册应为 false
|
|
|
|
|
|
curl "http://DEPLOY_HOST/api/private/deployment/status"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-05-18 19:49:31 +08:00
|
|
|
|
## 接手规则
|
|
|
|
|
|
|
|
|
|
|
|
任何 agent 开始执行前必须先查看:
|
|
|
|
|
|
|
|
|
|
|
|
- `.deploy-state/progress.md`
|
|
|
|
|
|
- `.deploy-state/current.json`
|
|
|
|
|
|
- `logs/audit.log`
|
|
|
|
|
|
|
|
|
|
|
|
执行关键步骤后必须追加进度,确保中断后可继续。
|