Files
lisglosips/docs/S42_PHASE2_FREEZE_REPORT.md

5.8 KiB
Raw Permalink Blame History

S42 二期业务前缀基线冻结报告

1. 目标

冻结 LisgloSIPS V2 本地 KVM/Tailscale 环境中二期业务前缀、客户网关匹配、号码库、落地号码改写和真实话单接入后的当前可回滚基线。

本冻结不进入阿里云生产迁移,不替代未来生产环境的 VPC、安全组、正式 DNS/TLS、独立数据盘、备份恢复和灰度验收。

2. 冻结结论

当前 s42-phase2-business-prefix-20260624140000 具备冻结条件,可作为“二期业务前缀小样本联调基线”。

本冻结不包含真实 80 万手机号段导入,不包含生产式号码库压测,不包含浏览器登录态逐页按钮全量人工复测。

3. 冻结清单

当前值
B current release /opt/lisglosips/releases/s42-phase2-business-prefix-20260624140000
Redis active version 1782286812696
Redis previous version 1782286145681
A OpenSIPS cfg SHA-256 ae1544e9a39d2db114e6981babac042c2ab6d399d59ba597a52b85d597aa5aa5
A Lua SHA-1 0b7ee595cdcad2f38a670dd8ff3553387820039e
Prisma migrations 4 条,B 当前库 Database schema is up to date
最新 MySQL 备份 /data/backups/mysql/20260624T055810ZSHA256 校验通过
最新 Redis 备份 /data/backups/redis/20260624T055810ZSHA256 校验通过
T 测试脚本 /opt/lisglosips-s28/lisglosips-s28-sip.py

4. 验证结果

本地代码验证:

  • corepack pnpm@10.33.0 typecheck 通过。
  • corepack pnpm@10.33.0 lint 通过。
  • corepack pnpm@10.33.0 build 通过。
  • corepack pnpm@10.33.0 exec vitest run --hookTimeout=60000 --maxWorkers=1 通过:25 个测试文件,87 条测试通过。

B 侧验证:

  • lisglosips@apilisglosips@cdr-workerlisglosips@recording-workerlisglosips@config-publishernginxmysqlredis-serverheplify-serverlisglosips-prometheusgrafana-server 均为 active
  • https://127.0.0.1/api/v2/health/ready 返回 ok
  • infra/server-b/s30/lisglosips-release-preflight.sh 已补齐执行权限,直接执行通过。
  • Redis stream:cdr_deadletter 长度为 26,抽样均为 2026-06-23 至 2026-06-24 早期修复前历史死信,包括 config_version INT 越界、旧占位外键失败、旧 NO_POLICY 事件;冻结验收实呼未新增 deadletter。

A 侧验证:

  • opensipslisglosips-redis-auth-proxyrtpenginertpengine-recording-daemon 均为 active
  • opensips -C -f /etc/opensips/opensips.cfg 通过。
  • 历史 4 条 dialog 经 dlg_end_dlg 无法清理,返回 OpenSIPS MI Operation failed;已在语法检查通过后重启 opensips 清空。
  • 冻结验收实呼后出现 1 条测试 dialog 残留;已再次语法检查并重启 opensips,最终 dlg_list 为空。

T 侧验证:

  • opensipsactive
  • 100.93.185.30:5060100.93.185.30:50620 均在 UDP 监听。

端到端小样本呼叫:

  • Call-IDs28-1782288889943-ckv83lce@lisglosips-t
  • SIP100 Giving it a try200 OK、BYE 200 OK
  • B raw CDRraw_d5732df32b8d496686512870fb087232
  • 话单字段:caller=s28-ip-1001callee=13800138000raw_callee=13800138000business_prefix=NULLlanding_caller=s28-ip-1001landing_callee=13800138000sip_code=200rating_status=RATED
  • 计费:客户费用 0.012000,供应商成本 0.012000
  • CDR Workerprocessed=1deadlettered=0

5. 已处理冻结前问题

  1. 历史 dialog 残留:已通过重启 A OpenSIPS 清空,最终 dlg_list 为空。
  2. CDR deadletter:未删除历史死信,已确认样本属于早期修复前历史事件;冻结验收呼叫未新增 deadletter。
  3. B preflight 执行权限:已将 /opt/lisglosips/current/infra/server-b/s30/lisglosips-release-preflight.sh 权限修正为 0755,直接执行通过。
  4. 全量 Vitest:初次使用默认 hook timeout 时 app.e2e.spec.ts 超时;使用 --hookTimeout=60000 后全量测试通过。
  5. 冻结范围:明确不包含真实 80 万手机号段导入和浏览器登录态逐页按钮全量人工复测。

6. 回滚点

B 应用回滚:

sudo /opt/lisglosips/current/infra/server-b/s30/lisglosips-release-rollback.sh /opt/lisglosips/releases/s33-active-calls-20260623094000

Redis 配置回滚:

  • 当前版本:1782286812696
  • 上一版本:1782286145681
  • 回滚时切回 cfg:previous_version,不删除 Stream 或 deadletter。

A OpenSIPS 回滚:

  • 当前配置语法已通过,当前 Lua SHA 已记录。
  • 若需回滚,使用最近一次 /var/backups/lisglosips-phase2/ 下的 opensips.cfglisglosips_hotpath.lua 备份,先执行 opensips -C -f /etc/opensips/opensips.cfg,通过后重启 opensips

数据库回滚:

  • 二期 migration 为向前兼容新增表/列,不建议执行破坏性 down migration。
  • 若必须恢复数据,使用 /data/backups/mysql/20260624T055810Z,先恢复到隔离库验证后再进入维护窗口处理。

7. 遗留风险

  • 真实 80 万手机号段尚未导入;号码库相关性能、Redis 快照体量和导入失败明细仍需单独验收。
  • 浏览器登录态逐页按钮未做完整人工复测;本次只完成 API、构建、单元/集成测试和端到端小样本呼叫验证。
  • OpenSIPS dialog 在测试呼叫结束后仍可能短期残留,当前通过重启清空。后续应单独分析 dialog 生命周期和 dlg_end_dlg Operation failed 的根因。
  • 当前仍为本地 KVM/Tailscale 环境,开发 CA、Tailscale IP、本地根盘布局不能原样用于阿里云生产。

8. 结论

s42-phase2-business-prefix-20260624140000 可冻结为二期业务前缀小样本联调基线。后续需求或 Bug 修复应创建新的 release,不再覆盖该冻结点;阿里云迁移前仍需重新执行 S30 Runbook、备份恢复演练、正式网络/TLS 验收和灰度观察。