108 lines
5.8 KiB
Markdown
108 lines
5.8 KiB
Markdown
# 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/20260624T055810Z`,SHA256 校验通过 |
|
||
| 最新 Redis 备份 | `/data/backups/redis/20260624T055810Z`,SHA256 校验通过 |
|
||
| 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@api`、`lisglosips@cdr-worker`、`lisglosips@recording-worker`、`lisglosips@config-publisher`、`nginx`、`mysql`、`redis-server`、`heplify-server`、`lisglosips-prometheus`、`grafana-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 侧验证:
|
||
|
||
- `opensips`、`lisglosips-redis-auth-proxy`、`rtpengine`、`rtpengine-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 侧验证:
|
||
|
||
- `opensips` 为 `active`。
|
||
- `100.93.185.30:5060` 和 `100.93.185.30:50620` 均在 UDP 监听。
|
||
|
||
端到端小样本呼叫:
|
||
|
||
- Call-ID:`s28-1782288889943-ckv83lce@lisglosips-t`
|
||
- SIP:`100 Giving it a try`、`200 OK`、BYE `200 OK`
|
||
- B raw CDR:`raw_d5732df32b8d496686512870fb087232`
|
||
- 话单字段:`caller=s28-ip-1001`、`callee=13800138000`、`raw_callee=13800138000`、`business_prefix=NULL`、`landing_caller=s28-ip-1001`、`landing_callee=13800138000`、`sip_code=200`、`rating_status=RATED`
|
||
- 计费:客户费用 `0.012000`,供应商成本 `0.012000`
|
||
- CDR Worker:`processed=1`、`deadlettered=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 应用回滚:
|
||
|
||
```bash
|
||
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.cfg` 和 `lisglosips_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 验收和灰度观察。
|