ADR-010 · Cloudflare 部署形态评估 · Pages 维持 / Containers 列为 D2 替代 / Workers 不适配
| 字段 | 值 |
|---|---|
| 状态 | proposed · 待 CTO + 项目主理 双签 |
| 日期 | 2026-06-11 |
| 决策者 | (提案: Claude Code 调研 · 双签后生效) |
| 承接 | ADR-003 (部署可选) · ADR-005 (CF Pages 静态 + 腾讯云 API) |
| 相关 | Dockerfile · scripts/boss_server.py · .github/workflows/docker-build.yml · BOSS_API_TOKEN (R4) |
1. Context
用户问题: "是否可以部署到 Cloudflare 上?" 现状盘点:
- 静态层已在 Cloudflare: ADR-005 起
www/+/handbook/跑 CF Pages, 每次 push 自动构建部署 — 这部分无需任何动作。 - API 层 (boss_server): ADR-005 选了腾讯云轻量 VM (D2), ADR-005 落地时 Cloudflare 尚无通用容器产品。
- 2025-2026 变化: Cloudflare Containers 公测转生产可用 — 支持标准 Docker 镜像, 按活跃 10ms 计费 (含在 $5/月 Workers Paid), 账户级上限已升至 ~6 TiB 内存 / 1500 vCPU / 30 TB 盘, 支持自定义 instance type。Python Workers (Pyodide) 支持 FastAPI (ASGI 直连) 与纯 Python 包。
2. Decision (提案)
| 层 | 决定 | 理由 |
|---|---|---|
| 静态 (www/ + handbook) | 维持 CF Pages (ADR-005 不变) | 已运行良好, 零动作 |
| API (boss_server) | CF Containers 列为 D2 的替代形态 (D4), 不替换默认 D2 | 见 §3; 可行但 vault 状态同步引入新复杂度, 收益主要是免运维 + scale-to-zero 成本 |
| 判断流水线 / Hermes always-on | 不上 Workers; Containers 技术可行但不推荐 | 流水线分钟级长跑 + 全 vault 文件读写 + git push-back, VM 的持久文件系统模型天然匹配 |
3. Options considered
3.1 · Python Workers (FastAPI on Pyodide) — ❌ 不适配
FastAPI 本身可跑 (官方 ASGI 支持), 但 boss_server 依赖:
subprocess(git rev-parse / attribution_check.py 子进程) — Workers 运行时无子进程- vault 文件系统 (panels/ anchors/ cases/ 实时读) — Workers 无持久 fs
- 原生依赖受限 (仅 Pyodide 预编译 + 纯 Python 包)
判断流水线更不可能 (分钟级长跑 + 大量写盘)。
3.2 · CF Containers 跑 boss_server — ✅ 技术可行 (D4 候选)
- 现有
Dockerfile即用 (docker-build.yml CI 已验证镜像可起 + 5 endpoint + 401 契约) - 配置: wrangler 配 instance type +
BOSS_API_TOKENsecret; 启动时git clone --depth 1拉 vault (私有 repo 需 deploy token) - 约束: 容器 ephemeral — 只读 endpoints (healthz/version/panels/anchors) 无损;
POST /v1/attribution/check的 case.json 写盘会随实例回收丢失, 需加 git push-back 或声明该 endpoint 在 D4 下为 dry-run-only - 成本: scale-to-zero, 低频调用下显著低于常开 VM
3.3 · CF Containers 跑完整流水线 / Hermes — ⚠️ 可行但不推荐
技术上容器能跑分钟级任务, 但: 每次冷启 clone 145MB+ raw 数据不现实 (raw 不在 git); 判断产物 (reports/cases) 必须 push-back, 失败即丢真判断; Hermes always-on 与 scale-to-zero 模型相悖 (常开计费 ≈ VM 价, 无优势)。维持 ADR-005 的 VM 路线。
3.4 · Invariant impact ★
- versions/ chmod 444 不可变 (R3): 容器内文件系统 ephemeral, "不可变"退化为"git history 不可变" — D4 下该 invariant 由 git 承载而非 OS 权限位, 需在 D4 文档显式声明
- redact_check fail-close 出站闸 (§9.2): 不受影响 (闸在应用层)
- BOSS_API_TOKEN fail-close (R4): 不受影响, secret 走 wrangler
- 新增 invariant: D4 容器启动 clone 的 vault 快照有滞后 —
/v1/version返回的 git_commit 是快照点, 非实时 main
4. Tradeoffs 接受
- D4 引入 "vault 快照滞后" 与 "写盘易失" 两个新心智负担, 换免运维 + 按用量计费
- 不替换 D2 默认: 团队已有腾讯云运维路径 (templates/ systemd + nginx), 双轨维护成本由 "D4 仅文档级提案, 不写部署脚本" 控制 — 双签通过后才落 wrangler 配置
5. 实施 (双签通过后)
wrangler.toml+ 容器启动脚本 (clone + uvicorn) — 预算 0.5 天- handbook operations/deployment.md D4 段从 "提案" 转正
/v1/attribution/check在 D4 模式默认 dry_run=true (写盘易失声明)
6. 关键反共识立场
"能上 Cloudflare" ≠ "应该全上 Cloudflare"。本项目的核心资产是 git 内的判断历史 + 本地 145MB 语料, 是有状态、强一致优先的工作负载; Cloudflare 的优势 (边缘分发、scale-to-zero) 服务的是无状态高并发场景。静态层吃尽 CF 红利 (已做), API 层可选迁移 (本 ADR), 数据与流水线层留在有持久盘的地方 — 按负载特性分层, 而不是按厂商品牌统一。
调研依据 (2026-06-11 检索): Cloudflare Containers pricing/limits 官方文档 · Containers public beta 公告 · Python Workers FastAPI 官方文档 · Python Workers packages 支持列表。