今天在 GitHub Trending 上看到一个有意思的项目:Cloudflare Computer,它将一个虚拟文件系统直接实现在 Durable Object 内部,通过 SQLite 作为状态中枢,支持三种完全不同的执行后端——从完整的 Linux 容器到纯 JavaScript 运行时。

一、项目概述

Cloudflare Computer 是一个 Durable Object 原生虚拟文件系统(VFS),核心设计思想是:状态权威存储 + 可插拔执行面。

项目的核心价值在于:让 AI Agent、工作流引擎或任何需要临时工作目录的场景,能够直接在 Cloudflare Workers 基础设施上获得持久化的文件系统,而无需额外部署存储服务。

核心特性

  • SQLite 权威状态:所有文件元数据和内容存储在 Durable Object 的 SQLite 中,通过 capnweb RPC 协议与后端同步
  • 三种运行时后端:Container(FUSE 挂载 + 完整 Linux)、Isolate Shell(bash in Dynamic Worker)、Isolate JavaScript(ESM in Dynamic Worker)
  • 统一执行入口:workspace.runtime.exec(source, { backend }) 是唯一的调用入口,后端按需懒加载
  • 零额外存储往返:Isolate 后端直接通过 Workers RPC 访问 Workspace,避免二次同步延迟
  • Monorepo 架构:分为 dofs(文件系统核心)、rpc(通信协议)、computerd(FUSE 守护进程)、computer(顶层入口)四个包

二、技术原理

架构设计

Cloudflare Computer 的架构分为三层:

┌─────────────────────────────────────────────┐
│              Consumer (Worker)              │
│     workspace.runtime.exec(source, opts)    │
└──────────────────┬──────────────────────────┘
                   │
        workspace.runtime  ← 插拔层
┌──────────────────┼──────────────────────────┐
│          Durable Object                    │
│  ┌─────────────────────────────────────┐  │
│  │         SQLite (权威状态)             │  │
│  │         dofs 包 (虚拟文件系统)        │  │
│  └─────────────────────────────────────┘  │
└──────────┬──────────┬───────────────────────┘
           │          │
    ┌──────┴──────┐  ┌┴────────────────┐
    │  Container  │  │  Isolate Shell  │
    │  (FUSE RPC) │  │  (just-bash)    │
    │  computerd  │  └─────────────────┘
    └─────────────┘  ┌─────────────────┐
                     │  Isolate JS     │
                     │  (Dynamic Worker)│
                     └─────────────────┘

Container 后端:FUSE 挂载 + 真实 Linux 环境

Container 后端使用 FUSE(Filesystem in Userspace)将 Durable Object 的 SQLite 状态映射为真实挂载点:

# computerd 守护进程工作流程
# 1. 启动时通过 capnweb RPC 连接 Durable Object
# 2. 从 SQLite 获取初始文件系统状态
# 3. 挂载为 FUSE 文件系统到 /mnt/workspace
# 4. 用户在容器内读写文件 → computerd 同步回 SQLite

核心源码在 packages/computerd 中,关键逻辑:

// 伪代码:computerd 的核心同步循环
async function syncLoop() {
  const rpc = new CapnWebRPC(doConnection);
  for await (const event of watchFuseEvents()) {
    if (event.kind === 'WRITE') {
      await rpc.write(event.path, event.data);
    } else if (event.kind === 'READ') {
      const data = await rpc.read(event.path);
      respondFuse(event.fid, data);
    }
  }
}

Isolate 后端:直接 RPC,无状态同步

Isolate Shell 和 Isolate JavaScript 后端不走 FUSE,而是通过 Workers RPC 直接与 Durable Object 通信:

// packages/computer/src/exec.ts(概念示例)
export async function exec(source: string, opts: { backend: 'shell' | 'js' }) {
  const worker = await env.WORKER_POOL.getOne(); // Dynamic Worker
  if (opts.backend === 'shell') {
    return worker.eval(`just-bash -c "${source}"`);
  } else {
    return worker.eval(`import("${source}")`);
  }
}

这种方式避免了 FUSE 同步开销,适合轻量级任务。

SQLite 作为权威状态

@cloudflare/dofs(Durable Object Filesystem)包负责 SQLite 的管理:

// packages/dofs/src/index.ts
export class Workspace {
  constructor(private do: DurableObjectState) {}

  async mkdir(path: string) {
    await this.do.storage.transaction(async (txn) => {
      await txn.put(`meta:${path}`, { type: 'dir' });
    });
  }

  async writeFile(path: string, data: Uint8Array) {
    await this.do.storage.put(`file:${path}`, data);
  }

  async readFile(path: string): Promise<Uint8Array> {
    return (await this.do.storage.get(`file:${path}`)) ?? new Uint8Array();
  }
}

性能表现

根据官方 benchmark(docs/19_performance.md):

操作类型computerd FUSE真实磁盘
metadata-heavy(大量 stat/open)胜出略慢
large sequential I/O(大文件顺序读写)略慢胜出

FUSE 在元数据密集型操作上反而有优势,这是因为 SQLite 的索引结构对高频小文件操作做了优化。

三、安装与快速开始

环境要求

  • Node.js 18+
  • Cloudflare Workers 部署环境(Wrangler v3+)
  • Durable Objects 支持(需要 Workers Paid 计划)

安装

npm install @cloudflare/computer

Container 示例(需要部署)

import { Workspace, ContainerRuntime } from '@cloudflare/computer';

// 在 Durable Object 中初始化
export class MyDO implements DurableObject {
  constructor(state: DurableObjectState, env: Env) {
    this.workspace = new Workspace(state);
    this.runtime = new ContainerRuntime(this.workspace);
  }

  async fetch(request: Request) {
    const result = await this.runtime.exec('ls -la /workspace', {
      backend: 'container'
    });
    return new Response(result.stdout);
  }
}

JavaScript Isolate 示例

import { Workspace, JsRuntime } from '@cloudflare/computer';

export class MyAgent implements DurableObject {
  constructor(state, env) {
    this.workspace = new Workspace(state);
    this.runtime = new JsRuntime(this.workspace);
  }

  async runAgent(prompt: string) {
    // workspace.fs 自动注入到模块执行上下文
    const result = await this.runtime.exec(`
      import { readdir, readFile, writeFile } from 'node:fs/promises';
      const files = await readdir('/workspace');
      await writeFile('/workspace/output.txt', 'done');
      return files;
    `, { backend: 'js' });
    return result;
  }
}

四、使用方法与实战

构建 AI Agent 工作目录

Cloudflare Computer 最实用的场景之一是让 AI Agent 拥有持久化的工作目录:

// 来自 examples/think 的用法
import { Workspace } from '@cloudflare/computer';
import { think } from '@cloudflare/think';

const workspace = new Workspace(doState);
// Agent 可以像在真实服务器上一样操作文件
const session = await think({
  workspace,
  prompt: '帮我写一个 Python 脚本来处理 data.csv',
  runtime: 'container' // 或 'js'
});

对比不同后端

场景推荐后端原因
需要 gcc、pandoc 等系统工具Container完整 Linux 用户态
快速脚本任务(bash)Isolate Shell无容器启动开销
AI Agent 调用 JS/TS 库Isolate JavaScript天然 ESM 支持,依赖 npm 包
高频小文件操作Container(FUSE 优化过)SQLite 索引优势

生成并发布 Worker 项目

// examples/artifacts:用 AI 生成代码后直接发布
const generated = await think({
  prompt: '创建一个返回 "Hello World" 的 Worker',
  workspace,
  runtime: 'js'
});
await workspace.publish(); // 发布到 Cloudflare Artifacts

五、常见问题与解决方案

Q:Container 后端需要特殊权限吗? A:需要 Workers 启用 experimental饶有趣味的 Durable Objects 沙箱 支持。目前处于 Preview 阶段,不适合生产环境。

Q:SQLite 存储有大小限制吗? A:Durable Object 存储单对象上限 1MB(标准),可通过 R2 或 D1 扩展存储大文件。FUSE 层的 computerd 会处理溢出。

Q:Isolate 后端和 Container 后端数据一致吗? A:是的,两者共享同一个 Durable Object Workspace 实例,SQLite 是唯一权威数据源。

Q:文件修改后多久同步到 SQLite? A:Container 后端在每次 FUSE fsync 时同步;Isolate 后端通过 RPC 实时写入,无额外延迟。

六、总结

Cloudflare Computer 是一个非常前沿的实验性项目,它将虚拟文件系统的状态权威直接嵌入 Durable Object,用 SQLite 作为持久化层,通过三种不同的执行后端(Container/Shell/JS)提供统一的使用接口。对于需要在边缘运行 AI Agent、工作流引擎或临时构建系统的场景,这是一个值得关注的方案——尤其是它已经内置了与 @cloudflare/think(AI Agent 框架)的集成。

[!IMPORTANT] 该项目目前处于 Preview Only 阶段,API 不稳定,不适合生产使用,但非常适合探索边缘计算与持久化工作目录结合的可能性。