Fly.ioデプロイ
目標: Fly.ioのmachine上で、永続ストレージ、自動HTTPS、Discord/channelアクセスを備えたOpenClaw Gatewayを実行すること。必要なもの
- インストール済みのflyctl CLI
- Fly.ioアカウント(free tierで可)
- モデル認証: 使用するモデルプロバイダーのAPIキー
- Channel認証情報: Discord botトークン、Telegramトークンなど
初心者向けクイックパス
- リポジトリをclone →
fly.tomlをカスタマイズ - app + volumeを作成 → secretsを設定
fly deployでデプロイ- SSHで入り設定を作成、またはControl UIを使用
fly.tomlを設定する
app名と要件に合わせて主要設定:
fly.tomlを編集します。セキュリティ注記: デフォルト設定ではpublic URLが公開されます。public IPなしの強化構成については、Private Deploymentを参照するか、fly.private.tomlを使用してください。| 設定 | 理由 |
|---|---|
--bind lan | Flyのproxyがgatewayに到達できるように0.0.0.0へbindする |
--allow-unconfigured | 設定ファイルなしで起動する(後で作成する) |
internal_port = 3000 | Flyのhealth check用に--port 3000(またはOPENCLAW_GATEWAY_PORT)と一致させる必要がある |
memory = "2048mb" | 512MBでは不足。2GB推奨 |
OPENCLAW_STATE_DIR = "/data" | volume上に状態を永続化する |
secretsを設定する
- 非loopback bind(
--bind lan)には有効なgateway認証パスが必要です。このFly.io例ではOPENCLAW_GATEWAY_TOKENを使用していますが、gateway.auth.passwordや、正しく設定された非loopbacktrusted-proxyデプロイでも要件を満たせます。 - これらのトークンはパスワードと同様に扱ってください。
- すべてのAPIキーとトークンは、設定ファイルより環境変数を推奨します。これにより、シークレットが
openclaw.jsonに入って誤って露出したりログに残ったりするのを防げます。
設定ファイルを作成する
properな設定を作成するため、machineにSSHで入ります:設定ディレクトリとファイルを作成します:注記:
OPENCLAW_STATE_DIR=/dataの場合、設定パスは/data/openclaw.jsonです。注記: Discordトークンは次のいずれかから取得できます:- 環境変数:
DISCORD_BOT_TOKEN(シークレットには推奨) - 設定ファイル:
channels.discord.token
DISCORD_BOT_TOKENを読み取ります。適用するため再起動します:トラブルシューティング
「App is not listening on expected address」
gatewayが0.0.0.0ではなく127.0.0.1にbindしています。
修正: fly.tomlのprocess commandに--bind lanを追加してください。
Health checks failing / connection refused
Flyが設定ポート上のgatewayに到達できていません。 修正:internal_portがgatewayポートと一致していることを確認してください(--port 3000またはOPENCLAW_GATEWAY_PORT=3000を設定)。
OOM / メモリ問題
コンテナが再起動し続ける、またはkillされます。兆候:SIGABRT、v8::internal::Runtime_AllocateInYoungGeneration、または無言の再起動。
修正: fly.tomlでメモリを増やしてください:
Gateway Lock問題
Gatewayが「already running」エラーで起動を拒否します。 これは、コンテナ再起動後もPID lockファイルがvolume上に残っているときに発生します。 修正: lockファイルを削除してください:/data/gateway.*.lockにあります(サブディレクトリ内ではありません)。
設定が読み込まれていない
--allow-unconfiguredは起動時ガードを回避するだけです。/data/openclaw.jsonを作成したり修復したりはしないため、実際の設定が存在し、通常のlocal gateway起動をしたい場合はgateway.mode="local"が含まれていることを確認してください。
設定が存在することを確認します:
SSH経由で設定を書き込む
fly ssh console -Cコマンドはシェルのリダイレクトをサポートしません。設定ファイルを書き込むには:
fly sftpは失敗することがあります。先に削除してください:
状態が永続化されない
再起動後に認証プロファイル、channel/provider状態、またはセッションが失われる場合、 state dirがコンテナファイルシステムに書き込まれています。 修正:fly.tomlでOPENCLAW_STATE_DIR=/dataが設定されていることを確認し、再デプロイしてください。
更新
Machineコマンドの更新
完全な再デプロイなしで起動コマンドを変更したい場合:fly deploy後、machine commandはfly.tomlの内容にリセットされる場合があります。手動変更を加えた場合は、デプロイ後に再適用してください。
Private Deployment(強化構成)
デフォルトでは、Flyはpublic IPを割り当てるため、gatewayはhttps://your-app.fly.devでアクセス可能になります。これは便利ですが、インターネットスキャナー(Shodan、Censysなど)から発見可能であることを意味します。
公開露出なしの強化構成にするには、privateテンプレートを使用してください。
private deploymentを使うべき場面
- アウトバウンドの呼び出し/メッセージのみを行う(受信Webhookなし)
- WebhookコールバックにはngrokまたはTailscaleトンネルを使用する
- gatewayへはブラウザーではなく、SSH、proxy、またはWireGuard経由でアクセスする
- デプロイをインターネットスキャナーから隠したい
セットアップ
標準設定の代わりにfly.private.tomlを使用します:
fly ips listにはprivate型のIPのみが表示されるはずです:
private deploymentへのアクセス
public URLがないため、次のいずれかの方法を使用します: オプション1: ローカルproxy(最も簡単)private deploymentでのWebhook
公開露出なしでWebhookコールバック(Twilio、Telnyxなど)が必要な場合:- ngrokトンネル - ngrokをコンテナ内またはsidecarとして実行する
- Tailscale Funnel - 特定パスをTailscale経由で公開する
- アウトバウンド専用 - 一部のプロバイダー(Twilio)はWebhookなしでもアウトバウンド通話が問題なく動作する
webhookSecurity.allowedHostsに設定してください。
セキュリティ上の利点
| 項目 | Public | Private |
|---|---|---|
| インターネットスキャナー | 発見可能 | 隠蔽 |
| 直接攻撃 | 可能 | ブロック |
| Control UIアクセス | ブラウザー | Proxy/VPN |
| Webhook配信 | 直接 | トンネル経由 |
注記
- Fly.ioはx86アーキテクチャを使用します(ARMではありません)
- Dockerfileは両方のアーキテクチャと互換性があります
- WhatsApp/Telegramオンボーディングには
fly ssh consoleを使用してください - 永続データは
/dataのvolume上に保存されます - SignalにはJava + signal-cliが必要です。カスタムイメージを使い、メモリは2GB以上を維持してください。
コスト
推奨構成(shared-cpu-2x、2GB RAM)では:
- 使用量に応じておよそ$10〜15/月
- free tierに一定の枠が含まれます
次のステップ
- メッセージングchannelsを設定する: Channels
- Gatewayを設定する: Gateway configuration
- OpenClawを最新に保つ: Updating