Fly.io Deployment
目标: 在 Fly.io 上运行 OpenClaw Gateway,具备持久化存储、自动 HTTPS 与 Discord/频道访问。你需要什么
- 已安装 flyctl CLI
- Fly.io 账号(免费层可用)
- 模型认证:Anthropic API key(或其它 provider key)
- 频道凭据:Discord bot token、Telegram token 等
新手快速路径
- 克隆仓库 → 自定义
fly.toml - 创建 app + volume → 设置 secrets
fly deploy- SSH 进入创建配置或用 Control UI
1) 创建 Fly app
lhr(伦敦)、iad(弗吉尼亚)、sjc(圣何塞)。
2) 配置 fly.toml
编辑fly.toml,匹配你的 app 名称与需求。
安全提示: 默认配置会暴露公网 URL。若需无公网 IP 的加固部署,见 Private Deployment 或使用 fly.private.toml。
| Setting | Why |
|---|---|
--bind lan | 绑定 0.0.0.0,让 Fly 代理可访问 gateway |
--allow-unconfigured | 无配置时也能启动(之后再创建配置) |
internal_port = 3000 | 必须匹配 --port 3000(或 OPENCLAW_GATEWAY_PORT),用于健康检查 |
memory = "2048mb" | 512MB 太小;推荐 2GB |
OPENCLAW_STATE_DIR = "/data" | 将状态持久化到 volume |
3) 设置 secrets
- 非 loopback 绑定(
--bind lan)需要OPENCLAW_GATEWAY_TOKEN以保证安全。 - 这些 token 视为密码。
- 优先用环境变量,不要放在配置文件。避免
openclaw.json泄露或被记录。
4) 部署
5) 创建配置文件
SSH 进入机器创建配置:OPENCLAW_STATE_DIR=/data 后,配置路径为 /data/openclaw.json。
注意: Discord token 可来自:
- 环境变量:
DISCORD_BOT_TOKEN(推荐) - 配置文件:
channels.discord.token
DISCORD_BOT_TOKEN。
重启生效:
6) 访问 Gateway
Control UI
在浏览器打开:https://my-openclaw.fly.dev/
粘贴你的 gateway token(来自 OPENCLAW_GATEWAY_TOKEN)进行认证。
Logs
SSH Console
Troubleshooting
“App is not listening on expected address”
Gateway 绑定在127.0.0.1 而不是 0.0.0.0。
修复: 在 fly.toml 的 process 命令里添加 --bind lan。
Health checks failing / connection refused
Fly 无法访问配置端口上的 gateway。 修复: 确保internal_port 与 gateway 端口一致(设置 --port 3000 或 OPENCLAW_GATEWAY_PORT=3000)。
OOM / Memory Issues
容器频繁重启或被杀。迹象:SIGABRT、v8::internal::Runtime_AllocateInYoungGeneration 或无提示重启。
修复: 在 fly.toml 中提升内存:
Gateway Lock Issues
Gateway 报“already running”无法启动。 这通常是容器重启后,PID lock 文件仍在 volume 上。 修复: 删除 lock 文件:/data/gateway.*.lock(不在子目录)。
Config Not Being Read
若使用--allow-unconfigured,gateway 会创建最小配置。你的 /data/openclaw.json 应在重启后被读取。
确认配置存在:
Writing Config via SSH
fly ssh console -C 不支持 shell 重定向。写配置的方法:
fly sftp 若文件已存在可能失败。先删除:
State Not Persisting
若重启后凭据/会话丢失,说明 state dir 写在容器文件系统。 修复: 确认fly.toml 中设置 OPENCLAW_STATE_DIR=/data 并重新部署。
Updates
Updating Machine Command
如果需要在不重新部署的情况下修改启动命令:fly deploy 后启动命令可能会重置为 fly.toml 中的配置。若你手动改过,部署后需重新应用。
Private Deployment(加固)
默认情况下 Fly 会分配公网 IP,使你的 gateway 可通过https://your-app.fly.dev 访问。方便但会被互联网扫描器(Shodan、Censys 等)发现。
若想 不对公网暴露 的加固部署,使用私有模板。
何时使用私有部署
- 只做出站调用/消息(无入站 webhooks)
- webhooks 通过 ngrok 或 Tailscale 隧道回调
- 通过 SSH、代理或 WireGuard 访问 gateway,而非浏览器
- 你希望部署不被互联网扫描
设置
使用fly.private.toml 替代标准配置:
fly ips list 应只显示 private 类型 IP:
访问私有部署
没有公网 URL,可用以下方式之一: 选项 1:本地代理(最简单)私有部署的 Webhooks
若你需要 webhook 回调(Twilio、Telnyx 等)但不想公网暴露:- ngrok 隧道 - 在容器内或 sidecar 运行 ngrok
- Tailscale Funnel - 仅暴露特定路径
- 仅出站 - 某些 provider(Twilio)出站不依赖 webhooks
安全收益
| Aspect | Public | Private |
|---|---|---|
| Internet scanners | Discoverable | Hidden |
| Direct attacks | Possible | Blocked |
| Control UI access | Browser | Proxy/VPN |
| Webhook delivery | Direct | Via tunnel |
备注
- Fly.io 使用 x86 架构(非 ARM)
- Dockerfile 兼容两种架构
- WhatsApp/Telegram onboarding 使用
fly ssh console - 持久数据在
/datavolume - Signal 需要 Java + signal-cli;使用自定义镜像并保持内存 2GB+
成本
推荐配置(shared-cpu-2x, 2GB RAM):
- 约 $10–15/月(视用量而定)
- 免费层包含一定额度