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

3.7 KiB

私有化升级生产验收记录2026-07-29

结论

2026.07.28-private.1 已在真实私有化环境完成保留数据的升级演练和升级后全量验收。 最终结果为 26 项通过、3 项预期警告、0 项失败。预期警告均为验收探针使用未登记 包名请求 SDK 配置时返回 HTTP 403,不表示服务不可用。

本记录只陈述实际执行结果。未执行的新装流程、租户迁移流程和移动端人工点击验证仍需 在对应发布验收中单独执行,不能由本次升级演练替代。

验收范围

  • 部署模式:单租户私有化,公有化与私有化配置完全隔离。
  • 部署入口:https://console.51szyx.com
  • 升级类型:保留现有数据库、上传文件、服务配置和签名信任根的原地升级。
  • 激活 profilesbaseinfra-mysqlinfra-redisimpushupdatebugcollect
  • 目标版本: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. 任何失败不得自动回退到公有化服务。