From 50d63ea66b6d4512d884b9561e94bebef1e981c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E5=8B=A4=E6=B0=91?= Date: Wed, 29 Jul 2026 01:41:05 +0800 Subject: [PATCH] docs(private): record production upgrade validation --- docs/acceptance-checklist.md | 4 ++ docs/production-validation-2026-07-29.md | 74 ++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 docs/production-validation-2026-07-29.md diff --git a/docs/acceptance-checklist.md b/docs/acceptance-checklist.md index 3295bf8..efa6daf 100644 --- a/docs/acceptance-checklist.md +++ b/docs/acceptance-checklist.md @@ -1,5 +1,9 @@ # 验收清单 +最近一次真实私有化升级验收记录见 +[production-validation-2026-07-29.md](production-validation-2026-07-29.md)。本清单仍作为每次 +新部署、迁移或升级的可重复检查入口;历史通过记录不能替代下一次发布验收。 + ## 部署流程 - [ ] `install.sh` 可一键完成完整部署(含租户初始化) diff --git a/docs/production-validation-2026-07-29.md b/docs/production-validation-2026-07-29.md new file mode 100644 index 0000000..d3a5b8f --- /dev/null +++ b/docs/production-validation-2026-07-29.md @@ -0,0 +1,74 @@ +# 私有化升级生产验收记录(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. 任何失败不得自动回退到公有化服务。