Fly.io 部署
目標: 在 Fly.io 的機器上執行 OpenClaw Gateway 閘道器,具備持久化儲存、自動 HTTPS,以及 Discord/頻道存取。What you need
- 已安裝 flyctl CLI
- Fly.io 帳戶(免費方案即可)
- 模型身分驗證:Anthropic API 金鑰(或其他提供者金鑰)
- 頻道憑證:Discord bot token、Telegram token 等。
新手快速路徑
- 複製 repo → 自訂
fly.toml - 建立 app 與 volume → 設定 secrets
- 使用
fly deploy部署 - SSH 進入建立設定,或使用 Control UI
1) 建立 Fly app
lhr (London), iad (Virginia), sjc (San Jose).
2. 設定 fly.toml
編輯fly.toml 以符合你的 app 名稱與需求。
Security note: The default config exposes a public URL. 安全性注意事項: 預設設定會暴露公開 URL。若要進行沒有公開 IP 的強化部署,請參考 Private Deployment 或使用 fly.private.toml。
| 設定 | 原因 |
|---|---|
--bind lan | 綁定至 0.0.0.0,讓 Fly 的 proxy 能夠連線到 Gateway 閘道器 |
--allow-unconfigured | 在沒有設定檔的情況下啟動(之後你會建立) |
internal_port = 3000 | 必須與 --port 3000(或 OPENCLAW_GATEWAY_PORT)相符,供 Fly 健康檢查使用 |
memory = "2048mb" | 512MB 太小;建議 2GB |
OPENCLAW_STATE_DIR = "/data" | 在 volume 上持久化狀態 |
3. 設定 secrets
- 非 loopback 綁定(
--bind lan)為了安全性需要OPENCLAW_GATEWAY_TOKEN。 - Treat these tokens like passwords.
- Prefer env vars over config file for all API keys and tokens. This keeps secrets out of
openclaw.jsonwhere they could be accidentally exposed or logged.
4. 部署
5. 建立設定檔
透過 SSH 進入機器以建立正式的設定檔:OPENCLAW_STATE_DIR=/data 時,設定路徑為 /data/openclaw.json。
注意: Discord 權杖可來自以下其中一種:
- 環境變數:
DISCORD_BOT_TOKEN(建議用於 secrets) - 設定檔:
channels.discord.token
DISCORD_BOT_TOKEN。
重新啟動以套用:
6. 存取 Gateway 閘道器
控制介面
在瀏覽器中開啟:https://my-openclaw.fly.dev/
貼上你的 Gateway 權杖(來自 OPENCLAW_GATEWAY_TOKEN)以進行身分驗證。
Logs
SSH 主控台
疑難排解
「App is not listening on expected address」
Gateway 閘道器綁定到127.0.0.1,而非 0.0.0.0。
修正: 在 fly.toml 的程序命令中加入 --bind lan。
健康檢查失敗/連線被拒
Fly 無法透過設定的連接埠連到 Gateway 閘道器。 修正: 確保internal_port 與 Gateway 連接埠相符(設定 --port 3000 或 OPENCLAW_GATEWAY_PORT=3000)。
OOM/記憶體問題
Container keeps restarting or getting killed. 容器持續重新啟動或被終止。徵兆:SIGABRT、v8::internal::Runtime_AllocateInYoungGeneration,或無聲重新啟動。
修正: 在 fly.toml 中提高記憶體:
Gateway 鎖定問題
Gateway 閘道器因「already running」錯誤而拒絕啟動。 當容器重新啟動但 PID 鎖定檔仍留在 volume 上時會發生。 修正: 刪除鎖定檔:/data/gateway.*.lock(不在子目錄中)。
設定未被讀取
如果使用--allow-unconfigured,閘道會建立最小設定。 如果使用 --allow-unconfigured,閘道會建立最小設定。 若使用 --allow-unconfigured,Gateway 閘道器會建立最小設定。你在 /data/openclaw.json 的自訂設定應在重新啟動後被讀取。
請確認設定存在:
透過 SSH 寫入設定
fly ssh console -C 指令不支援 shell 重新導向。要寫入設定檔: 28. 要寫入設定檔:
fly sftp 可能失敗。請先刪除: 29. 請先刪除:
狀態未持久化
- 若在重新啟動後遺失憑證或工作階段,表示狀態目錄正在寫入容器的檔案系統。
fly.toml 中設定 OPENCLAW_STATE_DIR=/data,然後重新部署。
更新
更新機器啟動命令
若需要在不完整重新部署的情況下變更啟動命令:fly deploy 之後,機器命令可能會重設為 fly.toml 中的內容。若你做過手動變更,請在部署後重新套用。 32. 若你進行過手動變更,請在部署後重新套用。
私有部署(強化)
預設情況下,Fly 會配置公開 IP,使你的 Gateway 閘道器可透過https://your-app.fly.dev 存取。這很方便,但代表你的部署可被網際網路掃描器(Shodan、Censys 等)發現。 34. 這很方便,但代表你的部署可被網路掃描器(Shodan、Censys 等)發現。
- 若要進行 無任何公開暴露 的強化部署,請使用私有範本。
何時使用私有部署
- 你只進行 對外(outbound) 呼叫/訊息(沒有 inbound webhook)
- 任何 webhook 回呼都使用 ngrok 或 Tailscale 通道
- 你透過 SSH、proxy 或 WireGuard 存取 Gateway 閘道器,而非瀏覽器
- 你希望部署 隱藏於網際網路掃描器
設定
使用fly.private.toml 取代標準設定:
fly ips list 應只顯示 private 類型的 IP:
存取私有部署
由於沒有公開 URL,請使用以下其中一種方式: 選項 1:本機 proxy(最簡單)36. 私有部署的 Webhooks
若需要 webhook 回呼(Twilio、Telnyx 等)且不想對外公開: 37. 在沒有公開暴露的情況下:- ngrok 通道-在容器內或以 sidecar 執行 ngrok
- Tailscale Funnel-透過 Tailscale 暴露特定路徑
- 僅 outbound-部分提供者(Twilio)在沒有 webhook 的情況下也可正常運作
webhookSecurity.allowedHosts 設為公開通道的主機名稱,以便接受轉送的 Host 標頭。 38. 將 webhookSecurity.allowedHosts 設為公開通道的主機名稱,以便接受轉送的 host header。
安全性效益
| 面向 | 公開 | 私有 |
|---|---|---|
| 網際網路掃描器 | 可被發現 | 隱藏 |
| 直接攻擊 | 可能 | 被阻擋 |
| Control UI 存取 | 瀏覽器 | Proxy/VPN |
| Webhook 傳遞 | 直接 | 透過通道 |
注意事項
- Fly.io 使用 x86 架構(非 ARM)
- Dockerfile 相容於兩種架構
- WhatsApp/Telegram 入門引導請使用
fly ssh console - 持久化資料位於 volume 的
/data - Signal 需要 Java + signal-cli;請使用自訂映像並將記憶體維持在 2GB 以上。
成本
採用建議設定(shared-cpu-2x,2GB RAM):
- 每月約 ~$10–15,視使用量而定
- 免費方案包含部分額度