目標: 永続ストレージ、自動 HTTPS、Discord/チャネルアクセスを備えた OpenClaw Gateway を Fly.io マシン上で実行する。Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
必要なもの
- flyctl CLI のインストール
- Fly.io アカウント(無料枠で可)
- モデル認証: 選択したモデルプロバイダーの API キー
- チャネル資格情報: Discord bot トークン、Telegram トークンなど
初心者向けの簡単な手順
- リポジトリをクローン →
fly.tomlをカスタマイズ - アプリ + ボリュームを作成 → シークレットを設定
fly deployでデプロイ- SSH で入って設定を作成するか、Control UI を使用
fly.toml を設定
fly.toml を編集して、アプリ名と要件に合わせます。セキュリティ注記: デフォルト設定では公開 URL が公開されます。公開 IP なしの強化されたデプロイについては、プライベートデプロイ を参照するか、deploy/fly.private.toml を使用してください。tini を entrypoint として使用します。Fly のプロセスコマンドは Docker の ENTRYPOINT を置き換えずに CMD を置き換えるため、プロセスは引き続き tini の下で実行されます。主要な設定:| 設定 | 理由 |
|---|---|
--bind lan | Fly のプロキシが Gateway に到達できるように 0.0.0.0 にバインドします |
--allow-unconfigured | 設定ファイルなしで起動します(後で作成します) |
internal_port = 3000 | Fly のヘルスチェック用に --port 3000(または OPENCLAW_GATEWAY_PORT)と一致させる必要があります |
memory = "2048mb" | 512MB は小さすぎます。2GB を推奨します |
OPENCLAW_STATE_DIR = "/data" | ボリューム上に状態を永続化します |
シークレットを設定
- 非 loopback バインド(
--bind lan)には有効な Gateway 認証パスが必要です。この Fly.io の例ではOPENCLAW_GATEWAY_TOKENを使用していますが、gateway.auth.passwordまたは正しく設定された非 loopback のtrusted-proxyデプロイでも要件を満たします。 - これらのトークンはパスワードのように扱ってください。
- すべての API キーとトークンには、設定ファイルよりも環境変数を優先してください。これにより、誤って公開またはログ出力される可能性がある
openclaw.jsonにシークレットを入れずに済みます。
設定ファイルを作成
マシンに SSH で入り、適切な設定を作成します。設定ディレクトリとファイルを作成します。注記:
OPENCLAW_STATE_DIR=/data の場合、設定パスは /data/openclaw.json です。注記: https://my-openclaw.fly.dev を実際の Fly アプリの
origin に置き換えてください。Gateway の起動時には、ランタイムの
--bind と --port の値からローカル Control UI の origin がシードされるため、
設定が存在する前でも初回起動を進められますが、
Fly 経由でブラウザアクセスするには、正確な HTTPS origin が
gateway.controlUi.allowedOrigins に含まれている必要があります。注記: 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 にバインドしています。
修正: fly.toml のプロセスコマンドに --bind lan を追加します。
ヘルスチェックの失敗 / 接続拒否
Fly が設定済みポートで Gateway に到達できません。 修正:internal_port が Gateway ポートと一致していることを確認してください(--port 3000 または OPENCLAW_GATEWAY_PORT=3000 を設定)。
OOM / メモリ問題
コンテナが再起動し続ける、または強制終了されます。兆候:SIGABRT、v8::internal::Runtime_AllocateInYoungGeneration、または無言の再起動。
修正: fly.toml でメモリを増やします。
Gateway ロックの問題
Gateway が「already running」エラーで起動を拒否します。 これはコンテナが再起動しても PID ロックファイルがボリューム上に残る場合に発生します。 修正: ロックファイルを削除します。/data/gateway.*.lock にあります(サブディレクトリ内ではありません)。
設定が読み込まれない
--allow-unconfigured は起動ガードを迂回するだけです。/data/openclaw.json を作成または修復するわけではないため、通常のローカル Gateway 起動を行いたい場合は、実際の設定が存在し、gateway.mode="local" が含まれていることを確認してください。
設定が存在することを確認します。
SSH 経由で設定を書き込む
fly ssh console -C コマンドはシェルリダイレクトをサポートしていません。設定ファイルを書き込むには、次のようにします。
fly sftp が失敗することがあります。先に削除してください。
状態が永続化されない
再起動後に認証プロファイル、チャネル/プロバイダー状態、またはセッションが失われる場合、 状態ディレクトリがコンテナファイルシステムに書き込まれています。 修正:OPENCLAW_STATE_DIR=/data が fly.toml に設定されていることを確認し、再デプロイします。
更新
マシンコマンドの更新
完全な再デプロイなしで起動コマンドを変更する必要がある場合:fly deploy の後、マシンコマンドは fly.toml の内容にリセットされることがあります。手動変更を行った場合は、デプロイ後に再適用してください。
プライベートデプロイ(強化)
デフォルトでは、Fly は公開 IP を割り当てるため、Gateway はhttps://your-app.fly.dev でアクセス可能になります。これは便利ですが、デプロイがインターネットスキャナー(Shodan、Censys など)から発見可能になることを意味します。
公開露出なしの強化されたデプロイには、プライベートテンプレートを使用してください。
プライベートデプロイを使用する場合
- 送信の呼び出し/メッセージのみを行う(受信 Webhook なし)
- Webhook コールバックに ngrok または Tailscale トンネルを使用する
- ブラウザではなく SSH、プロキシ、または WireGuard 経由で Gateway にアクセスする
- デプロイを インターネットスキャナーから隠したい
セットアップ
標準設定の代わりにdeploy/fly.private.toml を使用します。
fly ips list には private タイプの IP のみが表示されるはずです。
プライベートデプロイへのアクセス
公開 URL がないため、次のいずれかの方法を使用します。 オプション 1: ローカルプロキシ(最も簡単)プライベートデプロイでの Webhook
公開せずに Webhook コールバック (Twilio、Telnyx など) が必要な場合:- ngrok トンネル - コンテナ内またはサイドカーとして ngrok を実行
- Tailscale Funnel - Tailscale 経由で特定のパスを公開
- 送信専用 - 一部のプロバイダー (Twilio) は Webhook なしでも発信通話で問題なく動作します
webhookSecurity.allowedHosts を公開トンネルのホスト名に設定します。
セキュリティ上の利点
| 観点 | パブリック | プライベート |
|---|---|---|
| インターネットスキャナー | 検出可能 | 非公開 |
| 直接攻撃 | 可能 | ブロック |
| コントロール UI アクセス | ブラウザ | プロキシ/VPN |
| Webhook 配信 | 直接 | トンネル経由 |
メモ
- Fly.io は x86 アーキテクチャ を使用します (ARM ではありません)
- Dockerfile は両方のアーキテクチャに対応しています
- WhatsApp/Telegram のオンボーディングには、
fly ssh consoleを使用します - 永続データは
/dataのボリューム上にあります - Signal には Java + signal-cli が必要です。カスタムイメージを使用し、メモリは 2GB 以上に保ってください。
コスト
推奨設定 (shared-cpu-2x、2GB RAM) の場合:
- 使用量に応じて月額約 $10-15
- 無料枠には一定の利用枠が含まれます
次のステップ
- メッセージングチャネルを設定する: チャネル
- Gateway を設定する: Gateway 設定
- OpenClaw を最新の状態に保つ: 更新