72 lines
3.2 KiB
Markdown
72 lines
3.2 KiB
Markdown
# 103 用户级灰度发布
|
||
|
||
Portal 的首个生产动作必须是用户级灰度,不能直接整包替换稳定版本。
|
||
|
||
## 运行拓扑
|
||
|
||
| 组件 | 地址 | 说明 |
|
||
|---|---|---|
|
||
| 稳定 Portal | `127.0.0.1:8081` | 保持当前 live 目录和进程,不在灰度发布中替换 |
|
||
| 灰度路由器 | `127.0.0.1:18080` | 105 的 `19081` 反向隧道在全部检查通过后切到这里 |
|
||
| 候选 Portal | `127.0.0.1:18081` | 独立、无源码 runtime;使用被动运行时模式 |
|
||
| 候选 goosed | `127.0.0.1:18015` | 独立容器并挂载候选 runtime,不重建稳定 9 个容器 |
|
||
|
||
候选 Portal 通过 `MEMIND_PORTAL_H5_ROOT` 共享经审计的持久数据和数据库,但
|
||
`MEMIND_RUNTIME_ROLE=candidate` 会禁止重复启动 MindSpace、Plaza、提醒、订阅续期和
|
||
Agent 恢复扫描等单例后台任务。
|
||
|
||
## 身份和回落规则
|
||
|
||
- `john`:按数据库中的唯一用户名或用户 ID 匹配。
|
||
- 微信用户“唐”:只按绑定微信身份的唯一账号标识 `wx_ul610et8` 匹配;该值在生产库中是唯一 `username/slug`,不是显示昵称。
|
||
- 显示昵称永远不参与路由。
|
||
- Cookie 会话通过 `h5_login_sessions` 的 token hash 只读解析。
|
||
- 微信回调通过 `FromUserName` 和 `h5_user_wechat_identities` 只读解析到绑定账号,再用唯一账号标识匹配。
|
||
- 未命中、无身份、过期/撤销会话、数据库异常:走稳定版本。
|
||
- 候选 `/api/status` 不健康:自动走稳定版本。
|
||
- SSE、附件、公开页和普通 API 均由同一反向代理转发;微信 XML body 必须原样保留。
|
||
|
||
## 发布入口
|
||
|
||
候选必须来自干净且等于 `origin/main` 的完整 `main`,CI 成功,并具有与
|
||
`.runtime/portal` 完全一致、未过期的 187 项 Gate report。
|
||
|
||
```bash
|
||
bash scripts/release-portal-canary-prod.sh --yes
|
||
```
|
||
|
||
该脚本按顺序执行:
|
||
|
||
1. 验证源码、分支、远端主线、Gate report 和 artifact hash。
|
||
2. 执行 103 只读预检。
|
||
3. 上传经过验证的候选包。
|
||
4. 创建稳定 live 全量备份和持久目录备份,并校验 SHA256、gzip 和关键目录。
|
||
5. 启动独立候选 goosed、候选 Portal 和灰度路由器。
|
||
6. 验证不可变身份配置、稳定/候选健康和路由器诊断。
|
||
7. 短暂阻止新 Agent Run,排空活动任务。
|
||
8. 只把反向隧道从 8081 切到 18080。
|
||
9. 主动停止候选,证明目标身份会自动回落稳定版,再恢复候选。
|
||
|
||
任一步失败都会把隧道恢复到稳定 8081,停止候选服务并保留候选目录和备份证据。
|
||
|
||
## 回滚
|
||
|
||
```bash
|
||
bash scripts/rollback-portal-canary-prod.sh --yes
|
||
```
|
||
|
||
回滚只执行以下动作:
|
||
|
||
- 把 105 反向隧道恢复到稳定 Portal 8081。
|
||
- 停止灰度路由器、候选 Portal 和候选 goosed。
|
||
- 清除发布排水标记。
|
||
- 验证稳定 Portal 和 105 隧道健康。
|
||
|
||
不会删除候选目录、备份或稳定运行目录。
|
||
|
||
## 全量晋升
|
||
|
||
`scripts/release-portal-runtime-prod.sh` 仍是整包替换脚本,不能把“灰度路由器已实现”
|
||
解释为自动获得全量切换权限。全量晋升必须使用同一 commit 和 artifact,保留灰度验收
|
||
证据,并再次取得明确批准;在晋升入口完成对应证据校验前,该脚本继续硬阻断非 dry-run。
|