docs: record t636 production deployment

This commit is contained in:
QiuSW
2026-07-28 15:46:21 +08:00
parent 2171968780
commit 1dc922b2e2
4 changed files with 36 additions and 7 deletions
+1 -1
View File
@@ -114,7 +114,7 @@
| T-633 | 存量用户批量授予过渡测试套餐 | T-632, T-626 | **已完成。** 新增默认只预演的 `grant_existing_users_plan`,通过明确 `plan_id`、非空原因、`--execute` 与预期人数双重确认,为启用的非后台账号批量授予套餐;已有同产品有效/宽限期权益会跳过。执行在单事务内复用 `grant_software_entitlement()` 生成权益快照、席位和授权事件,任一失败整批回滚。线上已备份 MySQL 后为 30 个存量用户授予“测试”套餐,反向预演待授予为 0;后台账号、API Key、点数、充值、软件订单和生成记录未由命令修改。详见 [`tasks/T-633.md`](tasks/T-633.md)。 | DONE |
| T-634 | 过期会员允许购买其他套餐 | T-629, T-632 | **已完成。** 软件下单与支付入账统一按 `status=active + grace_expires_at > now` 识别当前可用权益;支付校验通过后在同一事务内把同产品自然到期但仍为 `active` 的历史权益收敛为 `expired`,并为目标套餐创建新权益。有效/宽限期内的跨套餐仍拒绝;同套餐有效权益续订、支付幂等、金额校验和点数账本隔离保持不变。新增 5 条缺陷回归,扩大非并发 licensing / 软件支付 API 回归 40 条通过;无迁移。详见 [`tasks/T-634.md`](tasks/T-634.md)。 | DONE |
| T-635 | cmshopee 客户端启动订阅策略接口 | T-607, T-632 | **已完成。** 公开版本检查接口顶层新增 `client_policy`,有发布和 `release:null` 均返回,所有响应 `Cache-Control: no-store`;单一 `off|observe|enforce` 配置源输出双布尔字段,非 `off` 强制带时区更新时间。订阅状态新增不受运行模式影响的 `real_entitlement_allowed`,客户端不再把 `open` / `shadow` 的兼容 `allowed=true` 误判为真实会员。无迁移,不读用户、套餐或点数,不改生文、生图、支付、扣点和订阅订单。详见 [`tasks/T-635.md`](tasks/T-635.md)。 | DONE |
| T-636 | 客户端订阅策略 django-admin 运营开关 | T-635, T-632 | **实施中。** 已新增 `ClientSubscriptionPolicy(singleton_id=1)` 与只读 `ClientSubscriptionPolicyAudit`,公开版本接口优先读后台单例、缺记录回退 `.env`;superuser-only admin 保存必须带原因并即时发布。迁移、目标 API / service / admin 回归已通过,待完成本地标准验证、提交和生产 migrate 部署。详见 [`tasks/T-636.md`](tasks/T-636.md)。 | DOING |
| T-636 | 客户端订阅策略 django-admin 运营开关 | T-635, T-632 | **已完成并部署。** 新增 `ClientSubscriptionPolicy(singleton_id=1)` 与只读 `ClientSubscriptionPolicyAudit`,公开版本接口优先读后台单例、缺记录回退 `.env`;superuser-only admin 保存必须带原因并即时发布。生产已执行 `licensing.0006`,未创建策略记录,公开策略仍为既有 `off`;目标 API / service / admin 回归、迁移、`check` 与标准启动验证通过。详见 [`tasks/T-636.md`](tasks/T-636.md)。 | DONE |
## 里程碑
+4 -4
View File
@@ -75,11 +75,11 @@
任务状态以 [`06-tasks.md`](06-tasks.md) 为准,历史执行记录见 [`../progress.md`](../progress.md)。
- 已完成:T-001 初始化 Django + DRF 项目骨架;T-002 建立 apps 目录、自定义 User 与配置;T-003 接通 django-admin 与最小测试;T-004 Phase 0 骨架审核修补;T-101 Provider 适配器层 + 移植 cmbot 调用;T-102 AiModel + ModelAlias 模型 + 别名解析;T-103 配置变更审计;T-104 跑通一次录制标题生成;T-105 Phase 1 AI 层审核修补;T-201 User / UserWallet / ApiKey / PointsLedger / CallRecord 模型;T-202 PricingRule / ExchangeRate 模型 + 计费计算;T-203 并发安全扣点 / 退点;T-204 Phase 2 计费核心审核加固;T-301 API Key 鉴权;T-302 生成标题 / 图片接口;T-303 余额查询接口;T-304 充值回调;T-305 扫码充值下单 + 轮询;T-306 Phase 3 对外 API 安全加固;T-501 注册 / 登录(allauth);T-502 API Key 自助管理页;T-503 个人中心 / 记录页;T-504 充值页(扫码 + 轮询到账);T-505 Phase 4 用户端审核优化;T-401 运营后台完善;T-402 完整验收 MVP;T-403 部署 / 运行文档;T-601 可用别名发现;T-602 django-admin 中文化(第 1-3 层);T-603 django-admin 中文化(第 4 层·字段级);T-604 中文敏感词本地过滤;T-605 免邮箱验证策略落地;T-606 公开首页 + 客户端下载入口;T-607 桌面端最新版本检查接口;T-608 新用户注册赠送试用点数(当前 10 点);T-609 桌面端版本检查接口增加强制更新标记;T-610 首页导入模板下载入口;T-611 用户端品牌名统一为虾皮圈;T-612 生图同步接口止血(上游硬截止 + 长请求池校准);T-613 抽生成核心 service(计费+审核+上游共享 core);T-614 生图异步任务化接口(提交+轮询,新增不动旧接口);T-615 旧同步生图接口用量遥测 + 弃用口径;T-616 生图失败自动重试 2 次;T-617 桌面端版本检查接口增加文件大小字段;T-618 客户端发布版本后台必填文件校验元数据。
- 已完成补充:T-619 多张图片理解并返回文字;T-620 图生图支持单图 / 多图主图与参考图;T-622 图片生成任务后台图片缩略预览;T-623 图片生成任务单图 / 多图筛选;T-624 蝦皮圈设备登记与会话观测;T-625 蝦皮圈设备使用关联与迁移观测;T-626 软件套餐、权益与设备席位基础模型及凭证续期/撤销清理;T-627 存量用户迁移权益、网页确认与设备凭证;T-628 蝦皮圈专属授权入口与影子校验;T-629 软件套餐购买、续订订单与权益入账;T-630 账号订阅授权与默认多设备模式;T-631 隐藏旧设备授权模型的 admin 菜单入口;T-632 会员订阅三阶段启用、状态接口补全与 admin 简化;T-633 存量用户批量授予过渡测试套餐;T-634 过期会员允许购买其他套餐;T-635 cmshopee 客户端启动订阅策略接口。
- 正在进行:T-636 客户端订阅策略 django-admin 运营开关,代码、迁移与目标回归已完成,待标准验证、提交和生产部署。
- 已完成补充:T-619 多张图片理解并返回文字;T-620 图生图支持单图 / 多图主图与参考图;T-622 图片生成任务后台图片缩略预览;T-623 图片生成任务单图 / 多图筛选;T-624 蝦皮圈设备登记与会话观测;T-625 蝦皮圈设备使用关联与迁移观测;T-626 软件套餐、权益与设备席位基础模型及凭证续期/撤销清理;T-627 存量用户迁移权益、网页确认与设备凭证;T-628 蝦皮圈专属授权入口与影子校验;T-629 软件套餐购买、续订订单与权益入账;T-630 账号订阅授权与默认多设备模式;T-631 隐藏旧设备授权模型的 admin 菜单入口;T-632 会员订阅三阶段启用、状态接口补全与 admin 简化;T-633 存量用户批量授予过渡测试套餐;T-634 过期会员允许购买其他套餐;T-635 cmshopee 客户端启动订阅策略接口;T-636 客户端订阅策略 django-admin 运营开关。
- 正在进行:无。
- T-621 注册赠点运营后台配置继续留在 Backlog。真实支付回调到账闭环、客户端发布、生产多图理解模型配置和线上旧同步接口用量观察仍可继续拆任务。
- 当前 blocker:支付商户真实密钥/证书与生产 SDK 依赖仍待提供;微信回调到账闭环仍需真实支付验收;真实 AI 标题生成已在线上跑通,图片生成慢 / 504 / 客户端超时风险已拆为 T-612~T-616 并完成工程侧处理。
- 下一个可领取任务:完成 T-636 的提交和生产部署。T-621 保留在 Backlog;真实微信商户支付验收仍是线上 blocker。线上 T-635 revision 为 `1c100c5`,客户端策略当前由 `.env` 兜底为 `off`;T-636 发布后先保持该兜底,待超级管理员创建后台记录后再按 `observe` / `enforce` 灰度。具体范围见 [`06-tasks.md`](06-tasks.md)。
- 下一个可领取任务:按业务优先级从 Backlog 拆分后续任务。T-621 保留在 Backlog;真实微信商户支付验收仍是线上 blocker。线上 T-636 revision 为 `2171968`,策略表尚无记录,客户端策略继续由 `.env` 兜底为 `off`;超级管理员创建后台记录后再按 `observe` / `enforce` 灰度。具体范围见 [`06-tasks.md`](06-tasks.md)。
## 当前可运行内容
@@ -155,7 +155,7 @@ T-633 已新增默认只预演的 `grant_existing_users_plan`:按套餐 ID、
T-634 已统一软件订单与订阅授权的当前权益口径:只有 `active` 且未超过宽限截止时间的权益会阻止跨套餐下单或参与续订。支付校验通过后,服务在同一事务内把自然到期但仍为 `active` 的同产品历史权益收敛为 `expired`;已过期同套餐或不同套餐都会创建新权益。该实现不改接口、迁移、支付验签或点数账本,已部署生产 revision `976b55c`。
T-635 已在公开 `GET /api/v1/client/releases/latest` 顶层发布 `client_policy`,有发布和 `release:null` 均返回并带 `Cache-Control: no-store`;策略与服务端 `CMSHOPEE_SUBSCRIPTION_MODE` 独立。订阅状态接口新增 `real_entitlement_allowed`,只代表真实 `active` / `grace` 权益,客户端门禁不得以 `open` / `shadow` 的兼容 `allowed` 字段替代。T-636 正在把策略来源扩展为 admin 单例优先、`.env` 缺记录兜底;不读取用户、真实权益、套餐、订单或点数,不影响生成、扣点、退款、充值或软件订单。T-635 已于 2026-07-28 部署到生产 revision `1c100c5`,客户端策略当前由 `.env` 保持 `off`,Web / Generate 服务和 66 个图片 worker 健康。
T-635/T-636 已在公开 `GET /api/v1/client/releases/latest` 顶层发布 `client_policy`,有发布和 `release:null` 均返回并带 `Cache-Control: no-store`;策略与服务端 `CMSHOPEE_SUBSCRIPTION_MODE` 独立。T-636 使 django-admin 单例优先、`.env` 缺记录兜底;不读取用户、真实权益、套餐、订单或点数,不影响生成、扣点、退款、充值或软件订单。2026-07-28 已部署到生产 revision `2171968` 并应用 `licensing.0006`,策略和审计表均为空,客户端策略继续由 `.env` 保持 `off`;Web / Generate、Nginx、MySQL 8.4 和 66 个图片 worker 健康。
## 开始编码前检查
+16 -2
View File
@@ -88,9 +88,9 @@ T-635 已经通过公开版本检查接口向新版 cmshopee 客户端发布启
## 状态
DOING。代码、迁移和目标回归已完成,待标准验证、提交和生产部署。
DONE。代码、迁移、目标回归与生产部署均已完成。
## 实施结果(待部署)
## 实施结果
- 新增 `ClientSubscriptionPolicy` 与 `ClientSubscriptionPolicyAudit`,迁移
`licensing.0006_client_subscription_policy` 只建空表。策略固定主键为 `1`,并由
@@ -103,3 +103,17 @@ DOING。代码、迁移和目标回归已完成,待标准验证、提交和生
模式,但不允许修改它;审计只作为 inline 展示,不增加导航噪音。
- 未改通用 / 专属生成、服务端订阅授权、用户权益、套餐、点数、支付、软件订单或
异步图片任务。
## 生产部署
- 2026-07-28 已部署到 `185.216.248.75` / `https://cm.833729.com`,应用 revision
为 `2171968`;发布归档 SHA256 为
`f9c386125226813a5f679487832bda7f28474428bfe173f8a2a53b5e84f08a17`。
- 发布前备份位于 `/root/cmhub_deploy_backups/cmhub-before-t636-20260728_154417`;
线上 `licensing.0006_client_subscription_policy` 已成功应用。
- 未创建 `ClientSubscriptionPolicy` 或审计记录,因此继续使用现有 `.env`
`off` 兜底;公网接口返回 HTTP 200、`Cache-Control: no-store`、
`subscription_check_enabled=false` 和 `subscription_enforcement_enabled=false`。
- `cmhub-web`、`cmhub-generate`、Nginx、MySQL 8.4 均为 active;66 个图片 worker
未重启且保持 active。下一步由超级管理员在 admin 创建策略记录后按
`off -> observe -> enforce` 灰度,无需重启服务。
+15
View File
@@ -2259,3 +2259,18 @@
- 迁移一致性:`makemigrations --check --dry-run` 显示 No changes detected;旧本机
MySQL `43.128.3.240` 拒绝连接,仅产生迁移历史检查 warning。待提交后按部署文档备份、
`migrate` 并保持线上 `.env` 兜底为 `off`。
## 2026-07-28 生产部署:T-636 客户端订阅策略 django-admin 运营开关
- 发布:本地 revision `2171968` 以归档部署到 `185.216.248.75`;归档 SHA256 为
`f9c386125226813a5f679487832bda7f28474428bfe173f8a2a53b5e84f08a17`,远端校验一致。
部署前备份为 `/root/cmhub_deploy_backups/cmhub-before-t636-20260728_154417`,同步时
保留线上 `.env`、`.secrets`、`media`、`staticfiles` 和部署目录。
- 数据库:发布前 `migrate --plan` 仅列出 `licensing.0006`;实际 `migrate --noinput`
成功创建策略和审计表。迁移不预置记录,线上检查为 `policy_rows=0`、`audit_rows=0`,
所以现有 `.env` `off` 策略保持原样。
- 重启与验收:仅重启 `cmhub-web`、`cmhub-generate`;两者、Nginx 和 MySQL 8.4 均
active,66 个图片 worker 未重启且保持 active。公网版本检查接口 HTTP 200、
`Cache-Control: no-store`,`client_policy` 仍为 false/false,带原 `.env` 时间;
`.deploy_revision=2171968`。生产代码已确认调用
`get_published_client_subscription_policy()`。