Skip to content

Latest commit

 

History

History
121 lines (90 loc) · 5 KB

File metadata and controls

121 lines (90 loc) · 5 KB

V2 云函数部署与验证

生产客户端只引用 postsV2getMyRoleV2dataRetentionV2。旧函数不得重新开放 客户端权限。

部署目录

cloudfunctions/postsV2
cloudfunctions/getMyRoleV2
cloudfunctions/dataRetentionV2

三个目录使用公共 npm registry 生成的锁文件,生产依赖审计应保持 0 个 High/Critical。 postsV2 vendored 的 lodash.set / lodash.unset 修复和 axios override 不得在更新依赖时 无意移除。

生产配置

函数 handler runtime timeout trigger
postsV2 index.main Nodejs20.19 60s
getMyRoleV2 index.main Nodejs20.19 5s
dataRetentionV2 index.main Nodejs20.19 120s dailyRetentionSweepV2

触发器使用 7 段 cron 0 17 3 * * * *,即北京时间每天 03:17。

平台当前最高运行时是 Nodejs20.19,但 Node 20 已超过上游维护期。每次发布前检查 CloudBase 是否已提供更高运行时;一旦可用,先在测试环境验证 SDK 与内容安全接口后迁移。

函数安全规则

生产环境应回读到等价配置:

{
  "*": {
    "invoke": "auth.loginType != 'ANONYMOUS' && auth != null"
  },
  "posts": { "invoke": false },
  "getMyRole": { "invoke": false },
  "dataRetention": { "invoke": false },
  "dataRetentionV2": { "invoke": false }
}

该规则只控制客户端调用;管理 API 和定时触发器不受它限制。postsV2 内部仍必须:

  • cloud.getWXContext() 获取可信 OPENID。
  • 对公开分享 get/listComments 使用 OPENID 哈希限流,但不建立账户、不返回本人状态。
  • 对普通读取和写操作校验当前协议同意、账户状态与频率。
  • 对管理动作重新查询 admins

好友分享中,已完成当前同意的用户走身份化读取;未同意或同步失败才回退公开 DTO。 朋友圈 scene 1154 始终走公开只读。

部署顺序

  1. 运行本地检查与三份生产依赖审计。
  2. 创建/回读 10 个集合、V2 索引和全拒绝数据库规则。
  3. 迁移任务 GeoPoint、关闭时间、marker counter、历史随机图片路径和临时头像字段。
  4. 部署三个 V2 函数并回读 runtime、timeout、状态与触发器。
  5. 更新客户端函数名并重新上传代码包。
  6. 最后写入函数安全规则,确认旧函数和 retention 函数客户端不可调。

若任一步失败,不应开放旧 posts 作为兼容路径;它缺少 V2 同意、限流、地理范围、作者 可信来源和数据最小化门禁。

自动检查

npm run check
node --check cloudfunctions/postsV2/index.js
node --check cloudfunctions/postsV2/lib.js
node --check cloudfunctions/getMyRoleV2/index.js
node --check cloudfunctions/dataRetentionV2/index.js
npm audit --omit=dev --prefix cloudfunctions/postsV2
npm audit --omit=dev --prefix cloudfunctions/getMyRoleV2
npm audit --omit=dev --prefix cloudfunctions/dataRetentionV2
git diff --check

线上最小冒烟

无身份与公开读取

  • 管理 API 无微信上下文调用普通 list 应返回 UNAUTHENTICATED
  • 真实好友分享、未同意用户只能读取指定 id 和公开评论,不能列出附近 feed 或写数据。
  • 已同意发布者从好友分享打开自己任务,isMine=true 且能看到关闭按钮。
  • 朋友圈 scene 1154 保持只读;写操作仍拒绝。
  • 连续公共读取超过限额时应返回 RATE_LIMITED

内容与文件安全

  • 正常标题、正文、地点、昵称、评论、反馈通过;风险内容和 87014 被拒绝。
  • OpenAPI 权限不可用或返回异常时必须 fail closed。
  • 正常 JPG/PNG 可发布;伪后缀、损坏文件、超过 1MB 或 750×1334 被拒绝。
  • 客户端直接写云存储失败;服务端上传成功后只返回随机 cloud:// fileID。

幂等、并发与治理

  • 同一 request ID 的发布、评论、反馈重试只产生一条记录。
  • 同 request ID 携带不同 payload 返回 IDEMPOTENCY_CONFLICT
  • 同一用户重复信任动作只计一次;并发举报达到阈值时隐藏状态不丢失。
  • hidden 不得被并发 resolve 覆盖。
  • 两个账号验证管理员/普通用户边界和评论举报队列。

保留任务

手动调用最终版 dataRetentionV2,至少确认:

  • 无符合条件数据时返回完整零计数摘要且不修改现有任务。
  • 任务只有在子评论、反应、图片和绑定会话处理成功后才标记 retired。
  • 旧头像会话标记 superseded;仍被账户、未归档任务或评论引用时不删除;无引用后删除。
  • 删除失败留下重试状态并使本轮返回失败,不能静默成功。
  • 过期限流桶和 90 天前终态上传会话元数据会物理删除并回读无残留。

不可由仓库代替的验收

DevTools、iOS、Android、双账号、弱网、真实好友/朋友圈分享、公众平台隐私保护指引和 内容安全权限必须由真实 AppID/真实登录态执行。未执行时写“未验证”,不能写“通过”。