3.7 KiB
3.7 KiB
私有化升级生产验收记录(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 |
演练中发现并修复的问题
- 升级脚本按“正在运行的容器”推导 profiles,停止状态服务会被永久跳过。现改为从部署 配置读取激活 profiles。
- 验收脚本使用模糊容器名,可能误匹配宿主机无关容器。现只读取当前 Compose 项目的 精确服务 ID。
- 历史部署缺少
SDK_INTERNAL_TOKEN,tenant 与 IM 服务间内部请求返回 403。现由scripts/lib.sh唯一负责生成和持久化部署独享令牌,deploy、update、reset 三个入口 统一调用;已有有效令牌不会被轮换。 - 历史 update 数据库被错误 baseline 到 V3,表结构并未实际创建。服务端 V7 使用幂等 迁移修复缺失契约。
- IM 平台事件接口局部捕获所有异常并改写成 500,绕过统一错误模型。现交由全局处理器 保留真实业务状态。
- Spring 服务容器创建后尚未完成启动时,WebSocket/业务检查会误报 502。升级脚本现先 等待 IM HTTP 路由就绪,再运行 WebSocket 与全量验收。
未覆盖项
- 全新服务器执行
install.sh:未执行;本次目标为真实存量部署升级。 - 使用
pmk_迁移密钥迁入租户:未执行;本环境已有有效租户数据。 - 灾难恢复回灌:未执行;已验证升级前备份文件和校验文件存在。
- 移动 App 真机/模拟器点击验收:不属于私有化服务端升级验收范围。
后续发布要求
每次私有化版本更新仍必须执行:
- 发布前备份并生成校验文件。
- 使用目标版本仓库中的
upgrade.sh/scripts/update.sh,不得只手动替换镜像。 - 等待
scripts/verify.sh返回FAIL: 0。 - 对新增服务补充精确容器检查、健康检查和私有化地址隔离检查。
- 任何失败不得自动回退到公有化服务。