docs(release): record server B consolidation evidence
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
# Server B 单机服务收敛发布报告
|
||||
|
||||
发布日期:2026-08-27
|
||||
生产提交:`309bffc7ffa70a760bce21ae59cb6c457c9c57fe`
|
||||
生产 release:`/opt/lisglosips/releases/s56-b-consolidation-20260827T095812Z`
|
||||
|
||||
## 发布结果
|
||||
|
||||
当前服务已全部留在 Server B。Recording Worker 使用 `RECORDING_SOURCE_MODE=local` 读取
|
||||
`/dev/shm/voip_rec/ready`,不再连接 A,也不再产生录音 SSH 子进程。A 未执行任何配置修改或停机操作;B 上旧 SSH 文件暂留作短期回滚材料,但不被当前 env 和进程引用。
|
||||
|
||||
## 代码与配置
|
||||
|
||||
- 新增 `LocalRecordingClient`,保留大小校验、SHA-256、临时文件、原子改名、数据库 upsert 和成功后删除源文件的原语义。
|
||||
- 新增 B finalizer service/timer,每 5 秒将稳定 WAV/MP3 从 `incoming` 推进到 `ready`。
|
||||
- Recording Worker 使用 `SupplementaryGroups=rtpengine` 与 `BindPaths=/dev/shm/voip_rec/ready`;持久化目录仍为 `/data/recordings`。
|
||||
- finalizer 的 `fuser` 调用已按 B 的 psmisc 实现改为兼容语法。
|
||||
- 未修改 TLS、数据库 schema、SIP/RTP 监听地址、防火墙、A 或 T。
|
||||
|
||||
## 备份与回滚点
|
||||
|
||||
- 最终 MySQL 备份:`/data/backups/mysql/20260827T095812Z`
|
||||
- 最终 Redis 备份:`/data/backups/redis/20260827T095813Z`
|
||||
- 最终配置备份:`/var/backups/lisglosips-s56/20260827T095812Z`
|
||||
- 上一可用 release:`/opt/lisglosips/releases/s56-b-consolidation-20260827T093227Z`
|
||||
|
||||
发布脚本会在失败时恢复 previous release、Recording Worker env 与 systemd drop-in,并重启旧 Worker。回滚不删除已持久化录音。
|
||||
|
||||
## 验证证据
|
||||
|
||||
| 检查 | 结果 |
|
||||
| --- | --- |
|
||||
| 定向 Vitest | `apps/worker-recording/src/transfer.spec.ts` 5/5 通过 |
|
||||
| TypeScript / ESLint | Recording Worker 构建及三个变更文件 lint 通过 |
|
||||
| 发布 preflight | MySQL、Redis、Nginx、API、全部 Worker、HOMER、Prometheus、Grafana 通过 |
|
||||
| 核心服务 | OpenSIPS、RTPEngine、Recording Daemon、Web/API/DB/Worker 全部 active |
|
||||
| API 与首页 | readiness HTTP 200;首页 HTTP 200 |
|
||||
| Worker 模式 | 启动日志为 `sourceMode=local`、`sourceDir=/dev/shm/voip_rec/ready` |
|
||||
| 稳定性 | 连续运行 1100 秒,`NRestarts=0`,超过旧 SSH 约 135 秒失败周期 |
|
||||
| SSH 依赖 | Worker 子进程为空;只存在系统管理用 sshd/运维会话 |
|
||||
| 目录可见性 | 主机与 Worker 命名空间 ready 目录设备号/inode 同为 `27:7` |
|
||||
| finalizer 隔离测试 | 19 字节测试文件成功形成 `.ready`,权限 `0640 rtpengine:rtpengine`,测试目录已清理 |
|
||||
| 生效文件一致性 | systemd drop-in 与 finalizer 的仓库/服务器 SHA-256 分别一致 |
|
||||
|
||||
## 剩余验收
|
||||
|
||||
本次未主动发起真实外呼,避免生成计费、CDR 和业务录音。下一次受控真实呼叫需要核对:
|
||||
|
||||
1. Recording Daemon 在 B 生成 `incoming` 文件。
|
||||
2. finalizer 生成 `.ready`。
|
||||
3. Worker 写入 `/data/recordings` 并将数据库状态更新为 `READY`。
|
||||
4. 有 `recordings.play` 权限的账号可播放,直接访问 Nginx internal 路径仍返回 404。
|
||||
Reference in New Issue
Block a user