必要なもの
- インストール済みの flyctl CLI
- Fly.io アカウント (無料枠で機能します)
- モデル認証: 使用するモデルプロバイダーの API キー
- チャネル認証情報: Discord ボットトークン、Telegram トークンなど
初心者向けのクイックパス
- リポジトリのクローン →
fly.tomlのカスタマイズ - アプリ + ボリュームの作成 → シークレットの設定
fly deployでデプロイ- SSH で接続して設定を作成するか、Control UI を使用する
1) Fly アプリの作成
lhr (ロンドン)、iad (バージニア)、sjc (サンノゼ)。
2) fly.toml の設定
アプリ名と要件に合わせてfly.toml を編集します。
セキュリティに関する注意: デフォルトの設定では、パブリック URL が公開されます。パブリック IP のない強化されたデプロイメントについては、プライベートデプロイメント を参照するか、fly.private.toml を使用してください。
| 設定 | 理由 |
|---|---|
--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" | ボリューム上に状態を永続化します |
3) シークレットの設定
- 非ループバックバインド (
--bind lan) には、セキュリティのためにOPENCLAW_GATEWAY_TOKENが必要です。 - これらのトークンはパスワードのように扱ってください。
- すべての API キーとトークンには、設定ファイルよりも環境変数を優先してください。これにより、シークレットが誤って公開されたりログに記録されたりする可能性がある
openclaw.jsonからシークレットを遠ざけることができます。
4) デプロイ
5) 設定ファイルの作成
マシンに SSH で接続して、適切な設定を作成します:OPENCLAW_STATE_DIR=/data の場合、設定パスは /data/openclaw.json です。
注意: Discord トークンは次のいずれかから取得できます:
- 環境変数:
DISCORD_BOT_TOKEN(シークレットに推奨) - 設定ファイル:
channels.discord.token
DISCORD_BOT_TOKEN を読み取ります。
再起動して適用します:
6) ゲートウェイへのアクセス
Control UI
ブラウザで開きます:https://my-openclaw.fly.dev/ にアクセスします。
ゲートウェイトークン (OPENCLAW_GATEWAY_TOKEN の値) を貼り付けて認証します。
ログ
SSH コンソール
トラブルシューティング
”App is not listening on expected address”
ゲートウェイが0.0.0.0 ではなく 127.0.0.1 に bind しています。
修正: fly.toml のプロセスコマンドに --bind lan を追加します。
ヘルスチェック失敗 / connection refused
Fly が設定ポート上のゲートウェイへ到達できません。 修正:internal_port が Gateway のポートと一致していることを確認します (--port 3000 または OPENCLAW_GATEWAY_PORT=3000 を設定します)。
OOM / メモリ不足
コンテナが再起動を繰り返すか、強制終了されます。兆候:SIGABRT、v8::internal::Runtime_AllocateInYoungGeneration、またはサイレントな再起動。
修正: fly.toml でメモリを増やします:
ゲートウェイのロック問題
「すでに実行中です (already running)」というエラーで Gateway が起動を拒否します。 これは、コンテナは再起動したものの、PID ロックファイルがボリューム上に残っている場合に発生します。 修正: ロックファイルを削除します:/data/gateway.*.lock にあります (サブディレクトリではありません)。
設定が読み込まれない
--allow-unconfigured を使用している場合、Gateway は最小限の設定を作成します。/data/openclaw.json にあるカスタム設定は、再起動時に読み込まれるはずです。
設定が存在することを確認します:
SSH 経由での設定の書き込み
fly ssh console -C コマンドはシェルのリダイレクトをサポートしていません。設定ファイルを書き込むには:
fly sftp は失敗する可能性があります。最初に削除します:
状態が永続化されない
再起動後に認証情報やセッションが失われる場合、状態ディレクトリがコンテナのファイルシステムに書き込まれています。 修正:fly.toml で OPENCLAW_STATE_DIR=/data が設定されていることを確認し、再デプロイします。
アップデート
マシンコマンドの更新
完全な再デプロイを行わずに起動コマンドを変更する必要がある場合:fly deploy の後、マシンコマンドは fly.toml にあるものにリセットされる可能性があります。手動で変更を加えた場合は、デプロイ後に再適用してください。
プライベートデプロイメント (強化版)
デフォルトでは、Fly はパブリック IP を割り当てるため、https://your-app.fly.dev で Gateway にアクセスできるようになります。これは便利ですが、インターネットスキャナー (Shodan、Censys など) によってデプロイメントが発見される可能性があることを意味します。
パブリックに公開しない強化されたデプロイメントの場合は、プライベートテンプレートを使用してください。
プライベートデプロイメントを使用する場合
- アウトバウンドの呼び出し/メッセージのみを行う場合 (インバウンドの Webhook なし)
- Webhook コールバックに ngrok または Tailscale トンネルを使用する場合
- ブラウザの代わりに SSH、プロキシ、または WireGuard 経由でゲートウェイへアクセスする場合
- インターネットスキャナーからデプロイメントを隠したい場合
セットアップ
標準の設定の代わりにfly.private.toml を使用します:
fly ips list は private タイプの IP のみを表示するはずです:
プライベートデプロイメントへのアクセス
パブリック URL がないため、以下のいずれかの方法を使用します: オプション 1: ローカルプロキシ (最も簡単)プライベートデプロイメントでの webhook
パブリックに公開せずに Webhook コールバック (Twilio、Telnyx など) が必要な場合:- ngrok トンネル - コンテナ内またはサイドカーとして ngrok を実行します
- Tailscale Funnel - Tailscale 経由で特定のパスを公開します
- アウトバウンドのみ - 一部のプロバイダ (Twilio) は、Webhook なしでもアウトバウンド通話で問題なく機能します
webhookSecurity.allowedHosts をパブリックなトンネルのホスト名に設定してください。
セキュリティ上の利点
| 側面 | パブリック | プライベート |
|---|---|---|
| インターネットスキャナー | 発見可能 | 隠蔽 |
| 直接攻撃 | 可能 | ブロック |
| Control 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 ドル
- 無料枠には一定の余裕が含まれています