XuqmGroup-PrivateDeploy/docs/production-validation-2026-07-29.md

75 行
3.7 KiB
Markdown

# 私有化升级生产验收记录2026-07-29
## 结论
`2026.07.28-private.1` 已在真实私有化环境完成保留数据的升级演练和升级后全量验收。
最终结果为 **26 项通过、3 项预期警告、0 项失败**。预期警告均为验收探针使用未登记
包名请求 SDK 配置时返回 HTTP 403,不表示服务不可用。
本记录只陈述实际执行结果。未执行的新装流程、租户迁移流程和移动端人工点击验证仍需
在对应发布验收中单独执行,不能由本次升级演练替代。
## 验收范围
- 部署模式:单租户私有化,公有化与私有化配置完全隔离。
- 部署入口:`https://console.51szyx.com`。
- 升级类型:保留现有数据库、上传文件、服务配置和签名信任根的原地升级。
- 激活 profiles`base`、`infra-mysql`、`infra-redis`、`im`、`push`、`update`、
`bugcollect`
- 目标版本:`2026.07.28-private.1`。
- 数据保护:升级前已生成带校验文件的完整备份。
## 实际执行证据
| 项目 | 实际结果 |
| --- | --- |
| update-service Jenkins 发布 | 构建 #75 成功,生产镜像已发布 |
| im-service Jenkins 发布 | 构建 #22 成功,生产镜像已发布 |
| update 数据库迁移 | Flyway V7 成功执行,修复历史 baseline 跳过的 RN 插件契约 |
| 容器状态 | 11 个启用容器全部处于运行状态 |
| tenant-service | actuator health 为 `UP` |
| 私有化模式 | `/api/private/deployment/status` 返回 PRIVATE |
| 用户注册 | 已禁用,注册接口返回 HTTP 403 |
| 租户登录 | 成功 |
| 控制台与文档站 | HTTP 200 |
| IM 应用级接口 | HTTP 200 |
| update 应用版本接口 | HTTP 200 |
| RN 插件更新接口 | HTTP 200 |
| 文件服务 | HTTP 200 |
| MySQL | 查询成功 |
| Redis | `PONG` |
| 最终 `scripts/verify.sh` | PASS 26 / WARN 3 / FAIL 0 |
## 演练中发现并修复的问题
1. 升级脚本按“正在运行的容器”推导 profiles,停止状态服务会被永久跳过。现改为从部署
配置读取激活 profiles。
2. 验收脚本使用模糊容器名,可能误匹配宿主机无关容器。现只读取当前 Compose 项目的
精确服务 ID。
3. 历史部署缺少 `SDK_INTERNAL_TOKEN`,tenant 与 IM 服务间内部请求返回 403。现由
`scripts/lib.sh` 唯一负责生成和持久化部署独享令牌,deploy、update、reset 三个入口
统一调用;已有有效令牌不会被轮换。
4. 历史 update 数据库被错误 baseline 到 V3,表结构并未实际创建。服务端 V7 使用幂等
迁移修复缺失契约。
5. IM 平台事件接口局部捕获所有异常并改写成 500,绕过统一错误模型。现交由全局处理器
保留真实业务状态。
6. Spring 服务容器创建后尚未完成启动时,WebSocket/业务检查会误报 502。升级脚本现先
等待 IM HTTP 路由就绪,再运行 WebSocket 与全量验收。
## 未覆盖项
- 全新服务器执行 `install.sh`:未执行;本次目标为真实存量部署升级。
- 使用 `pmk_` 迁移密钥迁入租户:未执行;本环境已有有效租户数据。
- 灾难恢复回灌:未执行;已验证升级前备份文件和校验文件存在。
- 移动 App 真机/模拟器点击验收:不属于私有化服务端升级验收范围。
## 后续发布要求
每次私有化版本更新仍必须执行:
1. 发布前备份并生成校验文件。
2. 使用目标版本仓库中的 `upgrade.sh` / `scripts/update.sh`,不得只手动替换镜像。
3. 等待 `scripts/verify.sh` 返回 `FAIL: 0`
4. 对新增服务补充精确容器检查、健康检查和私有化地址隔离检查。
5. 任何失败不得自动回退到公有化服务。