From 7ff019e829060667b2d9b6db0b22494fa4124f3b Mon Sep 17 00:00:00 2001 From: hectorzhao Date: Tue, 30 Jun 2026 14:19:38 +0800 Subject: [PATCH] record 20260630release baseline --- IMPLEMENTATION_STATUS.md | 18 ++- docs/20260630_RELEASE_BASELINE_REPORT.md | 141 ++++++++++++++++++ .../reports/REMOTE_SMOKE_20260630T061636Z.md | 24 +++ 3 files changed, 179 insertions(+), 4 deletions(-) create mode 100644 docs/20260630_RELEASE_BASELINE_REPORT.md create mode 100644 tests/reports/REMOTE_SMOKE_20260630T061636Z.md diff --git a/IMPLEMENTATION_STATUS.md b/IMPLEMENTATION_STATUS.md index 310dae4..fff0910 100644 --- a/IMPLEMENTATION_STATUS.md +++ b/IMPLEMENTATION_STATUS.md @@ -4,10 +4,10 @@ ## 当前状态 -- 当前任务:菜单展开 Logo 增加 SIP 文字并发布到 B -- 本次变更摘要:已核对 `tests/reports/` 下 8.2-8.10 远程测试结果;修复客户充值接口负数扣款、active call hangup 超长/无分隔 ID 参数校验、Fastify 路由参数长度限制,以及既有环境号码库内置角色权限补齐迁移。追加修复业务前缀管理页面 `normalizeBusinessPrefix is not defined`、号码库页面 `emptyNumberLibraryRows is not defined`、客户网关编辑触发 React #137 的前端运行时错误。最新 s53 在菜单展开 Logo 后增加 `SIP` 文字,收起菜单仍展示 `logo2`,并发布 Web-only release。新增测试门禁:`pnpm lint` 覆盖 `apps/web/src/**`,`pnpm test:remote-web-ui` 使用真实浏览器登录并逐个点击核心菜单及每页一个安全主操作,客户网关编辑动作会验证业务前缀 checkbox 可 false->true->false 往返切换。B 当前 release 为 `s53-brand-logo-sip-text-20260630105500`;准备提交 Git。 -- 总体状态:S30 已完成;本地 KVM 开发环境 V2 闭环原冻结 release 为 `s28-v2-20260621220924`;B 二期冻结基线为 `s42-phase2-business-prefix-20260624140000`,当前 release 为 `s53-brand-logo-sip-text-20260630105500`;2026-06-30 开机后已恢复 A/B/T 服务:A `opensips`、`rtpengine-daemon`、`rtpengine-recording-daemon`、`lisglosips-redis-auth-proxy`、`lisglosips-node-exporter`、`lisglosips-recording-finalize.timer` active,`lisglosips-redis-hotpath-load.service` Result=success;B `mysql`、`redis-server`、`nginx`、`lisglosips@api`、`lisglosips@cdr-worker`、`lisglosips@recording-worker`、`lisglosips@config-publisher`、`heplify-server`、`lisglosips-prometheus`、`grafana-server` active,preflight ok,API ready ok;T `opensips`、`rtpengine-daemon`、`rtpengine-recording-daemon`、`lisglosips-s28-uas`、`apache2`、`mariadb/mysql` active;三机 `systemctl --failed` 均为 0。B preflight、远程 smoke、8.2/8.7/8.8 定向复测均通过;业务前缀、号码库、客户网关编辑与前缀选择 Web-only 修复后,s53 当前首页引用 Web JS `index-CrjpbrU-.js`、CSS `index-CrJGI5_R.css`,并包含 `/favicon.ico`、`/brand/logo1.png`、`/brand/logo2.png`;远程 smoke `REMOTE_SMOKE_20260630T031146Z.md` 通过;完整按钮级远程浏览器巡检 `REMOTE_WEB_UI_SMOKE_20260629T104040Z.md` 通过,覆盖 15 个核心菜单及安全主操作,客户网关管理编辑报告包含 `business-prefix-checkbox-toggle-ok: false->true->false`;B 本机号码库四个列表接口均返回 200,当前 total 均为 0,符合真实号段尚未导入状态;本地代码验证 `lint`、`typecheck`、全量 `test`、`build`、`node --check tests/web/remote-web-ui-smoke.mjs` 均通过;Redis `cfg:active_version=s28-v1`,A 当前 EVALSHA 脚本在 Redis 中存在;A 已加载二期 Lua 热路径 SHA1 `aff9995dbda2a2425e95a3e25b5d7ce194348ce7`;当前仍未导入真实 80 万手机号段;阿里云迁移前需按 S30 Runbook 重新演练 -- 最后更新:2026-06-30 11:12 +08:00 +- 当前任务:`20260630release` 稳定版封版 +- 本次变更摘要:已核对 `tests/reports/` 下 8.2-8.10 远程测试结果;修复客户充值接口负数扣款、active call hangup 超长/无分隔 ID 参数校验、Fastify 路由参数长度限制,以及既有环境号码库内置角色权限补齐迁移。追加修复业务前缀管理页面 `normalizeBusinessPrefix is not defined`、号码库页面 `emptyNumberLibraryRows is not defined`、客户网关编辑触发 React #137 的前端运行时错误。最新 s53 在菜单展开 Logo 后增加 `SIP` 文字,收起菜单仍展示 `logo2`,并发布 Web-only release。已将稳定代码提交 `9920575bbae7fbef4929843632f94d687ffbe289` 标记为 `20260630release`,并创建稳定分支 `stable/20260630release`;B 当前 release 为 `s53-brand-logo-sip-text-20260630105500`。 +- 总体状态:S30 已完成;本地 KVM 开发环境 V2 闭环原冻结 release 为 `s28-v2-20260621220924`;B 二期冻结基线为 `s42-phase2-business-prefix-20260624140000`,当前 release 为 `s53-brand-logo-sip-text-20260630105500`;稳定版名称 `20260630release`,Git tag `20260630release` 和分支 `stable/20260630release` 均指向稳定代码提交 `9920575bbae7fbef4929843632f94d687ffbe289`。2026-06-30 开机后已恢复 A/B/T 服务:A `opensips`、`rtpengine-daemon`、`rtpengine-recording-daemon`、`lisglosips-redis-auth-proxy`、`lisglosips-node-exporter`、`lisglosips-recording-finalize.timer` active,`lisglosips-redis-hotpath-load.service` Result=success;B `mysql`、`redis-server`、`nginx`、`lisglosips@api`、`lisglosips@cdr-worker`、`lisglosips@recording-worker`、`lisglosips@config-publisher`、`heplify-server`、`lisglosips-prometheus`、`grafana-server` active,preflight ok,API ready ok,封版 MySQL 备份 `/data/backups/mysql/20260630T061723Z`,Redis 备份 `/data/backups/redis/20260630T061723Z`;T `opensips`、`rtpengine-daemon`、`rtpengine-recording-daemon`、`lisglosips-s28-uas`、`apache2`、`mariadb/mysql` active。B preflight、远程 smoke、8.2/8.7/8.8 定向复测均通过;业务前缀、号码库、客户网关编辑与前缀选择 Web-only 修复后,s53 当前首页引用 Web JS `index-CrjpbrU-.js`、CSS `index-CrJGI5_R.css`,并包含 `/favicon.ico`、`/brand/logo1.png`、`/brand/logo2.png`;封版远程 smoke `REMOTE_SMOKE_20260630T061636Z.md` 通过;完整按钮级远程浏览器巡检 `REMOTE_WEB_UI_SMOKE_20260629T104040Z.md` 通过,覆盖 15 个核心菜单及安全主操作,客户网关管理编辑报告包含 `business-prefix-checkbox-toggle-ok: false->true->false`;封版报告为 `docs/20260630_RELEASE_BASELINE_REPORT.md`;当前仍未导入真实 80 万手机号段;阿里云迁移前需按 S30 Runbook 重新演练 +- 最后更新:2026-06-30 14:20 +08:00 - 当前阻塞:本轮 8.2/8.7/8.8、业务前缀页面、号码库页面、客户网关编辑运行时错误、测试门禁修复、B SSH/HTTPS 来源限制移除无阻塞。遗留问题:未提交 Git;未改 A OpenSIPS/Lua/RTPEngine 或 T 配置;8.9 轻量 API burst p95 超过 10 秒需结合服务端日志和测试方式继续定位;SIP CPS 探针中 BYE 被 `403 Rate Limited` 属 A 侧限流策略问题,修复前需说明影响、备份 A 配置并安排维护窗口;8.10 备份、隔离恢复、真实回滚、OpenSIPS 配置恢复受权限或维护窗口阻塞;真实 80 万手机号段尚未导入;OpenSIPS dialog 残留根因仍待单独分析。 - 当前环境:A/B/T 为本地 KVM 开发服务器,通过 Tailscale 联调;开发完成后再迁移阿里云 - 私密访问资料:`.codex-private/SERVER_ACCESS.md`,只在实际连接时读取,禁止回显 @@ -90,6 +90,16 @@ ## 交接记录 +### 2026-06-30 14:20 - `20260630release` 稳定版封版 + +- 状态:已完成 +- 操作服务器:本地、A、B、T;未改业务代码,未发布新 release,未改数据库 schema +- 完成内容:将稳定代码提交 `9920575bbae7fbef4929843632f94d687ffbe289` 打 tag `20260630release`,创建分支 `stable/20260630release`;触发 B `lisglosips-backup.service` 生成封版 MySQL/Redis 备份;采集 A/B/T 服务状态、OpenSIPS 配置校验和关键 SHA;生成封版报告 `docs/20260630_RELEASE_BASELINE_REPORT.md`。 +- 修改文件:`docs/20260630_RELEASE_BASELINE_REPORT.md`、`IMPLEMENTATION_STATUS.md`、新增 smoke 报告 `tests/reports/REMOTE_SMOKE_20260630T061636Z.md` +- 验证结果:B current 为 `/opt/lisglosips/releases/s53-brand-logo-sip-text-20260630105500`;B backup result `success`,MySQL 备份 `/data/backups/mysql/20260630T061723Z`,Redis 备份 `/data/backups/redis/20260630T061723Z`;B preflight ok;远程 smoke `REMOTE_SMOKE_20260630T061636Z.md` 通过;A OpenSIPS 配置 SHA256 `f163fa37f7aaa492e12ed496cb82f07d9b0f1030a6ed297855a22d2c4bf1c8a5`,热路径 Lua SHA1 `aff9995dbda2a2425e95a3e25b5d7ce194348ce7`,热路径加载 `success`;T OpenSIPS 配置 SHA256 `5255dd540d33c3a7bf3db278fe6fe39540b176eb79e7fe12a7a26e5217c263da`;A/T `fwupd-refresh.service` failed 为既有无关遗留。 +- 回滚方式:代码回滚可执行 `git checkout 20260630release` 或 `git switch stable/20260630release`;B 应用回滚可将 `/opt/lisglosips/current` 指回 `/opt/lisglosips/releases/s53-brand-logo-sip-text-20260630105500` 并重启 API/Worker、reload Nginx;数据恢复使用封版备份前必须先在隔离环境验证。 +- 未解决问题:真实 80 万手机号段尚未导入;8.9/8.10 既有遗留问题未处理;A/T `fwupd-refresh.service` failed 未处理。 + ### 2026-06-30 11:12 - Web-only s53 菜单展开 Logo 增加 SIP - 状态:已完成 diff --git a/docs/20260630_RELEASE_BASELINE_REPORT.md b/docs/20260630_RELEASE_BASELINE_REPORT.md new file mode 100644 index 0000000..6c79636 --- /dev/null +++ b/docs/20260630_RELEASE_BASELINE_REPORT.md @@ -0,0 +1,141 @@ +# LisgloSIPS V2 20260630release 稳定版封版报告 + +## 封版信息 + +| 项目 | 值 | +| --- | --- | +| 稳定版名称 | `20260630release` | +| 封版时间 | 2026-06-30 14:18 +08:00 | +| Git commit | `9920575bbae7fbef4929843632f94d687ffbe289` | +| B current release | `/opt/lisglosips/releases/s53-brand-logo-sip-text-20260630105500` | +| Web 验收地址 | `https://100.90.90.91/` | + +## Git 基线 + +封版 tag 与稳定分支: + +- Tag:`20260630release` +- Branch:`stable/20260630release` + +后续开发应从该 tag 或分支新建功能分支;需要恢复代码时,可 checkout tag 或 stable 分支。 + +## 服务器基线 + +### A / TonyHouse + +| 项目 | 值 | +| --- | --- | +| Tailscale IP | `100.90.90.90` | +| OpenSIPS 配置 SHA256 | `f163fa37f7aaa492e12ed496cb82f07d9b0f1030a6ed297855a22d2c4bf1c8a5` | +| 热路径 Lua SHA1 | `aff9995dbda2a2425e95a3e25b5d7ce194348ce7` | +| 热路径加载结果 | `success` | +| OpenSIPS 监听 | `100.90.90.90:15060/udp`、`100.90.90.90:9061/hep_udp` | + +服务状态: + +- `opensips`: active +- `rtpengine-daemon`: active +- `rtpengine-recording-daemon`: active +- `lisglosips-redis-auth-proxy`: active +- `lisglosips-node-exporter`: active +- `lisglosips-recording-finalize.timer`: active + +已知无关 failed unit: + +- `fwupd-refresh.service` + +### B / YanZi + +| 项目 | 值 | +| --- | --- | +| Tailscale IP | `100.90.90.91` | +| Current release | `/opt/lisglosips/releases/s53-brand-logo-sip-text-20260630105500` | +| MySQL 封版备份 | `/data/backups/mysql/20260630T061723Z` | +| Redis 封版备份 | `/data/backups/redis/20260630T061723Z` | +| Backup service result | `success` | +| Preflight | `preflight ok` | + +服务状态: + +- `mysql`: active +- `redis-server`: active +- `nginx`: active +- `lisglosips@api`: active +- `lisglosips@cdr-worker`: active +- `lisglosips@recording-worker`: active +- `lisglosips@config-publisher`: active +- `heplify-server`: active +- `lisglosips-prometheus`: active +- `grafana-server`: active + +API ready: + +```json +{"status":"ok","service":"api","checks":{"config":"ok","database":"ok","redis":"ok"}} +``` + +### T / SteveTable + +| 项目 | 值 | +| --- | --- | +| Tailscale IP | `100.93.185.30` | +| OpenSIPS 配置 SHA256 | `5255dd540d33c3a7bf3db278fe6fe39540b176eb79e7fe12a7a26e5217c263da` | +| OpenSIPS 监听 | `100.93.185.30:5060/udp` | + +服务状态: + +- `opensips`: active +- `rtpengine-daemon`: active +- `rtpengine-recording-daemon`: active +- `lisglosips-s28-uas`: active +- `apache2`: active +- `mariadb`: active + +已知无关 failed unit: + +- `fwupd-refresh.service` + +## 验证结果 + +- B release preflight:通过 +- 远程 Web/API smoke:通过,报告 `tests/reports/REMOTE_SMOKE_20260630T061636Z.md` +- 最近完整按钮级浏览器巡检:通过,报告 `tests/reports/REMOTE_WEB_UI_SMOKE_20260629T104040Z.md` +- A OpenSIPS 配置检查:通过 +- T OpenSIPS 配置检查:通过 + +## 回滚方式 + +### 代码回滚 + +```bash +git checkout 20260630release +# 或 +git switch stable/20260630release +``` + +### B 应用回滚到封版 release + +```bash +sudo ln -sfn /opt/lisglosips/releases/s53-brand-logo-sip-text-20260630105500 /opt/lisglosips/current +sudo systemctl restart lisglosips@api lisglosips@cdr-worker lisglosips@recording-worker lisglosips@config-publisher +sudo nginx -t +sudo systemctl reload nginx +sudo /opt/lisglosips/current/infra/server-b/s30/lisglosips-release-preflight.sh +``` + +### 数据恢复点 + +封版备份: + +- MySQL:`/data/backups/mysql/20260630T061723Z` +- Redis:`/data/backups/redis/20260630T061723Z` + +生产式数据库恢复前必须先在隔离环境验证备份可恢复性,再安排维护窗口执行。 + +## 后续开发约束 + +- 新功能或修复从 `stable/20260630release` 或 `20260630release` 新建分支。 +- B 服务器发布必须新增 release 目录,不覆盖 `s53-brand-logo-sip-text-20260630105500`。 +- A/B/T 服务器配置修改前必须先备份配置并记录回滚命令。 +- 数据库 schema、服务重启、服务器写操作、SSH、防火墙、数据删除、生产式迁移前,必须先说明影响、风险和回滚点。 + diff --git a/tests/reports/REMOTE_SMOKE_20260630T061636Z.md b/tests/reports/REMOTE_SMOKE_20260630T061636Z.md new file mode 100644 index 0000000..1f08e2f --- /dev/null +++ b/tests/reports/REMOTE_SMOKE_20260630T061636Z.md @@ -0,0 +1,24 @@ +# Remote Smoke Test Report + +Date: 2026-06-30T06:16:36.256Z +Base URL: https://100.90.90.91 +Timeout: 30000ms +Attempts: 2 + +| Result | Check | Detail | +| --- | --- | --- | +| PASS | / returns 200 | status=200, duration=5724ms, attempt=1 | +| PASS | frontend HTML contains app root | contentType=text/html, bytes=466, attempt=1 | +| PASS | /api/v2/health/live returns 200 | status=200, duration=596ms, attempt=1 | +| PASS | live health reports ok | body={"status":"ok","service":"api","timestamp":"2026-06-30T06:16:35.041Z","checks":{"process":"ok"}} | +| PASS | /api/v2/health/ready returns 200 | status=200, duration=158ms, attempt=1 | +| PASS | ready health reports database and redis ok | body={"status":"ok","service":"api","timestamp":"2026-06-30T06:16:35.202Z","checks":{"config":"ok","database":"ok","redis":"ok"}} | +| PASS | /api/v2/auth/captcha returns 200 | status=200, duration=1793ms, attempt=1 | +| PASS | captcha endpoint returns id, image, and expiry | captchaId=df88f31f-3a39-4fc9-b60d-2ecda12f8446, expiresAt=2026-06-30T06:21:36.991Z, attempt=1 | + +## Raw Endpoints + +- /: status=200, duration=5724ms, attempt=1, contentType=text/html +- /api/v2/health/live: status=200, duration=596ms, attempt=1, contentType=application/json; charset=utf-8 +- /api/v2/health/ready: status=200, duration=158ms, attempt=1, contentType=application/json; charset=utf-8 +- /api/v2/auth/captcha: status=200, duration=1793ms, attempt=1, contentType=application/json; charset=utf-8