Skip to content

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_TOKEN secret; 启动时 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. 实施 (双签通过后)

  1. wrangler.toml + 容器启动脚本 (clone + uvicorn) — 预算 0.5 天
  2. handbook operations/deployment.md D4 段从 "提案" 转正
  3. /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 支持列表。

判断力工程化 · Judgement, Engineered · 主站 · GitHub