所需項目
- 已安裝 flyctl 命令列介面
- Fly.io 帳號(免費方案即可)
- 模型驗證:所選模型供應商的 API 金鑰
- 頻道認證資訊:Discord 機器人權杖、Telegram 權杖等
初學者快速流程
- 複製儲存庫、自訂
fly.toml - 建立應用程式與磁碟區,設定祕密
- 使用
fly deploy部署 - 透過 SSH 連入以建立設定,或使用控制介面
1
建立 Fly 應用程式
lhr(倫敦)、iad(維吉尼亞)、sjc(聖荷西)。2
設定 fly.toml
編輯 OpenClaw Docker 映像檔的進入點是
fly.toml,使其符合你的應用程式名稱與需求。儲存庫追蹤的 fly.toml 是下方所示的公開範本;deploy/fly.private.toml 則是經強化且無公開 IP 的版本(請參閱私人部署)。tini,預設執行 node openclaw.mjs gateway。Fly 的 [processes] 會取代 Docker 的 CMD(此處直接執行 node dist/index.js gateway ...,也就是同一個已編譯的進入點),而不會變更 ENTRYPOINT,因此程序仍會在 tini 下執行。主要設定:3
設定祕密
--bind lan)需要有效的閘道驗證路徑。此範例使用 OPENCLAW_GATEWAY_TOKEN,但 gateway.auth.password 或設定正確的非回送受信任 Proxy 部署也能符合要求。SecretRef 合約請參閱祕密管理。將這些權杖視同密碼。API 金鑰與權杖應優先使用環境變數/fly secrets,而非設定檔,以免祕密寫入 openclaw.json。4
部署
gateway ready。Fly 自身的健康檢查會依照 fly.toml 監看 internal_port = 3000;映像檔的 Docker HEALTHCHECK 指令另外會輪詢預設連接埠 18789 上的 /healthz,但此部署將閘道覆寫為 --port 3000,因此不會使用該檢查。5
建立設定檔
透過 SSH 連入機器,以建立適當的設定:使用
OPENCLAW_STATE_DIR=/data 時,設定路徑為 /data/openclaw.json。將 https://my-openclaw.fly.dev 替換成你實際的 Fly 應用程式來源。閘道啟動時會從執行階段的 --bind 與 --port 值植入本機控制介面來源,讓首次啟動可在設定尚不存在時繼續進行;但若要透過 Fly 從瀏覽器存取,仍須在 gateway.controlUi.allowedOrigins 中列出完全相符的 HTTPS 來源。Discord 權杖可來自下列任一來源:- 環境變數
DISCORD_BOT_TOKEN(建議用於祕密);不必將其加入設定,閘道會自動讀取 - 設定檔
channels.discord.token
疑難排解
“應用程式未在預期的位址上監聽”
閘道繫結至127.0.0.1,而非 0.0.0.0。
**修正:**在 fly.toml 的程序命令中加入 --bind lan。
健康檢查失敗/連線遭拒
Fly 無法透過設定的連接埠連線至閘道。 **修正:**確保internal_port 與閘道連接埠(--port 3000 或 OPENCLAW_GATEWAY_PORT=3000)相符。
OOM/記憶體問題
容器持續重新啟動或遭到終止。跡象包括:SIGABRT、v8::internal::Runtime_AllocateInYoungGeneration,或無提示地重新啟動。
**修正:**增加 fly.toml 中的記憶體:
閘道鎖定問題
容器重新啟動後,閘道因「已在執行」錯誤而拒絕啟動。 執行階段鎖定檔位於<tmpdir>/openclaw-<uid>/gateway.<hash>.lock
及 gateway.state.<hash>.lock(Linux:
/tmp/openclaw-<uid>/gateway.*.lock),而非持久性的 /data 磁碟區,因此
完整重新啟動容器時,通常會連同容器檔案系統的其餘內容一起清除。
如果鎖定檔仍然存在(例如會保留容器檔案系統的 fly machine restart)
並阻止啟動,請手動移除:
未讀取設定
--allow-unconfigured 只會略過啟動防護機制。它不會建立或修復 /data/openclaw.json,因此請確保實際設定存在,並包含 "gateway": { "mode": "local" },以正常啟動本機閘道。
確認設定存在:
透過 SSH 寫入設定
fly ssh console -C 不支援 Shell 重新導向。若要寫入設定檔:
fly sftp 可能會失敗;請先刪除:
狀態未持久保存
如果重新啟動後遺失驗證設定檔、頻道/供應商狀態或工作階段,表示狀態目錄正寫入容器檔案系統,而非磁碟區。 **修正:**確保已在fly.toml 中設定 OPENCLAW_STATE_DIR=/data,然後重新部署。
更新
git pull + fly deploy 是此處受監督的流程:它會從 Dockerfile 重新建置映像檔,因此命令列介面/閘道版本、基礎作業系統映像檔及所有 Dockerfile 變更都會一併更新。在執行中容器內執行 openclaw update 並非相同操作,因為映像檔是以 Docker 建置的 dist/ 目錄樹形式提供,其中沒有 .git 簽出,也沒有供其偵測的 npm 管理全域安裝;在虛擬機器式安裝中使用此流程時,請參閱更新。
更新機器命令
若要在不完整重新部署的情況下變更啟動命令:fly deploy 會將機器命令重設為 fly.toml 中的內容;重新部署後,請再次套用手動變更。
私人部署(強化)
Fly 預設會配置公開 IP,因此你的閘道可透過https://your-app.fly.dev 存取,也能被網際網路掃描器(Shodan、Censys 等)發現。
使用 deploy/fly.private.toml 可進行無公開 IP 的強化部署:它省略了 [http_service],因此不會配置公開輸入流量。
適合使用私人部署的情況
- 僅有對外呼叫/訊息(沒有傳入的網路鉤子)
- 由 ngrok 或 Tailscale 通道處理所有網路鉤子回呼
- 透過 SSH、Proxy 或 WireGuard 存取閘道,而非使用瀏覽器
- 部署應對網際網路掃描器隱藏
設定
fly ips list 應只會顯示一個 private 類型的 IP:
存取私人部署
選項 1:本機 Proxy(最簡單)私人部署的網路鉤子
若要接收網路鉤子回呼(Twilio、Telnyx 等)而不公開對外:- ngrok 通道:在容器內執行 ngrok,或將其作為 Sidecar 執行
- Tailscale Funnel:透過 Tailscale 公開特定路徑
- 僅限輸出:部分供應商(Twilio)可在沒有網路鉤子的情況下進行撥出通話
plugins.entries.voice-call.config:
webhookSecurity.allowedHosts 設為通道主機名稱,以接受轉送的 Host 標頭。
安全性權衡
注意事項
- Fly.io 使用 x86 架構;Dockerfile 同時相容於 x86 和 ARM。
- 若要進行 WhatsApp/Telegram 初始設定,請使用
fly ssh console。 - 持久性資料位於
/data的磁碟區中。 - Signal 需要在映像檔中安裝 signal-cli(以 Java 為基礎的命令列介面);請使用自訂映像檔,並將記憶體維持在 2GB 以上。
費用
使用建議設定(shared-cpu-2x、2GB RAM)時,視使用情況而定,預估費用約為每月 $10-15;免費方案涵蓋部分基本額度。目前費率請參閱 Fly.io 定價。