集成在 api.200181.xyz(同一个 Worker),国内机 writeapi.usj.cc 同步可用。 新增第三档后台角色 'ssl': - 只拿证书管家钥匙,看不到评论/文章/用户等模块 - 判定正着枚举放行(canManageSSL = admin|ssl),不用排除法, 免得以后新增角色静默获得私钥权限 - 鉴权只认 Bearer 会话,绝不走 isAdminRequest —— 后者有 Artalk 老客户端的 query 兜底,一旦进来的就是 TLS 私钥 数据(复用 RSS_KV,前缀 certkeeper:): - 凭据一条一键,避开 KV 读-改-写无事务导致的并发丢数据 - 私钥/AK-SK 一律 AES-GCM 密文(TOKEN_SECRET 经 PBKDF2 派生) - 列表接口只回显前 4 后 4 位,明文不进内存 - 配置读失败抛错而非返回空,避免一次保存覆盖线上配置 只读监控: - probeTls 走 cloudflare:sockets 拿证书正文,实现到期分级 与「库里记录 vs 线上实测」对比(match/mismatch/live-only/unreachable) - 到期提醒邮件(HTML 已转义) 国内机 editor-api: - identify 识别 ssl 角色;业务分支前白名单,ssl 只能碰 /health、 /admin/session、/admin/logout 与 /api/v2/ssl* - /api/v2/ssl* 反代放行 admin + ssl(RSS 仍是 admin-only) - posts.mjs 越权兜底方向修正:owns() 从「非 editor 即放行」改为 「只有 admin 不受限」,漏进来的 ssl 被当受限编辑而非管理员全放行 - createPost 显式拒绝非写作角色 验证:typecheck ✓ / selftest:ssl 117 项 ✓ / 浏览器 37 项 ✓
背景:favicon 此前只有 Cache-Control: max-age(仅浏览器缓存), CF 边缘不缓存 Worker 响应 → 每次请求都进 Worker → 第一句就是 KV.get。 友圈页按友链数放大,KV 读量被显著放大。 ★ 关键纠错:zone 级 Cache Rules 对 Worker 响应**完全无效**。 原因是 Worker 位于 zone 缓存之前("Workers sits in front of cache"), 且 Worker 直接生成响应时不发 fetch 子请求,cache status 只能是 none/unknown。 查证 CF 官方文档后确认,正确方案是 [cache] enabled = true(Workers Cache, 2026-07 上线,需 wrangler >= 4.69)。 改动: - wrangler.toml: 新增 [cache] enabled = true;compatibility_date 提到 2026-07-24 - package.json: wrangler ^3.99 → ^4.147,workers-types ^4 → ^5(peer 要求) - index.ts: 抽出 dispatchRequest;新增 ensureCachePolicy 兜底 ★ 这一步是必须的:Workers Cache 遵循 RFC 9111 含**启发式缓存**, 没带 Cache-Control 的响应也可能被缓存。实测 /api/v2/comments 开启后 立刻被缓存(HIT, age:29)→ 用户发的新评论看不见。 现在白名单式兜底:已显式声明可缓存的(favicon 的 s-maxage)保留, 其余一律补 no-store。 验证(中转机实测,已清空 zone 的无效 cache rule): - /api/favicon → MISS → HIT,age 递增(Worker 不再执行,KV 读归零) - /api/v2/comments → BYPASS ×3,cache-control: no-store - /api/v2/conf → BYPASS,no-store - /api/v2/healthz → BYPASS,no-store