自托管「类 Cloudflare Workers」:开源项目 open-compute 的原理、架构与适用场景
AI 参与说明(Agent:Grok):本文由 Grok Bot 根据 open-compute 公开仓库、官方文档与一次实际部署记录整理、脱敏和校验。文中「部署中观察到的行为」来自 2026-10-10 前后的版本,项目迭代很快,细节以最新文档为准。执行入口 Grok Bot;模型标识与 reasoning effort 未取得运行记录;提供方 xAI。
Cloudflare Workers 把「边缘上的轻量 isolate」做成了主流开发体验:一套 JS/TS fetch 入口、KV/D1/R2 等 binding,以及成熟的 CLI 与部署流水线。很多团队的难点不在写法,而在能否把同等编程模型放到自己控制的机器上。
开源项目 open-compute 正试图回答这个问题:用一个 Rust 二进制,在单机上提供兼容 Cloudflare Workers 的自托管平台。本文依次讲它的原理与架构、能做什么、运行环境、限制,以及适合的场景。
| 英文术语 | 中文名称 | 简要解释 |
|---|---|---|
| open-compute | 保留原名(项目名) | 在单机上运行兼容 Cloudflare Workers 编程模型的开源平台 |
| ocd | 保留原名(守护进程) | open-compute 的控制面与 Gateway 守护进程 |
| workerd | 保留原名 | Cloudflare 开源的 Workers 运行时,open-compute 使用其固定 fork |
| V8 isolate | V8 隔离实例 | 同一进程内相互隔离的 JavaScript 执行环境,不是容器或 microVM |
| binding | 绑定 | Worker 通过 env 访问的平台能力,例如 KV、D1、R2 |
| Static Assets | 静态资源 | 由平台直接托管的前端文件与 SPA 回退配置 |
| cf CLI | 保留原名 | open-compute 文档固定版本的部署与管理命令行工具 |
| Gateway | 网关 | 对外暴露实例流量、证书与路由的入口 |
定位
按官方中文文档的表述,open-compute 面向自托管单机部署:在你控制的一台机器上运行受支持的 Cloudflare Workers 应用。一个作用域内的 ocd daemon 负责共享控制面与 Gateway;每个已登记实例独占数据目录、SQLite 与对象权威、凭据,以及受监督的固定 workerd runtime。
它明确不是 Cloudflare 全球边缘:没有多区域复制、Anycast、托管账单或 fleet 管理。它的卖点是在单机拓扑下,尽量保持 Cloudflare 的编程模型与管理面习惯。项目采用 Apache-2.0 许可,仍处于早期快速迭代阶段,提交高度集中在一位主维护者身上,长期依赖时要把上游可持续性一并考虑。
原理与架构
运行时:V8 isolate,而不是容器或 Wasm
open-compute 的执行模型是 V8 isolate,不是 Docker 容器,也不是 Wasm 组件。底层是固定版本、校验过摘要的 workerd fork(Cloudflare 开源的 Workers 运行时),作为 ocd 的受监督子进程运行,通过回环通道与控制面通信。
- 开发者侧仍是标准 module Worker:
export default { fetch }这一套; - 与 Cloudflare 的兼容性主要来自 workerd 本身,以及 open-compute 在其上补齐的 binding 与控制面;
- 隔离粒度是 isolate,不是 microVM:启动轻、开销低,但对多租户安全要求更高(见后文)。
控制面:一个二进制里的「小平台」
ocd 不只是 runtime supervisor。它把调度、网关、各类 binding 的服务端实现捆进同一个进程模型:安装、实例登记、部署、路由、健康检查都围绕这一 daemon。官方强调起步不需要 K8s、Redis 或 Postgres。
管理面兼容 Cloudflare v4 API(/client/v4),可以用官方 cf CLI 部署,并附带 Dashboard。习惯 wrangler / Cloudflare API 的团队可以沿用原来的部署方式。
flowchart TB
Client[客户端或 CLI] --> Gateway[Gateway / Caddy]
Client --> API["/client/v4 管理 API"]
Gateway --> ocd[ocd 控制面]
API --> ocd
ocd --> workerd[workerd 子进程]
ocd --> SQLite[(SQLite 元数据)]
ocd --> Objects[(本地或 S3 对象权威)]
workerd --> Isolates[V8 isolate Worker]
上图对应官方架构叙述:一个 ocd、一个受监督的 workerd、每实例独立的 SQLite 与对象权威;生产启动保持离线,不依赖从外网再拉 runtime。README:Architecture
状态:SQLite + 本地对象(或 S3 兼容)
平台元数据落在 SQLite;对象存储可用本地文件系统或 S3 兼容后端。单机「全家桶」的取舍很清晰:部署简单、故障域也简单,但没有内建多副本高可用。
能做哪些事
README 列出的能力覆盖 KV、R2、D1、Durable Objects、Queues、Cron、Workflows、Static Assets、Service Bindings、Cache、Images、Vectorize 等方向。官方同时说明:兼容是指对齐文档化的公开 API 面,不承诺每个行为细节都与 Cloudflare 完全一致,具体以兼容性参考为准。
实际部署中确认可行的:
- 以
cfCLI 构建、上传并激活 Worker,按旧版本回滚; ocd重启后已部署的 Worker 与静态资源自动恢复,无需重新发布;- 用 Static Assets 托管纯前端 SPA,浏览器导航请求按 SPA 回退。
官方明确未支持或未就绪的:Hyperdrive、Workers for Platforms、Rate Limiting、Analytics Engine、Tail Workers / Logpush、通用 Workers AI;Containers 仍在规划中,Browser Run 为部分支持(需运维方自备浏览器)。深度依赖这些产品面的业务,目前不能「换个 endpoint 就搬过去」。
运行环境
- 系统与架构:Linux 或 macOS,x64 / arm64。
- 运行方式:默认安装为 systemd(Linux)或 launchd(macOS)服务,也可用
ocd run前台运行;Worker 以专用非 root 用户运行,网关与管理端口默认只监听本机回环地址。 - 公网入口:Gateway 内置 Caddy 负责证书与路由,对外需放行 443;ACME 签证书还涉及 53 端口。
- 外部依赖:不需要 K8s、Redis 或 Postgres;对象存储可选 S3 兼容后端。
- 文件系统:原子写入会严格检查文件系统设备号,overlay 根文件系统的容器式环境可能出问题,没有 systemd 时安装路径也别扭。推荐 ext4(或同类本地盘)+ systemd 的常规 Linux 主机。
限制与兼容性差异
- 单机、单 daemon:适合自用或小规模内部平台,不是多副本集群。
- 无全球边缘:延迟与可用性取决于机器放在哪里。
- Static Assets 有摩擦(部署中实际遇到):
- 不支持
_headers/_redirects,带_headers的资产配置会被拒绝,无法像 Cloudflare 那样给静态资源配长缓存头; - 只挂 assets、不写 entrypoint 时部署失败,需要加一个把请求转给
env.ASSETS.fetch的默认导出; - 缺少
Sec-Fetch-Mode: navigate头的请求,某些路径返回 500,而 Cloudflare 通常是 404; workersDev: true不支持,需要按实例本地 Host 路由访问。
- 不支持
- 排障体验:服务端日志有明确错误码,
cfCLI 有时只返回通用 500。 - 安全默认偏「可信租户」:Worker 出站流量默认可以访问宿主内网、loopback 与云厂商 metadata 地址,需要运维方用防火墙(按运行用户 uid 拦截)或 network namespace 自行收紧。README:Security
同类方案对照
许可证与运行模型以各项目公开文档为准:
| 方案 | 许可证/商业 | 运行模型 | 可自托管 | 中国大陆可用性(概括) |
|---|---|---|---|---|
| open-compute | Apache-2.0 | workerd isolate(单机) | 是,单二进制 | 自建机房或国内云,可备案 |
| workerd | Apache-2.0 | V8 isolate(仅运行时) | 是,控制面自建 | 自建即可 |
| Cloudflare Workers | 商业 | 全球边缘 isolate | 否 | 境内访问慢;中国网络需企业方案 |
| Deno Deploy / Subhosting | 商业(运行时 MIT) | V8 isolate | 平台本身否 | 无境内节点 |
| Supabase Edge Runtime | MIT | Deno 系 isolate | 是 | 自建即可 |
| WinterJS | MIT | SpiderMonkey on Wasmer | 是 | 自建 |
| Spin / Fermyon | Apache-2.0(CNCF) | Wasm 组件 | 是(可配合 K8s) | 自建 |
| 阿里云 ESA 边缘函数 | 商业 | JS(类 Workers API) | 否 | 境内节点,需备案 |
| 腾讯云 EdgeOne 边缘函数 | 商业 | JS(类 Workers API) | 否 | 境内节点,需备案 |
| 火山引擎 veFaaS | 商业 | 函数/容器 | 否 | 境内节点 |
- 只要运行时:workerd、Supabase Edge Runtime、Spin 等都可选;
- 要「Workers 编程模型 + 控制面 + CLI」开箱即用:open-compute 是目前最完整的开源整包之一,但成熟度与拓扑都还在早期;
- 只要境内可备案的边缘函数、不在乎兼容 Cloudflare:云厂商托管产品往往更省事。
适合的场景
适合:
- 在自己控制的机器上(例如境内云主机)复用 Cloudflare Workers 代码与开发习惯;
- 内部工具、个人项目、静态站 + 少量 KV/D1 API 这类单机即可承载的负载;
- 评估「把 Workers 搬回自己机器」的可行性,作为验证底座。
不适合或需谨慎:
- 需要多区域、高可用或全球低延迟的生产服务;
- 运行不可信的第三方代码、对外提供多租户 Serverless:除了出站隔离,还要自己补计量计费、日志监控、多节点高可用与证书体系。这类目标更稳妥的底座通常是 workerd + 自研控制面;
- 深度依赖上文未支持产品面,或依赖
_headers等 Static Assets 细节的站点。
结语
open-compute 把「Workers 编程模型 + 可自托管控制面」收成了一个 Apache-2.0 的单机二进制:底层是 workerd isolate,ocd 统管网关、binding 与部署,状态落在 SQLite 和本地或 S3 对象存储。它能跑通常见的 Worker 与静态站部署,但单机、非全球边缘、部分产品面缺失、安全默认偏可信租户。适合先作为自用或内部平台试用,不宜直接当作对外多租户平台的核心依赖。
关联阅读
- Workers:运行时 API、Bindings 与执行模型
- Dynamic Workers、Containers 与 Sandbox:关系、区别与使用方式
- Cloudflare Workers Builds:免费额度、超限处理与费用计算
- Cloudflare 文档导航
参考链接
- open-compute 源码仓库:https://github.com/elliothux/open-compute
- open-compute 中文文档:https://open-compute.dev/zh/docs/
- 兼容性参考:https://open-compute.dev/docs/platform/compatibility/
- Cloudflare workerd:https://github.com/cloudflare/workerd
- Deno Deploy:https://deno.com/deploy
- Supabase Edge Runtime:https://github.com/supabase/edge-runtime
- WinterJS:https://github.com/wasmerio/winterjs
- Spin(CNCF):https://github.com/spinframework/spin
- 阿里云 ESA:https://help.aliyun.com/product/122312.html
- 腾讯云 EdgeOne:https://cloud.tencent.com/document/product/1552
- 火山引擎 veFaaS:https://www.volcengine.com/product/vefaas