RepoDaily · 2026-08-08 · Self-hosted app

denoland/celld:把 Durable Objects 搬到自托管基础设施上

#9 Self-hosted app Rust +546 denoland/celld 打开仓库

一个用 Rust 编写、内嵌 V8 的分布式 Durable Objects 运行时,支持对象存储持久化,采用 Apache-2.0 许可证。

项目类型Self-hosted app
最适合希望在自有机器上获得 Cloudflare 式有状态 Actor,但不依赖托管边缘平台的开发者
风险等级高——项目处于早期,未公开稳定性或 API 承诺
评估时间4–6 小时即可完成本地构建与运行

核心问题: 你的工作负载是否真的需要单线程、可重启恢复、且由你完全控制的有状态对象?

83/100

RepoDaily 采用评分

RepoDaily 将该项目的采用分评为 83/100(强):分数来自文章来源、安装路径、生产风险、差异化、许可证清晰度以及 AI/Agent 适配度。

基于 RepoDaily 来源和采用说明的方向性评分,不是基准测试。风险: 高
96证据质量

包含 4 个来源、覆盖 3 类来源;如有 RepoDaily 独有模块,会进一步提高证据分。

100可安装/可试用性

检测到 5 个工作流步骤、4 个下一步动作,以及 3 个命令/安装信号。

54维护可信度

趋势热度为 +546 stars;如内容中有 release、issue 或维护信号,会提高维护可信度。

75生产准备度

采纳风险标记为 high,并包含 5 条安全说明与 3 条跳过条件。

97差异化

2 个机会视角、4 个替代方案,以及 3 个类型化模块支撑差异化判断。

82许可证清晰度

文章中包含许可证来源或许可证表述。

66Agent / AI 适配度

文章正文和元数据中检测到 3 个 AI/Agent 相关信号。

项目概览

denoland/celld 是一个用 Rust 实现的自托管、分布式 Durable Objects 运行时。Durable Objects 的概念由 Cloudflare 在其边缘平台上提出,用于承载单线程、有状态的 Actor;celld 把这个模型搬到了你自己运营的机器上。在本期趋势窗口中,该项目获得 546 颗星,位列 RepoDaily 2026-08-08 趋势榜第 9 名。

仓库以 Cargo workspace 组织。workspace 的 Cargo.toml 明确指出 `crates/logic` 负责全部行为状态与决策,而 `crates/celld` 只是副作用执行器与适配宿主。此外还引用了第三个 crate `crates/ltx` 作为路径依赖。这种分层意味着运行时逻辑层与网络、存储、V8 宿主等副作用层可以独立演进。

celld 在 workspace 级别直接依赖 V8(版本 152),同时引入 tokio、axum、hyper、fastwebsockets 与 rustls。`object_store` 0.11 与 `rusqlite` 0.31 的存在意味着持久化可以同时面向 S3 兼容的对象存储与本地 SQLite。加密栈相当完整——aes-gcm、ed25519-dalek、p256、rsa、hmac——说明请求签名与加密状态是一等公民。

项目采用 Apache 2.0 许可证,并附带了基于 `rust:1.97.1-bookworm` 的 Dockerfile。Docker 构建会在专门的测试阶段执行 `cargo test --release --locked` 和 `cargo clippy --release --all-targets --locked -- -D warnings`,这意味着任何 lint 或测试失败都会在产出镜像前终止发布流程。

解决什么问题

  • Cloudflare 的 Durable Objects 必须运行在其边缘平台上;对数据合规、延迟或供应商锁定有要求的团队无法直接使用。
  • 从零构建有状态 Actor 运行时需要同时解决持久化、复制、单写者语义与隔离——这些问题不该由业务团队重新发明。
  • 已有的自托管有状态平台(Redis、Temporal)面向的是不同的抽象:键值存储或工作流编排,而非带请求级处理器的单线程对象。

工作原理

  1. celld 二进制由 workspace 构建并打包进 `debian:bookworm-slim` 镜像,入口为 `/usr/local/bin/celld`。
  2. 运行时内嵌 V8(`v8 = "152"`),在隔离上下文中执行 JavaScript,与 Deno 现有的引擎策略一致。
  3. `crates/logic` 承担全部行为决策;`crates/celld` 负责副作用执行,例如 WebSocket 升级(fastwebsockets 与 axum)、HTTP 服务(hyper/axum)与 TLS(rustls,使用 ring 提供者)。
  4. 状态通过 `object_store` 0.11(S3 兼容后端)与 `rusqlite` 0.31(本地 SQLite)持久化,运维可以自行选择云对象存储或磁盘持久化。
  5. `lab` Cargo profile(`lto = "thin"`、`codegen-units = 16`、`incremental = true`)用于快速开发循环;正式产物始终使用 `release` profile(`fat` LTO、`opt-level = "s"`、`panic = "abort"`、`strip = true`)。

架构解读:logic crate 与副作用执行器

workspace 的 Cargo.toml 明确指出 `crates/logic` 负责全部行为状态与决策,`crates/celld` 只是副作用执行器与适配宿主。这是一种有意的六边形架构拆分:决策引擎不直接依赖网络或存储适配层,因此逻辑可以在隔离环境下被单元测试。

直接 workspace 依赖印证了适配层范围:`axum` 0.7(含 multipart)用于 HTTP,`fastwebsockets` 0.8(启用 `with_axum` feature)用于实时连接,`hyper` 1 同时承担客户端与服务端 HTTP/1,`tokio-rustls` 0.26 使用 ring 加密提供者承担 TLS。`object_store` 0.11 关闭了默认 features,意味着由运维选择存储后端,而不是被动继承全部云厂商实现。

部署备注:从 Dockerfile 读到的细节

Dockerfile 将 Rust 版本钉在 1.97.1,基于 `rust:1.97.1-bookworm`,并通过 `TARGETARCH` 参数为每种 CPU 架构维护独立的目标缓存。构建参数 `CELLD_PROFILE` 可以在 `release` profile(默认,用于发布产物)与 `lab` profile(跳过 fat-LTO 重链、加速本地迭代)之间切换。

测试阶段额外安装 `clippy` 组件,依次执行 `cargo test --release --locked` 与 `cargo clippy --release --all-targets --locked -- -D warnings`。`-D warnings` 把任意 clippy 告警都视为硬错误,因此发布流水线会拒绝任何不符合项目 lint 标准的代码。

最终运行时镜像基于 `debian:bookworm-slim`,除 ca-certificates 外不再安装额外软件包。OCI 标签包含 `org.opencontainers.image.title`、`revision` 与 `version`,可被支持 OCI 元数据的镜像仓库识别。

维护与成熟度风险

项目没有主页 URL、没有 topic 标签,README 中可读到的元数据只有一行描述:`self-hosted, distributed Durable Objects`。在现有素材中看不到任何稳定性承诺、API 参考或部署指南。

依赖版本相当新(`tokio` 1、`axum` 0.7、`hyper` 1、`v8` 152、`rustls` 0.23、`object_store` 0.11),意味着代码库紧跟 Rust 生态当前版本,但也意味着上游 crate 的破坏性变更需要项目方持续投入维护。

谁适合关注

适合关注

  • 因数据合规或延迟原因,正在评估 Cloudflare Durable Objects 自托管替代方案的团队。
  • 已经运营 Rust 服务、希望拥有一个可读、可补丁的 V8 嵌入式 Actor 运行时的基础设施工程师。
  • 需要由 S3 兼容存储或本地 SQLite 支撑的单写者有状态对象的原型项目。

可以先跳过

  • 只需要键值缓存的场景——Redis 或 DragonflyDB 更简单。
  • 没有 Rust 运维经验、且要求厂商 SLA 或托管控制平面的团队。
  • 已经与 Cloudflare Workers/Durable Objects 深度集成、且没有外部约束迫使迁移的工作负载。

风险与注意事项

项目没有公开的 API 文档、没有发布说明,README 极简。当前采纳更像研究级投入,而非即插即用平台。

  • README 元数据只有一行描述,没有 topics、主页或部署指南。
  • 现有素材中看不到版本标签、变更日志或稳定性承诺。
  • workspace 钉住了较新的 crate 版本(axum 0.7、hyper 1、v8 152),升级之间存在破坏性变更风险。
  • 复制、故障转移、一致性等分布式语义在现有素材中均未描述。
  • 运行时内嵌 V8 152,跟随 Chromium 安全更新;运维必须重新构建 celld 才能获得 V8 补丁。
  • TLS 由 rustls 0.23 与 ring 提供者承担;显式选择了 ring 而非 aws-lc-rs。
  • 加密栈包含 aes-gcm 0.10、ed25519-dalek 2、p256 0.13 与 rsa 0.9,说明请求与状态加密在项目范围内。
  • 最终 Docker 镜像除 debian-slim 基础包外只额外安装 ca-certificates,运行时容器攻击面较小。
  • 现有素材中看不到 CVE 订阅、安全策略或漏洞披露流程。

替代方案比较

方案适用场景代价
Cloudflare Durable Objects
你希望使用原始的托管实现,无需自建基础设施。按 Cloudflare Workers 用量计费
Temporal
你需要的是持久化工作流编排,而非单线程有状态对象。开源(MIT)或 Temporal Cloud 托管
Redis
你的工作负载以键值或 pub/sub 为主,不需要 JavaScript Actor。开源(RSF/SSPL)或 Redis Cloud
Litestream
你只想要 SQLite 复制,不需要上层 Actor 抽象。开源(Apache-2.0)

这个趋势说明了什么

自托管的实时协作后端

fastwebsockets、单写者 Durable Object 语义与 object_store 持久化的组合,非常契合目前被路由到 Cloudflare 的协同编辑或在线状态场景。

编写一个持有文档状态的 celld 对象,接受 WebSocket 连接,并测量当 object_store 后端不可达时的故障转移时间。

内网隔离环境下的有状态 Actor

由于 celld 可以运行在自有硬件上、并通过 rusqlite 使用本地 SQLite,它可以服务于数据不能离开部署边界的合规场景。

离线构建 Docker 镜像,使用本地 rusqlite 存储运行,确认对象执行过程不需要任何外网调用。

下一步建议

构建镜像并追踪一次对象生命周期

目前没有托管试用,评估 celld 最快的方式是在本地构建 Docker 镜像并检查其二进制能力面。

  1. 克隆仓库,按提供的 Dockerfile 执行 `docker build -t celld:local .`。
  2. 检查两阶段测试门,确认在你的机器上 clippy 的 `-D warnings` 能通过。
  3. 使用 `--help`(或等价命令)运行 `celld`,枚举适配宿主暴露的配置项。
  4. 追踪 `crates/logic` crate,查看哪些行为决策可以在没有副作用执行器的情况下被单元测试。

RepoDaily 判断

denoland/celld 是 Deno 对自托管 Durable Objects 的一次有说服力的 Rust/V8 重写,但它还处于早期:没有 API 文档、没有发布契约、也没有公开的分布式语义保证。在 Deno 发布稳定性声明之前,请把它当作研究级平台来原型验证,而不是直接作为生产依赖。

信息来源