OpenClaw on Cloudflare Workers
在 Cloudflare Sandbox 中运行 OpenClaw(曾用名 Moltbot,曾用名 Clawdbot)个人 AI 助手。

实验性: 这是一个概念验证,展示了 OpenClaw 可以在 Cloudflare Sandbox 中运行。它不受官方支持,且可能无通知中断。自行承担风险。
要求
- Workers 付费计划 ($5 USD/月) — Cloudflare Sandbox 容器所需。运行容器会产生额外计算成本;详情请见下方的 容器成本估算。
- Anthropic API 密钥 — 用于访问 Claude,或者您可以使用 AI Gateway 的 统一计费。
此项目使用的 Cloudflare 功能有免费层级:
- Cloudflare Access (认证)
- 浏览器渲染 (用于浏览器导航)
- AI Gateway (可选,用于 API 路由/分析)
- R2 存储 (可选,用于持久化)
容器成本估算
此项目使用 standard-1 Cloudflare 容器实例(1/2 vCPU,4 GiB 内存,8 GB 磁盘)。以下是假设容器 24/7 运行时的近似月度成本,基于 Cloudflare 容器定价:
| 资源 | 配置 | 月度使用量 | 包含免费 | 超出 | 近似成本 |
|---|---|---|---|---|---|
| 内存 | 4 GiB | 2,920 GiB-hrs | 25 GiB-hrs | 2,895 GiB-hrs | ~$26/月 |
| CPU (约 10% 利用率) | 1/2 vCPU | ~2,190 vCPU-min | 375 vCPU-min | ~1,815 vCPU-min | ~$2/月 |
| 磁盘 | 8 GB | 5,840 GB-hrs | 200 GB-hrs | 5,640 GB-hrs | ~$1.50/月 |
| Workers 付费计划 | $5/月 | ||||
| 总计 | ~$34.50/月 |
注意:
- CPU 仅按 实际使用量 计费,而非配置容量。10% 利用率估计是一个轻度使用的个人助手的基本线;您的实际成本将随使用情况变化。
- 内存和磁盘按 配置容量 全时间计费。
- 为降低成本,配置
SANDBOX_SLEEP_AFTER(例如10m),使容器在空闲时休眠。仅运行 4 小时的容器在计算成本上大致为 ~$5-6/月(除 $5 计划费外)。 - 网络出口、Workers/Durable Objects 请求和日志会产生额外费用,但对于个人使用通常很小。
- 请参阅 实例类型表 了解其他选项(例如,
lite内存 256 MiB/$0.50/月,或standard-412 GiB 用于较重负载)。
什么是 OpenClaw?
OpenClaw(曾用名 Moltbot,曾用名 Clawdbot)是一个具有网关架构的个人 AI 助手,可连接到多个聊天平台。主要功能:
- 控制 UI - 网关的基于 Web 的聊天界面
- 多渠道支持 - Telegram、Discord、Slack
- 设备配对 - 需要明确批准的安全 DM 认证
- 持久对话 - 跨会话的聊天历史和上下文
- 代理运行时 - 可扩展的 AI 功能,具有工作区和技能
本项目将 OpenClaw 打包到 Cloudflare Sandbox 容器中运行,提供完全管理的、始终在线的部署,无需自行托管。可选的 R2 存储可实现跨容器重启的数据持久化。
架构

快速入门
Cloudflare Sandboxes 可在 Workers 付费计划 上获取。
# 安装依赖
npm install
# 设置您的 API 密钥(直接 Anthropic 访问)
npx wrangler secret put ANTHROPIC_API_KEY
# 或者使用 Cloudflare AI Gateway(见下文“可选:Cloudflare AI Gateway”)
# npx wrangler secret put CLOUDFLARE_AI_GATEWAY_API_KEY
# npx wrangler secret put CF_AI_GATEWAY_ACCOUNT_ID
# npx wrangler secret put CF_AI_GATEWAY_GATEWAY_ID
# 生成并设置网关令牌(远程访问所需)
# 保存此令牌 - 您需要它来访问控制 UI
export MOLTBOT_GATEWAY_TOKEN=$(openssl rand -hex 32)
echo "您的网关令牌: $MOLTBOT_GATEWAY_TOKEN"
echo "$MOLTBOT_GATEWAY_TOKEN" | npx wrangler secret put MOLTBOT_GATEWAY_TOKEN
# 部署
npm run deploy
部署后,使用您的令牌打开控制 UI:
https://your-worker.workers.dev/?token=YOUR_GATEWAY_TOKEN
将 your-worker 替换为您的实际 worker 子域名,将 YOUR_GATEWAY_TOKEN 替换为您上面生成的令牌。
注意: 第一次请求可能需要 1-2 分钟,因为容器正在启动。
重要: 在您完成以下步骤之前,您将无法使用控制 UI。您必须:
您还可能希望 启用 R2 存储,以便您的配对设备和对话历史在容器重启后保持持久(可选但推荐)。
设置管理 UI
要使用 /_admin/ 的管理 UI 进行设备管理,您需要:
- 在您的 worker 上启用 Cloudflare Access
- 设置 Access 密钥,以便 worker 可以验证 JWTs
1. 在 workers.dev 上启用 Cloudflare Access
保护您的 worker 最简单的方法是使用 workers.dev 的内置 Cloudflare Access 集成:
- 前往 Workers & Pages 控制面板
- 选择您的 Worker(例如,
moltbot-sandbox) - 在 设置 下,在 域名和路由 中,在
workers.dev行中,点击肉丸菜单(...) - 点击 启用 Cloudflare Access
- 复制对话框中显示的值(稍后您需要 AUD 标签)。注意: 对话框中的“管理 Cloudflare Access”链接可能 404 — 忽略它。
- 要配置谁可以访问,请转到 Cloudflare 控制面板侧边栏中的 零信任 → Access → 应用程序,找到您的 Worker 应用程序:
- 将您的电子邮件地址添加到允许列表
- 或者配置其他身份提供者(Google、GitHub 等)
- 从 Access 应用程序设置中复制 应用程序受众 (AUD) 标签。这将作为您的
CF_ACCESS_AUD(见下文第 2 步)
2. 设置 Access 密钥
启用 Cloudflare Access 后,设置密钥,以便 worker 可以验证 JWTs:
# 您的 Cloudflare Access 团队域名(例如,"myteam.cloudflareaccess.com")
npx wrangler secret put CF_ACCESS_TEAM_DOMAIN
# 您在上述步骤中复制的 Access 应用程序的 Application Audience (AUD) 标签
npx wrangler secret put CF_ACCESS_AUD
您可以在 零信任控制面板 下 设置 > 自定义页面 中找到您的团队域名(它是 .cloudflareaccess.com 之前的子域名)。
3. 重新部署
npm run deploy
现在访问 /_admin/,您将看到通过 Cloudflare Access 提示进行身份验证才能访问管理 UI。
替代方案:手动 Access 应用程序
如果您更喜欢更多控制,可以手动创建 Access 应用程序:
- 前往 Cloudflare 零信任控制面板
- 导航到 Access > 应用程序
- 创建一个新的 自托管 应用程序
- 将应用程序域名设置为您的 Worker URL(例如,
moltbot-sandbox.your-subdomain.workers.dev) - 添加要保护的路径:
/_admin/*,/api/*,/debug/* - 配置您期望的身份提供者(例如,电子邮件 OTP、Google、GitHub)
- 复制 应用程序受众 (AUD) 标签 并按上述方式设置密钥
本地开发
对于本地开发,创建一个 .dev.vars 文件,其中包含:
DEV_MODE=true # 跳过 Cloudflare Access 认证 + 跳过设备配对
DEBUG_ROUTES=true # 启用 /debug/* 路由(可选)
身份验证
默认情况下,moltbot 使用 设备配对 进行身份验证。当新设备(浏览器、CLI 等)连接时,必须通过管理 UI 在 /_admin/ 进行批准。
设备配对
- 设备连接到网关
- 连接保持挂起,直到批准
- 管理员通过
/_admin/批准设备 - 设备现在已配对,可以自由连接
这是最安全的选择,因为它要求每个设备都进行明确批准。
网关令牌(必需)
当远程托管时,访问控制 UI 需要一个网关令牌。将其作为查询参数传递:
https://your-worker.workers.dev/?token=YOUR_TOKEN
wss://your-worker.workers.dev/ws?token=YOUR_TOKEN
注意: 即使有有效的令牌,新设备仍然需要通过管理 UI 在 /_admin/ 进行批准(见上文的设备配对)。
仅对于本地开发,在 .dev.vars 中设置 DEV_MODE=true 以跳过 Cloudflare Access 认证并启用 allowInsecureAuth(完全绕过设备配对)。
持久化存储 (R2)
默认情况下,moltbot 数据(配置、配对设备、对话历史)在容器重启时会丢失。要启用跨会话的持久化存储,请配置 R2:
1. 创建 R2 API 令牌
- 前往 Cloudflare 控制面板 中的 R2 > 概述
- 点击 管理 R2 API 令牌
- 创建一个新的具有 对象读写 权限的令牌
- 选择自动创建的
moltbot-data桶(首次部署时创建) - 复制 访问密钥 ID 和 秘密访问密钥
2. 设置密钥
# R2 访问密钥 ID
npx wrangler secret put R2_ACCESS_KEY_ID
# R2 秘密访问密钥
npx wrangler secret put R2_SECRET_ACCESS_KEY
# 您的 Cloudflare 账户 ID
npx wrangler secret put CF_ACCOUNT_ID
要找到您的账户 ID:前往 Cloudflare 控制面板,点击您账户名称旁边的三个点菜单,并选择“复制账户 ID”。
工作原理
R2 存储使用备份/恢复方法以简化操作:
容器启动时:
- 如果 R2 挂载并包含备份数据,则将其恢复到 moltbot 配置目录
- OpenClaw 使用其默认路径(无需特殊配置)
运行期间:
- 一个 cron 作业每 5 分钟运行一次,将 moltbot 配置同步到 R2
- 您也可以从管理 UI 在
/_admin/触发手动备份
在管理 UI 中:
- 当 R2 配置后,您将看到“上次备份:[时间戳]”
- 点击“立即备份”以触发立即同步
没有 R2 凭据,moltbot 仍然可以工作,但使用临时存储(容器重启时数据丢失)。
容器生命周期
默认情况下,sandbox 容器保持无限期存活 (SANDBOX_SLEEP_AFTER=never)。这建议使用,因为冷启动需要 1-2 分钟。
要为不经常使用的部署减少成本,您可以配置容器在一段时间不活动后休眠:
npx wrangler secret put SANDBOX_SLEEP_AFTER
# 输入:10m(或 1h、30m 等)
当容器休眠时,下一个请求将触发冷启动。如果您配置了 R2 存储,您的配对设备和数据将在重启后保持持久。
管理 UI

访问 /_admin/ 的管理 UI 以:
- R2 存储状态 - 显示 R2 是否配置,上次备份时间,以及“立即备份”按钮
- 重启网关 - 杀死并重启 moltbot 网关进程
- 设备配对 - 查看挂起请求,单独或一次性批准设备,查看已配对设备
管理 UI 需要Cloudflare Access身份验证(或本地开发时 DEV_MODE=true)。
调试端点
启用(需要 DEBUG_ROUTES=true 和 Cloudflare Access)时,/debug/* 可用的调试端点:
GET /debug/processes- 列出所有容器进程GET /debug/logs?id=<process_id>- 获取特定进程的日志GET /debug/version- 获取容器和 moltbot 版本信息
可选:聊天渠道
Telegram
npx wrangler secret put TELEGRAM_BOT_TOKEN
npm run deploy
Discord
npx wrangler secret put DISCORD_BOT_TOKEN
npm run deploy
Slack
npx wrangler secret put SLACK_BOT_TOKEN
npx wrangler secret put SLACK_APP_TOKEN
npm run deploy
可选:浏览器自动化 (CDP)
此 worker 包含一个 Chrome DevTools Protocol (CDP) 衬垫,它启用了浏览器自动化功能。这允许 OpenClaw 控制无头浏览器执行网络抓取、截图和自动化测试等任务。
设置
- 设置用于身份验证的共享密钥:
npx wrangler secret put CDP_SECRET
# 输入一个安全的随机字符串
- 设置您 worker 的公共 URL:
npx wrangler secret put WORKER_URL
# 输入:https://your-worker.workers.dev
- 重新部署:
npm run deploy
端点
| 端点 | 描述 |
|---|---|
GET /cdp/json/version | 浏览器版本信息 |
GET /cdp/json/list | 列出可用浏览器目标 |
GET /cdp/json/new | 创建新的浏览器目标 |
WS /cdp/devtools/browser/{id} | 用于 CDP 命令的 WebSocket 连接 |
所有端点都需要通过 ?secret=<CDP_SECRET> 查询参数进行身份验证。
内置技能
容器包含 /root/clawd/skills/ 中的预安装技能:
cloudflare-browser
通过 CDP 衬垫进行浏览器自动化。需要设置 CDP_SECRET 和 WORKER_URL(见上文的 浏览器自动化)。
脚本:
screenshot.js- 捕获 URL 的屏幕截图video.js- 从多个 URL 创建视频cdp-client.js- 可重用的 CDP 客户端库
用法:
# 屏幕截图
node /root/clawd/skills/cloudflare-browser/scripts/screenshot.js https://example.com output.png
# 多个 URL 的视频
node /root/clawd/skills/cloudflare-browser/scripts/video.js "https://site1.com,https://site2.com" output.mp4 --scroll
有关完整文档,请参阅 skills/cloudflare-browser/SKILL.md。
可选:Cloudflare AI Gateway
您可以将 API 请求通过 Cloudflare AI Gateway 进行路由,以实现缓存、速率限制、分析和成本跟踪。OpenClaw 对 Cloudflare AI Gateway 提供了一流的支持,作为首选提供者。
AI Gateway 作为 OpenClaw 和您的 AI 提供者(例如 Anthropic)之间的代理。请求发送到 https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/anthropic 而不是直接发送到 api.anthropic.com,为您提供 Cloudflare 的分析、缓存和速率限制。您仍然需要一个提供者 API 密钥(例如您的 Anthropic API 密钥)——网关将其转发到上游提供者。
设置
- 在 Cloudflare 控制面板的 AI Gateway 部分 创建一个 AI Gateway。
- 设置三个必需的密钥:
# 您的 AI 提供者的 API 密钥(例如,您的 Anthropic API 密钥)。
# 这会通过网关传递给上游提供者。
npx wrangler secret put CLOUDFLARE_AI_GATEWAY_API_KEY
# 您的 Cloudflare 账户 ID
npx wrangler secret put CF_AI_GATEWAY_ACCOUNT_ID
# 您的 AI Gateway ID(来自 Gateway 概览页面)
npx wrangler secret put CF_AI_GATEWAY_GATEWAY_ID
所有三个都是必需的。OpenClaw 根据账户 ID 和 Gateway ID 构建网关 URL,并将 API 密钥传递给上游提供者通过网关。
- 重新部署:
npm run deploy
当 Cloudflare AI Gateway 配置后,它将优先于直接的 ANTHROPIC_API_KEY 或 OPENAI_API_KEY。
选择模型
默认情况下,AI Gateway 使用 Anthropic 的 Claude Sonnet 4.5。要使用不同的模型或提供者,请设置 CF_AI_GATEWAY_MODEL,格式为 provider/model-id:
npx wrangler secret put CF_AI_GATEWAY_MODEL
# 输入:workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast
这适用于任何 AI Gateway 提供者:
| 提供者 | CF_AI_GATEWAY_MODEL 值示例 | API 密钥是... |
|---|---|---|
| Workers AI | workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast | Cloudflare API 令牌 |
| OpenAI | openai/gpt-4o | OpenAI API 密钥 |
| Anthropic | anthropic/claude-sonnet-4-5 | Anthropic API 密钥 |
| Groq | groq/llama-3.3-70b | Groq API 密钥 |
注意: CLOUDFLARE_AI_GATEWAY_API_KEY 必须与您正在使用的提供者匹配——这是您的提供者 API 密钥,通过网关转发。一次只能通过网关使用一个提供者。对于多个提供者,请使用直接密钥 (ANTHROPIC_API_KEY, OPENAI_API_KEY) 并结合网关配置。
Workers AI 与统一计费
通过 统一计费,您可以在不需要单独提供者 API 密钥的情况下使用 Workers AI 模型——Cloudflare 直接向您收费。将 CLOUDFLARE_AI_GATEWAY_API_KEY 设置为您的 AI Gateway 身份验证令牌(即 cf-aig-authorization 令牌)。
传统 AI Gateway 配置
AI_GATEWAY_API_KEY + AI_GATEWAY_BASE_URL 的先前方法仍然受支持以向后兼容,但已弃用,改为上述原生配置。
所有密钥参考
| 密钥 | 必需 | 描述 |
|---|---|---|
CLOUDFLARE_AI_GATEWAY_API_KEY | 是* | 您的 AI 提供者的 API 密钥,通过网关传递(例如,您的 Anthropic API 密钥)。需要 CF_AI_GATEWAY_ACCOUNT_ID 和 CF_AI_GATEWAY_GATEWAY_ID |
CF_AI_GATEWAY_ACCOUNT_ID | 是* | 您的 Cloudflare 账户 ID(用于构建网关 URL) |
CF_AI_GATEWAY_GATEWAY_ID | 是* | 您的 AI Gateway ID(用于构建网关 URL) |
CF_AI_GATEWAY_MODEL | 否 | 覆盖默认模型:provider/model-id (例如 workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast). 见 选择模型 |
ANTHROPIC_API_KEY | 是* | 直接 Anthropic API 密钥(替代 AI Gateway) |
ANTHROPIC_BASE_URL | 否 | 直接 Anthropic API 基础 URL |
OPENAI_API_KEY | 否 | OpenAI API 密钥(替代提供者) |
AI_GATEWAY_API_KEY | 否 | 传统 AI Gateway API 密钥(已弃用,使用 CLOUDFLARE_AI_GATEWAY_API_KEY) |
AI_GATEWAY_BASE_URL | 否 | 传统 AI Gateway 端点 URL(已弃用) |
CF_ACCESS_TEAM_DOMAIN | 是* | Cloudflare Access 团队域名(管理 UI 所需) |
CF_ACCESS_AUD | 是* | Cloudflare Access 应用程序受众(管理 UI 所需) |
MOLTBOT_GATEWAY_TOKEN | 是 | 用于身份验证的网关令牌(通过 ?token= 查询参数传递) |
DEV_MODE | 否 | 设置为 true 以跳过 CF Access 认证 + 设备配对(仅限本地开发) |
DEBUG_ROUTES | 否 | 设置为 true 以启用 /debug/* 路由 |
SANDBOX_SLEEP_AFTER | 否 | 容器休眠超时:never (默认) 或如 10m, 1h 等时长 |
R2_ACCESS_KEY_ID | 否 | 用于持久化存储的 R2 访问密钥 |
R2_SECRET_ACCESS_KEY | 否 | 用于持久化存储的 R2 秘密密钥 |
CF_ACCOUNT_ID | 否 | Cloudflare 账户 ID(R2 存储所需) |
TELEGRAM_BOT_TOKEN | 否 | Telegram 机器人令牌 |
TELEGRAM_DM_POLICY | 否 | Telegram DM 策略:pairing (默认) 或 open |
DISCORD_BOT_TOKEN | 否 | Discord 机器人令牌 |
DISCORD_DM_POLICY | 否 | Discord DM 策略:pairing (默认) 或 open |
SLACK_BOT_TOKEN | 否 | Slack 机器人令牌 |
SLACK_APP_TOKEN | 否 | Slack 应用程序令牌 |
CDP_SECRET | 否 | 用于 CDP 端点身份验证的共享密钥(见 浏览器自动化) |
WORKER_URL | 否 | worker 的公共 URL(CDP 所需) |
安全注意事项
身份验证层
在 Cloudflare Sandbox 中的 OpenClaw 使用多层身份验证:
-
Cloudflare Access - 保护管理路由 (
/_admin/,/api/*,/debug/*)。只有经过身份验证的用户才能管理设备。 -
网关令牌 - 访问控制 UI 所需。通过
?token=查询参数传递。保管此密钥。 -
设备配对 - 每个设备(浏览器、CLI、聊天平台 DM)都必须通过管理 UI 在
/_admin/进行明确批准,然后才能与助手交互。这是默认的“配对”DM 策略。
故障排除
npm run dev 因 Unauthorized 错误失败: 您需要启用 Cloudflare Containers 在 Containers 控制面板
网关启动失败: 查看 npx wrangler secret list 和 npx wrangler tail
配置更改未生效: 编辑 Dockerfile 中的 # Build cache bust: 注释并重新部署
首次请求缓慢: 冷启动需要 1-2 分钟。后续请求速度更快。
R2 未挂载: 确保所有三个 R2 密钥已设置 (R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, CF_ACCOUNT_ID)。注意:R2 挂载仅在 生产环境 中工作,在 wrangler dev 中不工作。
管理路由访问被拒绝: 确保 CF_ACCESS_TEAM_DOMAIN 和 CF_ACCESS_AUD 已设置,并确保您的 Cloudflare Access 应用程序配置正确。
设备未出现在管理 UI 中: 设备列表命令需要 10-15 秒,因为 WebSocket 连接开销。等待并刷新。
本地开发中的 WebSocket 问题: wrangler dev 在通过 sandbox 通过 WebSocket 代理时存在已知限制。HTTP 请求正常工作,但 WebSocket 连接可能失败。部署到 Cloudflare 以获得完整功能。
已知问题
Windows:网关以退出代码 126 (权限被拒绝) 失败
在 Windows 上,Git 可能将 shell 脚本检出为 CRLF 行尾而不是 LF 行尾。这会导致 Linux 容器内的 start-openclaw.sh 以退出代码 126 失败。确保您的存储库使用 LF 行尾——使用 Git 配置 git config --global core.autocrlf input 或添加一个 .gitattributes 文件,其中包含 * text=auto eol=lf。详情请见 #64。