跳转至

08-发布与回滚预案(蓝绿 10 步部署 × Alembic downgrade × 3-2-1 备份)

【重建推定版 V1.0】 / DOC-BT-08 / 版本 V1.0(2026-08-21 听写重建) 依据:03-测试环境准备 §三 听云 10 步部署 + PJM §4.6 git tag 快照 + DIP1-TND-P §7 运维三保险


一、蓝绿部署 10 步(生产发布 = 听云 OCM 执行)

# 步骤 说明 验证点 失败触发回滚
1 git tag 快照 git tag prod/v3.3.0-<YYYYMMDD-HHMM> + push Gitee 备份仓(仅备份用) Gitee 标签可见 标签失败 = 终止,不影响线上
2 听写打包 + scp 给听云 听写从听码本地接收代码包 → 推送 scp 给听云(不经过 Gitee pull) 听云本地收到 tar+sha256 打包失败 → 步骤 1 重来
3 生产数据库备份(3-2-1 原则) ① 本地 PostgreSQL pg_dump(加密)② 阿里云 NAS 同步一份 ③ 异地对象存储(OSS)一份;命名 dip1-prod-<YYYYMMDD-HHMM>.sql.gz.aes256 sha256 文件三份一致 + AES key 存入密码机 备份失败 = 立即中止发布(P0)
4 蓝环境(Green)构建 蓝容器 dip1-api-green 拉取新包,部署 v3.3.0,不接入生产流量;alembic upgrade head(head=0011) Green 容器 health=200;Green-DB alembic current=head Green 启动失败 = P0 → §三 回滚
5 Green 执行 v3_seed(幂等) Green DB 环境变量 7 项 Set → v3_seed.py 执行(UFCS 21 + VQR 16 + MFR 1 + LGD 1 + 17 账号 ON CONFLICT) Green BD-05 users count=17;BD-03 schema head=0011 seed 非幂等报错 = P0 → §三 回滚
6 Blue → Green 5% 金丝雀切流 Nginx Ingress 权重:Blue=95% / Green=5%(真实客户流量,先导入 1 TL 内部测试账号流量) Green access log 有请求,无 5xx;NPS 无骤降 5% 流量 5xx ≥ 3 次/min → 切回 100% Blue
7 金丝雀扩大(20% → 50% → 100%)(每步 15min) 每个阶段检查:QPS × 响应时间 × 5xx 率 × NPS(听云 Grafana Dashboard 实时) 20%/50% 阶段 5xx ≤ 0.01% 任一阶段 5xx ≥ 0.5% → 立即全量切回 Blue
8 Green 100% + Blue 保留 30min 切流完成后 Blue 不立即下线(热备 30min,所有客户连接自然断开);同时执行 UAT 26 基线冒烟用例 26 用例 ≥ 24 PASS(2 个可后续修复) 100% Green UAT 冒烟 < 24 PASS → 30min 内 §三 回滚
9 Blue 下线 + 写 OCL 发布日志 Blue 容器 stop(保留 24h 后再 delete);OCL 编号 L-YYYYMMDD-NN 完成 OCL 包含 1~8 全部验证点记录
10 通知听写 + 协作记录 COLLAB 关闭 听云 → 听写:发布完成 + OCL 编号 → 听写更新 PJR + DTL → 进入 UAT / L4 三方(DT / OC / WDE)COLLAB 版本 = v3.3.0 Closed

二、回滚触发阈值(满足任一立即启动 §三)

类别 阈值 响应等级
数据库 发布后 alembic head 错误 / 29 新表缺失任意一张 ≥ 1 张 P0(5min 内启动回滚)
5xx 错误率 Green 在任一阶段 5xx 率 ≥ 0.5%(QPS ≥ 10 条件下) P0(10s 内 Nginx 切回 Blue)
核心指标 S7-1 OQS 1141.60 HKD 报价失败率 ≥ 5%;S7-3 LGD ETA 推送失败率 ≥ 10% P1(30min 内回滚)
NPS 发布后 1h 内 NPS 平均 ≤ 6 星(比基线低 ≥ 3 星) P1
安全 注入 / 越权 / 数据泄露 被报 1 例以上 P0
听云健康检查 BD-01 overall≠ok + BD-03 head 不对(连续 3 次 × 2 min 间隔) P0

三、回滚 7 步(Alembic downgrade + DB 备份恢复)

原则:回滚是发布的一部分,任何发布前必须先演练回滚 1 次(至少阿里云 UAT 成功 1 次)

# 步骤 说明 验证点
1 Nginx 全量切回 Blue(10s 级) weight Blue=100 Green=0;同时 Green 关闭新入口但保留日志 2h 排障 Blue access log 恢复流量;Green 停止接收请求
2 Alembic downgrade -1(Green DB) alembic downgrade -1 回到发布前版本(本次发布前 alembic=V2.0.0 对应 head=0005) downgrade 执行 0 error;alembic current = 发布前编号
3 评估是否需要恢复 DB 备份 若 downgrade 失败(如数据已被不可逆转写) → 执行 §一 步骤 3 的 3-2-1 备份恢复:NAS 本地 dump 导入(最快) 恢复后 BD-03 schema head = 发布前编号;订单表行数 = 发布前(± 发布期间新订单需手动合并)
4 Green 代码回滚(docker tag) Green 容器镜像从 v3.3.0 → v2.0.0 prod tag(生产前一稳定版 weavely/dip1-api:prod Green 容器 version = v2.0.0,health=200
5 Blue → Green 再次切流 50/50 验证 Blue 热备没问题后,再做均衡验证;避免单点长期 Blue 两端 version 均为 v2.0.0(统一版本)
6 通知三方 + 写 OCL 回滚日志 OCL 必须包含:触发阈值(§二哪一条)/ 影响范围(受影响订单数)/ 根因分析(初步)/ 修复 DeadLine OCL 完成 + DTL 同步留痕(听写侧)
7 缺陷登记进入 07-缺陷管理(WDE-006+) 根因 = 代码问题 → WDE-前缀派单给听码;根因 = 部署/配置 → OCL-前缀听云自修复;根因 = 主数据 → MDS-前缀 听码写 WDL;下次发布前该缺陷必须 Closed(UAT 中通过)

四、数据库备份 3-2-1 原则(发布必做)

备份位置 存储介质 保留时长 加密方式 恢复预计时长
1 / 本地 PostgreSQL 主机 本机 SSD 30 天(每日 1 份) AES-256 ~10min(10GB 数据)
2 / 阿里云 NAS 挂载点 阿里云 NAS(同可用区) 90 天(每日 1 份) AES-256 + NAS 加密 ~30min(跨存储)
3 / 阿里云 OSS 异地冷备 OSS 跨区(香港 → 新加坡) 180 天(每周 1 份) AES-256 + OSS Bucket Policy 加密 ~2h(跨区大文件)

备份校验:每 周日 自动执行「NAS → 空临时 DB 恢复 → 26 基线冒烟用例」演练;恢复失败立即告警(OCL + P0)。


五、UAT 发布-回滚演练(S7 三轮之前必须通过 1 次)

该演练 = §一蓝绿 10 步 + §三回滚 7 步 完整跑通,用阿里云 UAT 环境(uat-cloud)模拟蓝绿,验证流程无死步骤。

演练 ID 目标 验收 通过记录
DR-202608xx-01 蓝绿部署流程跑通 步骤 1~10 全部通过;Green 5%→20%→50%→100% 无 5xx □ TL 签字
DR-202608xx-02 5xx 阈值触发 + 回滚 人为在 Green 引入一个空指针 → 5xx≥0.5% → 自动切回 Blue → 回滚 7 步 → 恢复 26 用例 PASS □ TL 签字
DR-202608xx-03 备份恢复演练 NAS 备份恢复 → 验证 DB 表行数一致 → 基线用例 PASS □ TL 签字

本文档为【重建推定版】,§一 蓝绿 10 步来源于 PJM §4.6 发布规范 + 双轨交付(听写打包→听云部署);§三 回滚 7 步 Alembic downgrade -1 来源于 DIP1-ARC §运维三保险;§四 3-2-1 备份来源于 TND-P §7.2 备份策略。