Files
lisglosips/docs/20260827_SERVER_B_CONSOLIDATION_RELEASE_REPORT.md

3.0 KiB
Raw Permalink Blame History

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=rtpengineBindPaths=/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=localsourceDir=/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。