release: prepare RealeseV2.3

This commit is contained in:
hectorzhao
2026-08-06 10:48:36 +08:00
parent 57b58f1c40
commit 8ad8e61793
37 changed files with 997 additions and 64 deletions
+42
View File
@@ -3171,3 +3171,45 @@ git diff --check
- 发布后API、Gateway、Nginx、PostgreSQL、Redis、MinIO均active12026、17890、8090、3000、6379、5432和9000均监听;内网API/Gateway/MinIO health通过,公网首页、运营端、客户端和API health均HTTP 200,公网CMPP 17890 TCP可连接。Redis返回`PONG``gateway.submit.commands`消费者1、pending=0、lag=0、entries-read=3270;观察窗口后API/Gateway error级journal仍为0120秒内活跃下游客户连接为0。
- 供应商通道重启后3条保持connected 1/1`会员营销-铁布衫``赛邮行业-王斯评中转``赛邮行业-王斯评中转副本``会员营销-富泷`由发布前connected 1/1变为failed 0/1,观察窗口复查仍为`authentication / connect response status: auth failed`;保留系统自动重连,没有修改其账号、密码或启停状态。
- 依赖缓解安全门禁通过。npm audit仍为已知前端2项high(项目未使用的React Router RSC路径)和API 3项moderatePrisma开发工具链),未执行破坏性自动升级。本次没有发送、重投或补发真实短信,没有修改企业余额、客户连接或真实通道配置。
## 2026-08-05 HTTPS 双域名与 HTTP API 公网地址配置(服务器配置完成,业务代码未提交)
- `sms.lisglo.com` 已使用匹配 `*.lisglo.com` 的 Cloudflare Origin CA 证书和 `SESSION_COOKIE_SECURE=true`;Nginx 只监听 443/旧切换端口 12026,不监听 80。新增基于原始 TCP 对端 `$realip_remote_addr` 的 Cloudflare 网段限制,并启用 Cloudflare 全局 Authenticated Origin Pulls:橙云公网健康接口返回 200,直连源站并指定 `sms.lisglo.com` SNI 因缺少 Cloudflare 客户端证书返回 400,避免绕过 Cloudflare WAF。
- 新增 `/usr/local/sbin/update-cloudflare-nginx-ranges` 与 systemd timer,每日从 Cloudflare 官方 IPv4/IPv6 列表生成 Real-IP 与源站判定配置;更新前校验格式和最小网段数、执行 `nginx -t`,失败时保留旧配置。当前列表为 IPv4 15 段、IPv6 7 段,下一次计划执行时间由 timer 随机延迟确定。
- `api.lisglo.com` 灰云 A 记录已真实解析到 `8.160.169.106`。已创建仅限 `lisglo.com` DNS 编辑的 Cloudflare 用户 API Token,使用 Certbot 5.7.0 和 DNS-01 签发独立 ECDSA Lets Encrypt 证书,有效期至 2026-11-03;凭据文件仅 root 可读(0600),一次性中转文件和本地剪贴板已清理。新增独立 API-only Nginx 虚拟主机,只放行 `/api/health``/api/openapi/v1/``/api/client-docs`,管理页面、客户端页面、运营/客户端私有 API 均返回 404。
- 本地业务代码增加后端环境变量 `HTTP_API_PUBLIC_ORIGIN`,由真实配置 API 返回 `publicOrigin`;运营端参数复制、客户端接口概览/复制和 Swagger 链接统一使用 `https://api.lisglo.com`,不再错误沿用管理页面 `window.location.origin`。同步更新首版需求、`TC-HTTP-PUBLIC-ORIGIN-001`、环境示例和部署手册。
- 新增 `cmpp-letsencrypt-renew.timer` 每日检查续期,续期成功后先执行 `nginx -t` 再 reloadLets Encrypt staging dry-run 已成功。公网验证结果为 `sms` 健康接口 200、`api` 健康接口和客户 Swagger 200、OpenAPI 未认证请求 401、`api` 根路径/管理与客户端入口/私有 API 404;`api` 直连源站使用可信 Let’s Encrypt 证书并返回 200。
- 本轮服务器配置备份位于 `/opt/cmpp-platform-backups/config/20260805-100601-cloudflare-origin-restriction``20260805-102234-api-letsencrypt``20260805-102550-sms-aop``20260805-102614-http-api-origin-env`。未修改防火墙、安全组、CMPP 17890、短信数据、通道、余额或客户连接;业务代码保持未提交、未推送、未部署,生产环境变量已预置但需代码发布后页面才会展示新的公网 API 地址。
## 2026-08-05 旧 IP:12026 登录短时过渡与撤销(已恢复 HTTPS-only,未提交)
- 真实故障确认为 HTTPS 切换后服务器设置 `SESSION_COOKIE_SECURE=true`API 发送的 Secure 会话 Cookie 无法被 `http://8.160.169.106:12026` 接收;因此登录接口成功后,受保护页面恢复会话失败并重新跳回登录页。
- 为保留旧 IP 登录入口,预生产环境临时改为 `SESSION_COOKIE_SECURE=false` 并只重启 `cmpp-api.service`。进程环境已确认读取 `false`API 服务 active 且重启后无 error 级 journal;IP 首页、运营登录页和健康接口均返回 200,`sms.lisglo.com` 经 Cloudflare/AOP 的健康接口及 `api.lisglo.com` 健康接口也均返回 200。
- 该短时方案保留了 `HttpOnly``SameSite=Lax` 和运营/客户端独立 Cookie,但 HTTPS 入口也会使用非 Secure 的过渡期 Cookie,已有登录用户可能需要重新登录;用户随后决定不接受该长期代价。临时调整前的配置备份位于 `/opt/cmpp-platform-backups/config/20260805-105501-ip-login-cookie-compat`
- 用户复核安全代价后决定不再保留 IP 直接登录,也暂不新增灰云管理域名证书。预生产已于 11:04 将 `SESSION_COOKIE_SECURE` 恢复为 `true` 并只重启 API;进程环境确认读取 `true``sms.lisglo.com` 经 Cloudflare/AOP 与 `api.lisglo.com` 健康接口均返回 200API active 且重启后无 error 级日志。12026 当前仍监听并可健康检查,但不再是受支持的登录入口;恢复前配置备份位于 `/opt/cmpp-platform-backups/config/20260805-110427-restore-secure-cookie`
- 同步撤销首版需求和系统测试用例中的 IP 登录兼容要求,部署规范明确只支持 HTTPS 登录;本次未新增证书、未修改 Nginx、Cloudflare、防火墙或安全组,也未提交、推送或部署业务代码。
## 2026-08-05 运营端待审核角标轻量轮询(本地未提交)
- 新增真实后端 `GET /api/admin/operations/pending-audits`,仅并发统计企业认证、短信审核、模板、签名和引流信息五类待审数量及总数,复用运营看板原有口径,不执行发送、账务、连接、下游投递和趋势等看板查询。
- 运营端全局布局的首次加载、30 秒轮询、窗口重新获得焦点和审核刷新事件已改用轻量接口,不再调用 `/api/admin/operations/dashboard/statistics`;运营看板页本身仍保留完整统计接口。
- 新增服务层单元测试,校验五类数量口径、总数和租户边界,并断言该路径不执行短信状态聚合或看板原始 SQL。
- 本地验证通过:针对性 `operations.service.spec.ts` 27/27API 全量 32 suites / 409 testsAPI TypeScript 构建、前端 TypeScript 检查、Vite 生产构建和 `git diff --check`均通过。Vite 仍有已知大 chunk 警告,与本次接口替换无关。
- 本地 `4173` 前端登录页标题、DOM 和主要控件可正常渲染;本地未运行真实 API,图形验证码请求返回 502,因此未伪造登录或进行登录后端到端轮询验收。本次未提交、推送、部署,也未发送或重投短信,未修改通道、余额或客户连接。
## 2026-08-06 供应商长短信整条级成功回执与网关异常双Tab(本地未提交)
- 运营菜单“Gateway提交异常”更名为“网关异常”,保留原`/admin/gateway-submit-exceptions`路由;页面拆为“提交异常”和“回执异常”两个Tab。提交异常继续使用既有真实死信接口,回执异常使用新增`GET /api/admin/operations/receipt-anomalies`,两处均在标题区解释数据来源、业务含义、不能代表的结论和人工处理注意事项。
- 通道配置新增`longMessageReceiptMode`:默认`per_segment`保持逐分片聚合;仅供应商明确采用整条级成功口径时配置`message_level`。后一模式收到当前提交尝试的一条成功回执后,只将同次提交尚无回执的分片标记为推断成功,并写`compensationType=supplier_message_level_receipt`;供应商真实回执仍只保存实际收到的一条,不伪造原始回执。
- 新增`SmsReceiptAnomaly`及migration`20260806100000_add_receipt_anomalies`。整条级成功已经形成`delivered`后,同一提交尝试再到明确失败时,保留原始失败回执和分片证据,不改写已送达终态、不重复退款/补发、不向客户推送矛盾失败;异常按消息和提交尝试稳定键upsert,重复事件累加发生次数,并可在回执异常Tab分页、筛选和查看结构化详情。
- 新增发送链、通道配置和运营查询回归,针对性3 suites / 178 tests通过;API全量32 suites / 413 tests通过。API TypeScript构建、前端TypeScript、Vite生产构建、Prisma schema validate/generate、R2运营查询/R5通道/R10发送完成结构门禁和`git diff --check`均通过。Vite仍有既有大chunk告警;Jest仍需`--forceExit`结束既有开放句柄。
- `docs/contracts/operations-r2-methods.json`按当前组合工作区同步:`pendingAudits`和dashboard哈希属于此前“待审核角标轻量轮询”会话,本轮仅新增回执异常契约/查询,并为同文件当前行尾结果刷新受影响的既有哈希,未把前一会话业务改动归入本需求。
- 本轮未应用migration到本地或预生产数据库,未连接预生产、未发送/补发/重投短信,未修改真实通道配置、账号密码、启停状态、企业余额或客户连接;代码按要求保持未提交、未推送、未部署。`*.tsbuildinfo``outputs/`和空文件`=`继续作为其他会话/构建产物保留,不删除、不提交、不归因。
## 2026-08-06 `RealeseV2.3` 工作区合并与推送前验证
- 用户授权将当前工作区全部有效业务代码合并、提交并推送,版本名称按用户给出的精确拼写定为`RealeseV2.3`。合并范围包括:HTTPS双域名与HTTP API公网地址、运营端待审核角标轻量轮询、供应商长短信整条级成功回执及网关异常双Tab;三组需求、测试、部署说明和进度记录均随代码纳入。
- `git fetch --prune --tags`后本地`HEAD``origin/main`均为`57b58f1c4052691531941e0fbda02e43ce2fea87`,分歧为0/0,因此没有远端提交需要合并,也没有源代码文本冲突。既有annotated恢复标签`RealseV2.0`仍有效并指向`c0a4317a7ea641bab39294e596f58f859edfca73`;本轮只提交和推送,不部署、不执行migration。
- 合并后同步结构契约:R1登记`getPendingAudits/listReceiptAnomalies`及当前重入队实现,R2登记轻量审核和回执异常查询,R5/R10登记长短信回执口径及处理变化;R6清单的5个声明哈希与当前`main`既有Gateway源码重新对齐,Gateway业务源码没有工作区改动。全部结构门禁随后通过。
- 发布前验证通过:API全量32 suites / 413 testsAPI TypeScript构建;前端TypeScript与Vite生产构建;Prisma schema validate/generateGateway `go test ./... -count=1``go vet ./...`19个`.mjs`结构门禁、R6/R7 Go结构门禁、依赖缓解安全门禁和`git diff --check`。Vite仍只有既有大chunk警告,Jest仍使用`--forceExit`结束既有开放句柄。
- 提交范围排除`api/tsconfig.build.tsbuildinfo`、根目录`tsconfig.tsbuildinfo``outputs/`和空文件`=`;这些缓存或临时产物继续保留在工作区,不删除、不提交。本轮未连接或修改生产/预生产服务、数据库、通道、余额或客户连接,未发送、补发或重投真实短信。