fix: polish channel groups and add production deployment
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
|
||||
本文基于当前前端设计原型整理,用于交给 Codex 或开发团队执行第一版落地开发。
|
||||
|
||||
当前确认:第一版保留短信业务,排除彩信功能;账户计费、充值套餐、账单流水进入第一版开发范围。彩信服务、彩信应用/签名/模板 Tab,以及运营端彩信相关菜单标记为“待开发”;业务性能指标为“平台可稳定入队并调度 500 条短信/秒,实际向通道 submit 受通道限速配置控制”。
|
||||
当前确认:第一版保留短信业务,排除彩信功能;账户计费、充值套餐、充值记录进入第一版开发范围,账单流水页面和公开交易查询 API 暂不进入第一版。彩信服务、彩信应用/签名/模板 Tab,以及运营端彩信相关菜单标记为“待开发”;业务性能指标为“平台可稳定入队并调度 500 条短信/秒,实际向通道 submit 受通道限速配置控制”。
|
||||
|
||||
## 1. 项目目标
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
- 支持通道级限速、失败重试、回执同步和发送记录追踪。
|
||||
- 支持企业、应用、签名、模板、通道、通道组、报备任务等核心配置数据的后台维护。
|
||||
- 彩信功能仅保留菜单占位或隐藏,不进入第一版开发范围。
|
||||
- 账户计费、充值套餐、账单流水进入第一版范围,并与发送记录形成可对账闭环。
|
||||
- 账户计费、充值套餐、充值记录进入第一版范围,并与发送记录形成可对账闭环;账单流水页面暂不验收。
|
||||
|
||||
## 2. 角色与权限
|
||||
|
||||
@@ -154,7 +154,7 @@
|
||||
19. 新建或启用通道后,系统应立即创建/更新默认 CMPP 连接状态为 connecting 并通知 Go Gateway 发起连接;如果 connecting 超过 30 秒仍未收到 Gateway 回写 connected 或 failed,API 后台兜底任务必须将该连接标记为 failed,写入 `lastError=Gateway connection request timed out after 30 seconds` 和连接日志。默认扫描间隔 5 秒,可通过环境变量调整。
|
||||
20. 通道异常时应支持熔断、降级、切换备用通道和失败重试;失败补发必须在同一企业应用授权的通道组范围内执行,并使用触发补发时的当前通道组配置,保证计费、退款、幂等和 trace 可追踪。
|
||||
21. 失败补发除以下情况外均应触发:短信状态为 unknown;距离客户提交时间超过 72 小时;距离客户提交时间超过通道组配置的补发时间上限;通道组关闭失败补发。
|
||||
22. 通道组补发时间上限由运营端配置,最大不得超过 72 小时;本期不配置最大补发次数、补发间隔、失败类型白名单或人工重发能力,进入最终 failed/timeout 后不再人工重发。
|
||||
22. 通道组补发时间上限由运营端配置,交互为“小时 + 分钟”,默认 12 小时 0 分钟,最小 1 分钟,最大不得超过 72 小时;真实发送链路按分钟级上限判断是否继续补发。本期不配置最大补发次数、补发间隔、失败类型白名单或人工重发能力,进入最终 failed/timeout 后不再人工重发。
|
||||
23. 提交 accepted 后立即按企业应用配置的客户费率扣费;补发过程中最终成功只扣一次,submit failed 未真正发出时释放冻结且不扣费;failed receipt 导致最终全失败时退款;本期客户计费不使用通道成本价。
|
||||
|
||||
### 4.7 通道签名报备
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
# CMPP 平台生产部署手册
|
||||
|
||||
## 本次生产端口
|
||||
|
||||
- 运营端、客户端页面:`http://8.160.169.106:12026`
|
||||
- API:仅本机 `127.0.0.1:3000`,由 Nginx `/api/` 反向代理。
|
||||
- Redis:仅本机 `127.0.0.1:6379`。
|
||||
- PostgreSQL:仅本机 `127.0.0.1:5432`。
|
||||
- MinIO:仅本机 `127.0.0.1:9000/9001`,页面上传下载通过 API 转发。
|
||||
- Gateway 控制服务:仅本机 `127.0.0.1:8090`。
|
||||
- CMPP 入站端口:`17890` 已作为部署变量保留;当前 Go Gateway 代码尚未实现完整入站 CMPP Server,不要把 HTTP 控制服务误当作 CMPP 监听。
|
||||
|
||||
## 首次部署
|
||||
|
||||
1. 本机提交并推送 `main`。
|
||||
2. 使用 root 登录服务器,或先放置免密 SSH key。
|
||||
3. 在服务器执行:
|
||||
|
||||
```bash
|
||||
curl -fsSL http://175.27.255.91:3000/hectorzhao/lislgosms/raw/branch/main/tools/deploy/production-bootstrap.sh -o /root/production-bootstrap.sh
|
||||
bash /root/production-bootstrap.sh
|
||||
```
|
||||
|
||||
可覆盖的环境变量:
|
||||
|
||||
```bash
|
||||
APP_DIR=/opt/cmpp-platform
|
||||
REPO_URL=http://175.27.255.91:3000/hectorzhao/lislgosms.git
|
||||
BRANCH=main
|
||||
PUBLIC_HTTP_PORT=12026
|
||||
API_PORT=3000
|
||||
GATEWAY_CMPP_ADDR=0.0.0.0:17890
|
||||
PROD_ADMIN_EMAIL=admin@example.com
|
||||
PROD_ADMIN_USERNAME=prod_admin
|
||||
PROD_ADMIN_PASSWORD='change-me'
|
||||
```
|
||||
|
||||
脚本会安装 Node.js、Go、PostgreSQL、Redis、MinIO、Nginx,创建 systemd 服务,执行 Prisma migrate,构建前端/API/Gateway,并创建平台管理员。
|
||||
|
||||
## 后续发布
|
||||
|
||||
```bash
|
||||
cd /opt/cmpp-platform
|
||||
git fetch origin main
|
||||
git reset --hard origin/main
|
||||
bash tools/deploy/production-deploy.sh
|
||||
```
|
||||
|
||||
## 账号和密钥
|
||||
|
||||
- 生产管理员账号写入 `/root/cmpp-platform-admin.txt`。
|
||||
- 首次部署汇总凭据写入 `/root/cmpp-platform-credentials.txt`。
|
||||
- 这两个文件权限为 `600`,不要提交到 Git。
|
||||
- root 密码后续可修改;SSH 私钥放入 `/root/.ssh/authorized_keys` 后即可免密登录。
|
||||
|
||||
## 日志
|
||||
|
||||
```bash
|
||||
journalctl -u cmpp-api -f
|
||||
journalctl -u cmpp-gateway -f
|
||||
journalctl -u cmpp-minio -f
|
||||
tail -f /opt/cmpp-platform/logs/api/stderr.log
|
||||
tail -f /opt/cmpp-platform/logs/gateway/stderr.log
|
||||
```
|
||||
|
||||
## 健康检查
|
||||
|
||||
```bash
|
||||
curl http://127.0.0.1:3000/api/health
|
||||
curl http://127.0.0.1:8090/health
|
||||
curl http://127.0.0.1:12026/
|
||||
redis-cli -h 127.0.0.1 -p 6379 ping
|
||||
pg_isready -d "$(grep '^DATABASE_URL=' /etc/cmpp-platform/cmpp-platform.env | cut -d= -f2-)"
|
||||
```
|
||||
|
||||
## 回滚
|
||||
|
||||
1. 数据库备份:
|
||||
|
||||
```bash
|
||||
pg_dump "$(grep '^DATABASE_URL=' /etc/cmpp-platform/cmpp-platform.env | cut -d= -f2-)" > /opt/cmpp-platform/backups/cmpp-$(date +%F-%H%M%S).sql
|
||||
```
|
||||
|
||||
2. 回滚代码:
|
||||
|
||||
```bash
|
||||
cd /opt/cmpp-platform
|
||||
git reset --hard <上一版提交>
|
||||
bash tools/deploy/production-deploy.sh
|
||||
```
|
||||
|
||||
3. 如迁移造成不可兼容故障,先停服务,再恢复数据库备份。
|
||||
@@ -42,7 +42,7 @@
|
||||
| CMPP 连接闭环 | 通道连接状态、登录认证、active test、断线重连、连接异常对路由/发送影响、状态监控和日志告警。 |
|
||||
| Dashboard 闭环 | 客户端/运营端指标口径、数据范围、时间筛选、状态统计、账务统计、通道连接指标和明细跳转一致。 |
|
||||
| 内容校验闭环 | 非法字符展示、敏感词、控制字符、内容清洗或拒绝、计费不被非法字符干扰、错误原因可见。 |
|
||||
| 计费闭环 | 预估、余额校验、冻结、扣费、释放、退款、短信计费记录、账单流水、对账。 |
|
||||
| 计费闭环 | 预估、余额校验、冻结、扣费、释放、退款、短信计费记录、充值记录、对账。账单流水页面和公开交易查询 API 暂不纳入第一版验收。 |
|
||||
| 系统日志闭环 | 登录、创建、修改、删除、审核、导入导出、密钥重置、发送、报备、账务动作均可查询和定位操作者。 |
|
||||
|
||||
## 4. 客户端功能用例
|
||||
@@ -50,10 +50,10 @@
|
||||
### TC-CLIENT-001 登录与租户隔离
|
||||
|
||||
- 优先级:P0
|
||||
- 前置条件:存在 `tenant-a` 和 `tenant-b`,两个租户各有发送任务和账单流水。
|
||||
- 前置条件:存在 `tenant-a` 和 `tenant-b`,两个租户各有发送任务和充值/计费记录。
|
||||
- 步骤:
|
||||
1. 使用 `tenant-a` 企业管理员登录客户端。
|
||||
2. 打开工作台、批量任务、发送详情、上行短信、账单流水。
|
||||
2. 打开工作台、批量任务、发送详情、上行短信、充值套餐。
|
||||
3. 使用查询条件搜索 `tenant-b` 的任务编号或手机号。
|
||||
- 预期结果:
|
||||
- 登录成功,返回当前租户上下文。
|
||||
@@ -257,14 +257,17 @@
|
||||
5. 尝试在移动通道组中添加山东省网 item,但引用发送地区为河南的通道。
|
||||
6. 在同一通道组中为山东省重复添加第二个省网通道。
|
||||
7. 添加主通道优先级 10、备用全国通道优先级 20,并尝试添加另一个优先级 20 的全国通道。
|
||||
8. 创建租户/应用维度路由规则。
|
||||
9. 创建发送任务触发送链路。
|
||||
8. 配置补发时间上限为 12 小时 30 分钟并保存,再重新打开编辑页。
|
||||
9. 创建租户/应用维度路由规则。
|
||||
10. 创建发送任务触发送链路。
|
||||
- 预期结果:
|
||||
- 只能创建 mobile/unicom/telecom 通道组,三网通道组被拒绝。
|
||||
- 通道组明细 carrier 必须等于通道组运营商。
|
||||
- 通道组明细引用通道时必须满足通道本体能力兼容:移动组只允许 mobile/all,联通组只允许 unicom/all,电信组只允许 telecom/all。
|
||||
- 省网 item 的省份必须与通道发送地区一致。
|
||||
- 同一通道组内同一省份只能配置一个通道,全国通道可配置多个但优先级不能重复。
|
||||
- 省网通道和全国通道在添加/编辑页以表格展示,通道状态文案为“链接正常/通道停用”,且“链接正常”来自真实 CMPP 连接状态。
|
||||
- 补发时间上限按分钟级真实保存,12 小时 30 分钟回填为 12 小时 30 分钟。
|
||||
- 路由优先命中租户/应用规则。
|
||||
- 主通道 active 时选择主通道。
|
||||
- 主通道 disabled 时选择备用 active 通道。
|
||||
@@ -809,13 +812,13 @@
|
||||
1. 模拟普通 failed 回执,确认触发补发。
|
||||
2. 模拟 unknown 状态,执行 72 小时超时补偿。
|
||||
3. 将消息提交时间调整为超过 72 小时。
|
||||
4. 将消息提交时间调整为超过通道组补发时间上限。
|
||||
4. 将消息提交时间调整为超过通道组分钟级补发时间上限。
|
||||
5. 关闭通道组失败补发后再次模拟 failed。
|
||||
- 预期结果:
|
||||
- 普通 failed 在限制内触发补发。
|
||||
- unknown 不触发补发。
|
||||
- 超过 72 小时不触发补发。
|
||||
- 超过通道组补发时间上限不触发补发。
|
||||
- 超过通道组分钟级补发时间上限不触发补发。
|
||||
- 通道组关闭失败补发时不触发补发。
|
||||
|
||||
### TC-SEND-019 迟到旧通道回执不覆盖最终成功
|
||||
|
||||
@@ -704,3 +704,76 @@ git diff --check
|
||||
|
||||
- 前端 build 通过,仍存在既有 Vite chunk size warning。
|
||||
- `git diff --check` 无空白错误,仅 Windows 工作区 LF/CRLF 提示。
|
||||
|
||||
## 2026-07-07 手机号段 Tab 和通道组补发上限
|
||||
|
||||
### 本轮修复
|
||||
|
||||
- 运营端手机号段库页面移除自定义卡片式 Tab,改用通用 `Tabs` 控件,与企业应用管理页面“短信应用/彩信应用”交互一致。
|
||||
- 通道组添加/编辑页面新增“补发时间上限(小时)”输入控件,编辑时回填 `retryTimeLimitHours`,保存时写入真实通道组接口。
|
||||
- 补发时间上限按后端现有校验限制为 1 到 72 小时。
|
||||
|
||||
### 已执行命令
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
git diff --check
|
||||
```
|
||||
|
||||
### 当前结果
|
||||
|
||||
- 前端 build 通过,仍存在既有 Vite chunk size warning。
|
||||
- `git diff --check` 无空白错误,仅 Windows 工作区 LF/CRLF 提示。
|
||||
|
||||
## 2026-07-07 账单流水页面移除和列表分页
|
||||
|
||||
### 本轮修复
|
||||
|
||||
- 删除客户端账单流水页面和运营端账单流水页面,移除对应路由、菜单、占位映射和首页跳转入口。
|
||||
- 移除公开交易查询/创建接口:`GET/POST /api/admin/billing/transactions` 和 `GET /api/client/billing/transactions`。
|
||||
- 保留内部 `AccountTransaction` 写入能力,人工充值、扣费、释放、退款等真实计费动作仍可写入内部账务记录;本期不作为独立账单流水页面验收。
|
||||
- 通用 `Table` 组件新增内置分页,默认每页 10 条;服务端分页页面关闭内置分页,避免双分页。
|
||||
- 补齐手写列表和卡片列表分页:通道管理、通道组、充值记录、客户端应用、客户端充值套餐、客户端签名、客户端模板、客户端批量任务、客户端发送详情、运营端短信任务进度、运营端企业签名。
|
||||
|
||||
### 已执行命令
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
npm --prefix api run build
|
||||
npm --prefix api test -- billing.service.spec.ts --runInBand
|
||||
git diff --check
|
||||
```
|
||||
|
||||
### 当前结果
|
||||
|
||||
- 前端 build 通过,仍存在既有 Vite chunk size warning。
|
||||
- API build 通过。
|
||||
- BillingService 单测通过:1 个 test suite、6 个测试通过。
|
||||
- `git diff --check` 无空白错误,仅 Windows 工作区 LF/CRLF 提示。
|
||||
|
||||
## 2026-07-07 通道组表格和分钟级补发上限
|
||||
|
||||
### 本轮修复
|
||||
|
||||
- 通道组添加/编辑页的省网分流、全国通道配置从卡片改为通用表格展示,行内保留编辑、删除操作。
|
||||
- 通道状态文案改为设计锚点口径“链接正常/通道停用”;“链接正常”必须来自真实 CMPP 连接状态 connected 且当前连接数大于 0,新建但未连接的 active 通道不再显示为链接正常。
|
||||
- 通道组补发时间上限从整小时升级为分钟级配置,页面交互为“小时 + 分钟”,默认 12 小时 0 分钟;后端新增 `retryTimeLimitMinutes` 持久化字段,并保留 `retryTimeLimitHours` 兼容旧调用。
|
||||
- 发送链路按分钟级上限判断是否继续补发,超过配置分钟数、超过 72 小时或关闭补发时均不再补发。
|
||||
|
||||
### 已执行命令
|
||||
|
||||
```bash
|
||||
npm --prefix api run prisma:generate
|
||||
npm --prefix api test -- channels.service.spec.ts send-chain.service.spec.ts --runInBand
|
||||
npm --prefix api run build
|
||||
npm run build
|
||||
git diff --check
|
||||
```
|
||||
|
||||
### 当前结果
|
||||
|
||||
- Prisma Client 已根据新 schema 生成。
|
||||
- ChannelsService 和 SendChainService 定向单测通过:2 个 test suites、35 个测试通过。
|
||||
- API build 通过。
|
||||
- 前端 build 通过,仍存在既有 Vite chunk size warning。
|
||||
- `git diff --check` 无空白错误,仅 Windows 工作区 LF/CRLF 提示。
|
||||
|
||||
Reference in New Issue
Block a user