diff --git a/docs/zh-CN/install/fly.md b/docs/zh-CN/install/fly.md index bee9a9a0c..90627bcd7 100644 --- a/docs/zh-CN/install/fly.md +++ b/docs/zh-CN/install/fly.md @@ -2,60 +2,60 @@ read_when: - 在 Fly.io 上部署 OpenClaw - 设置 Fly 卷、密钥和首次运行配置 -summary: OpenClaw 在 Fly.io 上部署的分步指南,包含持久化存储和 HTTPS +summary: 使用 Fly.io 部署 OpenClaw 的分步指南,包含持久化存储和 HTTPS title: Fly.io x-i18n: - generated_at: "2026-04-27T07:11:41Z" - model: gpt-5.4 + generated_at: "2026-05-03T13:42:44Z" + model: gpt-5.5 provider: openai - source_hash: 195a77c4cec439dc2b5030f5ee618274df76b16d878b8d16e65a754e4bd8072c + source_hash: d9b98b2d1c102195e31ee7e93ba075e6cfa16080e78f8e17fc006a62d300ce1a source_path: install/fly.md - workflow: 15 + workflow: 16 --- # Fly.io 部署 -**目标:** 让 OpenClaw Gateway 网关运行在 [Fly.io](https://fly.io) 机器上,并具备持久化存储、自动 HTTPS 和 Discord/渠道访问能力。 +**目标:** OpenClaw Gateway 网关运行在 [Fly.io](https://fly.io) 机器上,具备持久存储、自动 HTTPS,以及 Discord/渠道访问能力。 ## 你需要准备 - 已安装 [flyctl CLI](https://fly.io/docs/hands-on/install-flyctl/) - Fly.io 账号(免费套餐可用) -- 模型认证:你所选模型提供商的 API 密钥 -- 渠道凭证:Discord 机器人令牌、Telegram 令牌等 +- 模型凭证:所选模型提供商的 API key +- 渠道凭证:Discord bot token、Telegram token 等 -## 面向初学者的快速路径 +## 新手快速路径 1. 克隆仓库 → 自定义 `fly.toml` -2. 创建应用和卷 → 设置密钥 +2. 创建应用 + 卷 → 设置密钥 3. 使用 `fly deploy` 部署 -4. SSH 进入以创建配置,或使用 Control UI +4. 通过 SSH 进入以创建配置,或使用控制 UI ```bash - # 克隆仓库 + # Clone the repo git clone https://github.com/openclaw/openclaw.git cd openclaw - # 创建一个新的 Fly 应用(请自行选择名称) + # Create a new Fly app (pick your own name) fly apps create my-openclaw - # 创建一个持久化卷(通常 1 GB 就足够) + # Create a persistent volume (1GB is usually enough) fly volumes create openclaw_data --size 1 --region iad ``` - **提示:** 请选择离你较近的区域。常见选项:`lhr`(伦敦)、`iad`(弗吉尼亚)、`sjc`(圣何塞)。 + **提示:** 选择离你较近的区域。常见选项:`lhr`(伦敦)、`iad`(弗吉尼亚)、`sjc`(圣何塞)。 编辑 `fly.toml`,使其与你的应用名称和需求匹配。 - **安全说明:** 默认配置会暴露一个公开 URL。若要进行无公网 IP 的加固部署,请参阅 [私有部署](#private-deployment-hardened) 或使用 `fly.private.toml`。 + **安全说明:** 默认配置会公开一个公共 URL。对于没有公共 IP 的强化部署,请参阅[私有部署](#private-deployment-hardened),或使用 `deploy/fly.private.toml`。 ```toml - app = "my-openclaw" # 你的应用名称 + app = "my-openclaw" # Your app name primary_region = "iad" [build] @@ -91,35 +91,35 @@ x-i18n: | 设置 | 原因 | | ------------------------------ | --------------------------------------------------------------------------- | - | `--bind lan` | 绑定到 `0.0.0.0`,这样 Fly 的代理才能访问 Gateway 网关 | - | `--allow-unconfigured` | 允许在没有配置文件的情况下启动(之后你会创建配置文件) | - | `internal_port = 3000` | 必须与 `--port 3000`(或 `OPENCLAW_GATEWAY_PORT`)匹配,以便 Fly 健康检查 | - | `memory = "2048mb"` | 512 MB 太小;建议使用 2 GB | - | `OPENCLAW_STATE_DIR = "/data"` | 将状态持久化到卷中 | + | `--bind lan` | 绑定到 `0.0.0.0`,以便 Fly 的代理可以访问 Gateway 网关 | + | `--allow-unconfigured` | 在没有配置文件的情况下启动(你稍后会创建一个) | + | `internal_port = 3000` | 必须与 `--port 3000`(或 `OPENCLAW_GATEWAY_PORT`)匹配,用于 Fly 健康检查 | + | `memory = "2048mb"` | 512MB 太小;建议使用 2GB | + | `OPENCLAW_STATE_DIR = "/data"` | 将状态持久化到卷上 | ```bash - # 必需:Gateway 网关令牌(用于非 loopback 绑定) + # Required: Gateway token (for non-loopback binding) fly secrets set OPENCLAW_GATEWAY_TOKEN=$(openssl rand -hex 32) - # 模型提供商 API 密钥 + # Model provider API keys fly secrets set ANTHROPIC_API_KEY=sk-ant-... - # 可选:其他提供商 + # Optional: Other providers fly secrets set OPENAI_API_KEY=sk-... fly secrets set GOOGLE_API_KEY=... - # 渠道令牌 + # Channel tokens fly secrets set DISCORD_BOT_TOKEN=MTQ... ``` **说明:** - - 非 loopback 绑定(`--bind lan`)需要有效的 Gateway 网关认证路径。这个 Fly.io 示例使用 `OPENCLAW_GATEWAY_TOKEN`,但 `gateway.auth.password` 或正确配置的非 loopback `trusted-proxy` 部署同样满足要求。 - - 请像对待密码一样保护这些令牌。 - - **对于所有 API 密钥和令牌,优先使用环境变量而不是配置文件。** 这样可以避免将密钥写入 `openclaw.json`,从而降低意外暴露或被记录到日志中的风险。 + - 非 loopback 绑定(`--bind lan`)需要有效的 Gateway 网关认证路径。这个 Fly.io 示例使用 `OPENCLAW_GATEWAY_TOKEN`,但 `gateway.auth.password` 或正确配置的非 loopback `trusted-proxy` 部署也能满足要求。 + - 像对待密码一样保护这些 token。 + - **所有 API key 和 token 都优先使用环境变量,而不是配置文件**。这样可以避免密钥进入 `openclaw.json`,从而被意外暴露或记录到日志中。 @@ -128,9 +128,9 @@ x-i18n: fly deploy ``` - 首次部署会构建 Docker 镜像(约 2–3 分钟)。后续部署会更快。 + 首次部署会构建 Docker 镜像(约 2-3 分钟)。后续部署会更快。 - 部署后,请验证: + 部署后验证: ```bash fly status @@ -147,7 +147,7 @@ x-i18n: - 通过 SSH 进入机器以创建正式配置: + 通过 SSH 进入机器以创建合适的配置: ```bash fly ssh console @@ -214,18 +214,18 @@ x-i18n: EOF ``` - **注意:** 使用 `OPENCLAW_STATE_DIR=/data` 时,配置路径为 `/data/openclaw.json`。 + **注意:** 使用 `OPENCLAW_STATE_DIR=/data` 时,配置路径是 `/data/openclaw.json`。 - **注意:** 请将 `https://my-openclaw.fly.dev` 替换为你的实际 Fly 应用源地址。Gateway 网关启动时会根据运行时的 `--bind` 和 `--port` 值预填充本地 Control UI 源地址,因此即使配置尚不存在,首次启动也可以继续;但要通过 Fly 在浏览器中访问,仍然需要在 `gateway.controlUi.allowedOrigins` 中列出准确的 HTTPS 源地址。 + **注意:** 将 `https://my-openclaw.fly.dev` 替换为你的真实 Fly 应用源。Gateway 网关启动会根据运行时的 `--bind` 和 `--port` 值填充本地控制 UI 源,因此第一次启动可以在配置存在之前继续进行,但通过 Fly 进行浏览器访问仍需要在 `gateway.controlUi.allowedOrigins` 中列出准确的 HTTPS 源。 - **注意:** Discord 令牌可以来自以下任一位置: + **注意:** Discord token 可以来自以下任一位置: - 环境变量:`DISCORD_BOT_TOKEN`(推荐用于密钥) - 配置文件:`channels.discord.token` - 如果使用环境变量,则无需将令牌添加到配置中。Gateway 网关会自动读取 `DISCORD_BOT_TOKEN`。 + 如果使用环境变量,则无需将 token 添加到配置中。Gateway 网关会自动读取 `DISCORD_BOT_TOKEN`。 - 重启以应用更改: + 重启以应用: ```bash exit @@ -235,7 +235,7 @@ x-i18n: - ### Control UI + ### 控制 UI 在浏览器中打开: @@ -245,13 +245,13 @@ x-i18n: 或访问 `https://my-openclaw.fly.dev/` - 使用已配置的共享密钥进行认证。本指南使用的是 `OPENCLAW_GATEWAY_TOKEN` 中的 Gateway 网关令牌;如果你改用了密码认证,请改用对应密码。 + 使用配置的共享密钥进行认证。本指南使用来自 `OPENCLAW_GATEWAY_TOKEN` 的 Gateway 网关 token;如果你切换到了密码认证,请改用该密码。 ### 日志 ```bash - fly logs # 实时日志 - fly logs --no-tail # 最近日志 + fly logs # Live logs + fly logs --no-tail # Recent logs ``` ### SSH 控制台 @@ -265,44 +265,44 @@ x-i18n: ## 故障排除 -### “App is not listening on expected address” +### “应用未在预期地址上监听” Gateway 网关绑定到了 `127.0.0.1`,而不是 `0.0.0.0`。 -**修复方法:** 在 `fly.toml` 的进程命令中添加 `--bind lan`。 +**修复:** 在 `fly.toml` 的进程命令中添加 `--bind lan`。 ### 健康检查失败 / 连接被拒绝 -Fly 无法通过配置的端口访问 Gateway 网关。 +Fly 无法在配置的端口上访问 Gateway 网关。 -**修复方法:** 确保 `internal_port` 与 Gateway 网关端口匹配(设置 `--port 3000` 或 `OPENCLAW_GATEWAY_PORT=3000`)。 +**修复:** 确保 `internal_port` 与 Gateway 网关端口匹配(设置 `--port 3000` 或 `OPENCLAW_GATEWAY_PORT=3000`)。 ### OOM / 内存问题 -容器不断重启或被终止。常见迹象包括:`SIGABRT`、`v8::internal::Runtime_AllocateInYoungGeneration`,或静默重启。 +容器持续重启或被终止。迹象包括:`SIGABRT`、`v8::internal::Runtime_AllocateInYoungGeneration`,或无提示重启。 -**修复方法:** 在 `fly.toml` 中增加内存: +**修复:** 在 `fly.toml` 中增加内存: ```toml [[vm]] memory = "2048mb" ``` -或者更新现有机器: +或更新现有机器: ```bash fly machine update --vm-memory 2048 -y ``` -**注意:** 512 MB 太小。1 GB 可能可以运行,但在负载较高或日志较详细时可能发生 OOM。**建议使用 2 GB。** +**注意:** 512MB 太小。1GB 可能可用,但在负载下或日志较详细时可能 OOM。**建议使用 2GB。** -### Gateway 网关锁文件问题 +### Gateway 网关锁问题 -Gateway 网关拒绝启动,并提示 “already running” 错误。 +Gateway 网关因 “already running” 错误拒绝启动。 -这种情况通常发生在容器重启后,PID 锁文件仍保留在卷中。 +当容器重启但 PID 锁文件仍保留在卷上时,会发生这种情况。 -**修复方法:** 删除锁文件: +**修复:** 删除锁文件: ```bash fly ssh console --command "rm -f /data/gateway.*.lock" @@ -311,11 +311,11 @@ fly machine restart 锁文件位于 `/data/gateway.*.lock`(不在子目录中)。 -### 未读取配置 +### 配置未被读取 -`--allow-unconfigured` 只会绕过启动保护,不会创建或修复 `/data/openclaw.json`,因此请确保你的真实配置文件存在,并且在你希望正常启动本地 Gateway 网关时包含 `gateway.mode="local"`。 +`--allow-unconfigured` 只会绕过启动保护。它不会创建或修复 `/data/openclaw.json`,因此当你需要正常启动本地 Gateway 网关时,请确保真实配置存在并包含 `gateway.mode="local"`。 -验证配置是否存在: +验证配置存在: ```bash fly ssh console --command "cat /data/openclaw.json" @@ -326,10 +326,10 @@ fly ssh console --command "cat /data/openclaw.json" `fly ssh console -C` 命令不支持 shell 重定向。要写入配置文件: ```bash -# 使用 echo + tee(从本地管道传输到远程) +# Use echo + tee (pipe from local to remote) echo '{"your":"config"}' | fly ssh console -C "tee /data/openclaw.json" -# 或使用 sftp +# Or use sftp fly sftp shell > put /local/path/config.json /data/openclaw.json ``` @@ -342,20 +342,20 @@ fly ssh console --command "rm /data/openclaw.json" ### 状态未持久化 -如果你在重启后丢失认证配置文件、渠道/提供商状态或会话,说明状态目录写入到了容器文件系统。 +如果你在重启后丢失认证配置、渠道/提供商状态或会话,说明状态目录正在写入容器文件系统。 -**修复方法:** 确保在 `fly.toml` 中设置了 `OPENCLAW_STATE_DIR=/data`,然后重新部署。 +**修复:** 确保 `fly.toml` 中设置了 `OPENCLAW_STATE_DIR=/data`,然后重新部署。 ## 更新 ```bash -# 拉取最新更改 +# Pull latest changes git pull -# 重新部署 +# Redeploy fly deploy -# 检查健康状态 +# Check health fly status fly logs ``` @@ -365,59 +365,59 @@ fly logs 如果你需要在不完整重新部署的情况下更改启动命令: ```bash -# 获取机器 ID +# Get machine ID fly machines list -# 更新命令 +# Update command fly machine update --command "node dist/index.js gateway --port 3000 --bind lan" -y -# 或连同内存增加一起更新 +# Or with memory increase fly machine update --vm-memory 2048 --command "node dist/index.js gateway --port 3000 --bind lan" -y ``` -**注意:** 执行 `fly deploy` 后,机器命令可能会重置为 `fly.toml` 中的内容。如果你做过手动更改,请在部署后重新应用这些更改。 +**注意:** 执行 `fly deploy` 后,机器命令可能会重置为 `fly.toml` 中的内容。如果你做了手动更改,请在部署后重新应用。 -## 私有部署(加固) +## 私有部署(强化) -默认情况下,Fly 会分配公网 IP,使你的 Gateway 网关可以通过 `https://your-app.fly.dev` 访问。这很方便,但也意味着你的部署会被互联网扫描器(Shodan、Censys 等)发现。 +默认情况下,Fly 会分配公共 IP,使你的 Gateway 网关可通过 `https://your-app.fly.dev` 访问。这很方便,但也意味着你的部署会被互联网扫描器(Shodan、Censys 等)发现。 -如果你希望进行**完全不对公网暴露**的加固部署,请使用私有模板。 +对于**没有公共暴露**的强化部署,请使用私有模板。 ### 何时使用私有部署 -- 你只会发起**出站**调用/消息(没有入站 webhook) -- 你使用 **ngrok 或 Tailscale** 隧道处理 webhook 回调 +- 你只发起**出站**调用/消息(没有入站 webhook) +- 你为任何 webhook 回调使用 **ngrok 或 Tailscale** 隧道 - 你通过 **SSH、代理或 WireGuard** 访问 Gateway 网关,而不是浏览器 - 你希望部署**对互联网扫描器隐藏** ### 设置 -使用 `fly.private.toml`,而不是标准配置: +使用 `deploy/fly.private.toml`,而不是标准配置: ```bash -# 使用私有配置部署 -fly deploy -c fly.private.toml +# Deploy with private config +fly deploy -c deploy/fly.private.toml ``` -或者将现有部署转换为私有部署: +或转换现有部署: ```bash -# 列出当前 IP +# List current IPs fly ips list -a my-openclaw -# 释放公网 IP +# Release public IPs fly ips release -a my-openclaw fly ips release -a my-openclaw -# 切换到私有配置,这样后续部署就不会重新分配公网 IP -# (移除 [http_service],或使用私有模板部署) -fly deploy -c fly.private.toml +# Switch to private config so future deploys don't re-allocate public IPs +# (remove [http_service] or deploy with the private template) +fly deploy -c deploy/fly.private.toml -# 分配仅私有的 IPv6 +# Allocate private-only IPv6 fly ips allocate-v6 --private -a my-openclaw ``` -完成后,`fly ips list` 应只显示一个 `private` 类型的 IP: +完成后,`fly ips list` 应该只显示一个 `private` 类型的 IP: ``` VERSION IP TYPE REGION @@ -426,40 +426,40 @@ v6 fdaa:x:x:x:x::x private global ### 访问私有部署 -由于没有公开 URL,请使用以下方法之一: +由于没有公共 URL,请使用以下方法之一: **选项 1:本地代理(最简单)** ```bash -# 将本地 3000 端口转发到应用 +# Forward local port 3000 to the app fly proxy 3000:3000 -a my-openclaw -# 然后在浏览器中打开 http://localhost:3000 +# Then open http://localhost:3000 in browser ``` **选项 2:WireGuard VPN** ```bash -# 创建 WireGuard 配置(一次性) +# Create WireGuard config (one-time) fly wireguard create -# 导入到 WireGuard 客户端,然后通过内部 IPv6 访问 -# 例如:http://[fdaa:x:x:x:x::x]:3000 +# Import to WireGuard client, then access via internal IPv6 +# Example: http://[fdaa:x:x:x:x::x]:3000 ``` -**选项 3:仅使用 SSH** +**选项 3:仅 SSH** ```bash fly ssh console -a my-openclaw ``` -### 私有部署中的 webhook +### 私有部署中的 Webhook -如果你需要 webhook 回调(Twilio、Telnyx 等),但又不希望对公网暴露: +如果你需要回调通知(Twilio、Telnyx 等)但不想公开暴露: -1. **ngrok 隧道** —— 在容器内运行 ngrok,或作为 sidecar 运行 -2. **Tailscale Funnel** —— 通过 Tailscale 暴露特定路径 -3. **仅出站** —— 某些提供商(Twilio)在没有 webhook 的情况下也能正常进行出站呼叫 +1. **ngrok 隧道** - 在容器内或作为边车运行 ngrok +2. **Tailscale Funnel** - 通过 Tailscale 暴露特定路径 +3. **仅出站** - 某些提供商(Twilio)无需回调通知即可正常处理出站呼叫 使用 ngrok 的语音通话配置示例: @@ -482,39 +482,39 @@ fly ssh console -a my-openclaw } ``` -ngrok 隧道在容器内运行,并提供一个公开的 webhook URL,而无需暴露 Fly 应用本身。请将 `webhookSecurity.allowedHosts` 设置为公开隧道的主机名,以便接受转发后的 host 标头。 +ngrok 隧道在容器内运行,并提供一个公开回调 URL,而无需暴露 Fly 应用本身。将 `webhookSecurity.allowedHosts` 设置为公开隧道主机名,以便接受转发的主机头。 -### 安全收益 +### 安全优势 -| 方面 | 公开 | 私有 | +| 方面 | 公开 | 私有 | | ----------------- | ------------ | ---------- | -| 互联网扫描器 | 可被发现 | 隐藏 | -| 直接攻击 | 可能 | 被阻止 | -| Control UI 访问 | 浏览器 | 代理/VPN | -| webhook 投递 | 直接 | 通过隧道 | +| 互联网扫描器 | 可发现 | 隐藏 | +| 直接攻击 | 可能 | 已阻断 | +| 控制界面访问 | 浏览器 | 代理/VPN | +| 回调投递 | 直接 | 通过隧道 | ## 说明 -- Fly.io 使用的是 **x86 架构**(不是 ARM) -- Dockerfile 同时兼容这两种架构 -- 如需进行 WhatsApp/Telegram 新手引导,请使用 `fly ssh console` -- 持久化数据存储在卷上的 `/data` -- Signal 需要 Java + signal-cli;请使用自定义镜像,并将内存保持在 2 GB 以上。 +- Fly.io 使用 **x86 架构**(不是 ARM) +- Dockerfile 与两种架构兼容 +- 对于 WhatsApp/Telegram 新手引导,请使用 `fly ssh console` +- 持久数据位于 `/data` 上的卷中 +- Signal 需要 Java + signal-cli;请使用自定义镜像,并将内存保持在 2GB 以上。 -## 费用 +## 成本 -使用推荐配置(`shared-cpu-2x`,2 GB RAM)时: +使用推荐配置(`shared-cpu-2x`,2GB RAM): -- 费用大约为每月 10–15 美元,具体取决于使用情况 -- 免费套餐包含一定额度 +- 约 $10-15/月,取决于使用量 +- 免费套餐包含一些额度 -详情请参阅 [Fly.io 定价](https://fly.io/docs/about/pricing/)。 +详情请参阅 [Fly.io 价格](https://fly.io/docs/about/pricing/)。 ## 后续步骤 - 设置消息渠道:[渠道](/zh-CN/channels) - 配置 Gateway 网关:[Gateway 网关配置](/zh-CN/gateway/configuration) -- 保持 OpenClaw 为最新版本:[更新](/zh-CN/install/updating) +- 让 OpenClaw 保持最新:[更新](/zh-CN/install/updating) ## 相关内容