Fly.ioデプロイメント

目標: Fly.ioマシン上で永続ストレージ、自動HTTPS、Discord/チャネルアクセスを備えたOpenClaw Gatewayを実行します。

必要なもの

  • インストールされたflyctl CLI
  • Fly.ioアカウント(無料プランで可)
  • モデル認証:Anthropic APIキー(または他のプロバイダーキー)
  • チャネル認証情報:Discordボットトークン、Telegramトークンなど

初心者向けクイックパス

  1. リポジトリをクローン → fly.tomlをカスタマイズ
  2. アプリ + ボリュームを作成 → シークレットを設定
  3. fly deployでデプロイ
  4. SSHで接続して設定を作成またはControl UIを使用

1) Flyアプリを作成

# リポジトリをクローン
git clone https://github.com/openclaw/openclaw.git
cd openclaw

# 新しいFlyアプリを作成(独自の名前を選択)
fly apps create my-openclaw

# 永続ボリュームを作成(通常は1GBで十分)
fly volumes create openclaw_data --size 1 --region iad

ヒント: あなたに近いリージョンを選択してください。一般的なオプション:lhr(ロンドン)、iad(バージニア)、sjc(サンノゼ)。

2) fly.tomlを設定

fly.tomlを編集して、アプリ名と要件に合わせます。

セキュリティ注意: デフォルト設定では公開URLを公開します。パブリックIPなしの強化されたデプロイメントについては、プライベートデプロイメントを参照するか、fly.private.tomlを使用してください。

app = "my-openclaw"  # アプリ名
primary_region = "iad"

[build]
  dockerfile = "Dockerfile"

[env]
  NODE_ENV = "production"
  OPENCLAW_PREFER_PNPM = "1"
  OPENCLAW_STATE_DIR = "/data"
  NODE_OPTIONS = "--max-old-space-size=1536"

[processes]
  app = "node dist/index.js gateway --allow-unconfigured --port 3000 --bind lan"

[http_service]
  internal_port = 3000
  force_https = true
  auto_stop_machines = false
  auto_start_machines = true
  min_machines_running = 1
  processes = ["app"]

[[vm]]
  size = "shared-cpu-2x"
  memory = "2048mb"

[mounts]
  source = "openclaw_data"
  destination = "/data"

主要な設定:

設定理由
--bind lan0.0.0.0にバインドしてFlyのプロキシがGatewayに到達できるようにする
--allow-unconfigured設定ファイルなしで起動(後で作成)
internal_port = 3000Flyヘルスチェックのために--port 3000(またはOPENCLAW_GATEWAY_PORT)と一致する必要がある
memory = "2048mb"512MBは小さすぎる;2GBを推奨
OPENCLAW_STATE_DIR = "/data"ボリューム上の状態を永続化

3) シークレットを設定

# 必須:Gatewayトークン(非ループバックバインディング用)
fly secrets set OPENCLAW_GATEWAY_TOKEN=$(openssl rand -hex 32)

# モデルプロバイダーAPIキー
fly secrets set ANTHROPIC_API_KEY=sk-ant-...

# オプション:他のプロバイダー
fly secrets set OPENAI_API_KEY=sk-...
fly secrets set GOOGLE_API_KEY=...

# チャネルトークン
fly secrets set DISCORD_BOT_TOKEN=MTQ...

注意:

  • 非ループバックバインド(--bind lan)にはセキュリティのためOPENCLAW_GATEWAY_TOKENが必要です。
  • これらのトークンをパスワードのように扱ってください。
  • すべてのAPIキーとトークンには設定ファイルよりも環境変数を推奨します。これにより、シークレットが誤って公開されたりログに記録されたりする可能性があるopenclaw.jsonから除外されます。

4) デプロイ

fly deploy

最初のデプロイではDockerイメージをビルドします(約2〜3分)。その後のデプロイはより高速です。

デプロイ後、確認:

fly status
fly logs

以下が表示されるはずです:

[gateway] listening on ws://0.0.0.0:3000 (PID xxx)
[discord] logged in to discord as xxx

5) 設定ファイルを作成

マシンにSSHで接続して適切な設定を作成:

fly ssh console

設定ディレクトリとファイルを作成:

mkdir -p /data
cat > /data/openclaw.json << 'EOF'
{
  "agents": {
    "defaults": {
      "model": {
        "primary": "anthropic/claude-opus-4-5",
        "fallbacks": ["anthropic/claude-sonnet-4-5", "openai/gpt-4o"]
      },
      "maxConcurrent": 4
    },
    "list": [
      {
        "id": "main",
        "default": true
      }
    ]
  },
  "auth": {
    "profiles": {
      "anthropic:default": { "mode": "token", "provider": "anthropic" },
      "openai:default": { "mode": "token", "provider": "openai" }
    }
  },
  "bindings": [
    {
      "agentId": "main",
      "match": { "channel": "discord" }
    }
  ],
  "channels": {
    "discord": {
      "enabled": true,
      "groupPolicy": "allowlist",
      "guilds": {
        "YOUR_GUILD_ID": {
          "channels": { "general": { "allow": true } },
          "requireMention": false
        }
      }
    }
  },
  "gateway": {
    "mode": "local",
    "bind": "auto"
  },
  "meta": {
    "lastTouchedVersion": "2026.1.29"
  }
}
EOF

注意: OPENCLAW_STATE_DIR=/dataを使用すると、設定パスは/data/openclaw.jsonになります。

注意: Discordトークンは以下のいずれかから取得できます:

  • 環境変数:DISCORD_BOT_TOKEN(シークレットに推奨)
  • 設定ファイル:channels.discord.token

環境変数を使用する場合、設定にトークンを追加する必要はありません。Gatewayは自動的にDISCORD_BOT_TOKENを読み取ります。

適用するために再起動:

exit
fly machine restart <machine-id>

6) Gatewayにアクセス

Control UI

ブラウザで開く:

fly open

またはhttps://my-openclaw.fly.dev/にアクセス

Gatewayトークン(OPENCLAW_GATEWAY_TOKENからのもの)を貼り付けて認証します。

ログ

fly logs              # ライブログ
fly logs --no-tail    # 最近のログ

SSHコンソール

fly ssh console

トラブルシューティング

「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 / メモリの問題

コンテナが再起動し続けるか、killされます。兆候:SIGABRTv8::internal::Runtime_AllocateInYoungGeneration、またはサイレント再起動。

修正: fly.tomlでメモリを増やす:

[[vm]]
  memory = "2048mb"

または既存のマシンを更新:

fly machine update <machine-id> --vm-memory 2048 -y

注意: 512MBは小さすぎます。1GBは動作する可能性がありますが、負荷や詳細ログでOOMになる可能性があります。2GBを推奨します。

Gatewayロックの問題

Gatewayが「already running」エラーで起動を拒否します。

これは、コンテナが再起動したがボリューム上のPIDロックファイルが永続化されている場合に発生します。

修正: ロックファイルを削除:

fly ssh console --command "rm -f /data/gateway.*.lock"
fly machine restart <machine-id>

ロックファイルは/data/gateway.*.lockにあります(サブディレクトリ内ではありません)。

設定が読み込まれない

--allow-unconfiguredを使用すると、Gatewayは最小限の設定を作成します。/data/openclaw.jsonのカスタム設定は再起動時に読み取られるはずです。

設定が存在することを確認:

fly ssh console --command "cat /data/openclaw.json"

SSH経由の設定の書き込み

fly ssh console -Cコマンドはシェルリダイレクトをサポートしていません。設定ファイルを書き込むには:

# echo + teeを使用(ローカルからリモートへパイプ)
echo '{"your":"config"}' | fly ssh console -C "tee /data/openclaw.json"

# またはsftpを使用
fly sftp shell
> put /local/path/config.json /data/openclaw.json

注意: ファイルが既に存在する場合、fly sftpは失敗する可能性があります。最初に削除:

fly ssh console --command "rm /data/openclaw.json"

状態が永続化されない

再起動後に認証情報またはセッションが失われる場合、状態ディレクトリがコンテナファイルシステムに書き込まれています。

修正: fly.tomlOPENCLAW_STATE_DIR=/dataが設定されていることを確認し、再デプロイしてください。

更新

# 最新の変更を取得
git pull

# 再デプロイ
fly deploy

# ヘルスチェック
fly status
fly logs

マシンコマンドの更新

完全な再デプロイなしで起動コマンドを変更する必要がある場合:

# マシンIDを取得
fly machines list

# コマンドを更新
fly machine update <machine-id> --command "node dist/index.js gateway --port 3000 --bind lan" -y

# またはメモリ増加と共に
fly machine update <machine-id> --vm-memory 2048 --command "node dist/index.js gateway --port 3000 --bind lan" -y

注意: fly deploy後、マシンコマンドはfly.tomlの内容にリセットされる可能性があります。手動で変更を加えた場合は、デプロイ後に再適用してください。

プライベートデプロイメント(強化)

デフォルトでは、Flyはパブリック IPを割り当て、Gatewayをhttps://your-app.fly.devでアクセス可能にします。これは便利ですが、インターネットスキャナー(Shodan、Censysなど)によってデプロイメントが発見可能であることを意味します。

パブリック露出なしの強化されたデプロイメントには、プライベートテンプレートを使用してください。

プライベートデプロイメントを使用する場合

  • アウトバウンド呼び出し/メッセージのみを行う(インバウンドwebhookなし)
  • webhookコールバックにngrokまたはTailscaleトンネルを使用
  • ブラウザの代わりにSSH、プロキシ、またはWireGuard経由でGatewayにアクセス
  • デプロイメントをインターネットスキャナーから隠したい

セットアップ

標準設定の代わりにfly.private.tomlを使用:

# プライベート設定でデプロイ
fly deploy -c fly.private.toml

または既存のデプロイメントを変換:

# 現在のIPをリスト
fly ips list -a my-openclaw

# パブリックIPをリリース
fly ips release <public-ipv4> -a my-openclaw
fly ips release <public-ipv6> -a my-openclaw

# プライベート設定に切り替えて、将来のデプロイメントで
# パブリックIPが再割り当てされないようにする
# ([http_service]を削除するか、プライベートテンプレートでデプロイ)
fly deploy -c fly.private.toml

# プライベートのみのIPv6を割り当て
fly ips allocate-v6 --private -a my-openclaw

この後、fly ips listprivateタイプのIPのみを表示するはずです:

VERSION  IP                   TYPE             REGION
v6       fdaa:x:x:x:x::x      private          global

プライベートデプロイメントへのアクセス

パブリックURLがないため、以下のいずれかの方法を使用してください:

オプション1:ローカルプロキシ(最もシンプル)

# ローカルポート3000をアプリに転送
fly proxy 3000:3000 -a my-openclaw

# その後ブラウザで http://localhost:3000 を開く

オプション2:WireGuard VPN

# WireGuard設定を作成(一度のみ)
fly wireguard create

# WireGuardクライアントにインポート、その後内部IPv6経由でアクセス
# 例:http://[fdaa:x:x:x:x::x]:3000

オプション3:SSHのみ

fly ssh console -a my-openclaw

プライベートデプロイメントでのWebhook

パブリック露出なしでwebhookコールバック(Twilio、Telnyxなど)が必要な場合:

  1. ngrokトンネル - コンテナ内またはサイドカーとしてngrokを実行
  2. Tailscale Funnel - Tailscale経由で特定のパスを公開
  3. アウトバウンドのみ - 一部のプロバイダー(Twilio)はwebhookなしでアウトバウンド呼び出しで正常に動作

ngrokを使用した音声通話設定の例:

{
  "plugins": {
    "entries": {
      "voice-call": {
        "enabled": true,
        "config": {
          "provider": "twilio",
          "tunnel": { "provider": "ngrok" }
        }
      }
    }
  }
}

ngrokトンネルはコンテナ内で実行され、Flyアプリ自体を公開せずにパブリックwebhook URLを提供します。

セキュリティ上の利点

側面パブリックプライベート
インターネットスキャナー発見可能隠蔽
直接攻撃可能ブロック
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
  • 無料プランには一部の許容量が含まれます

詳細についてはFly.io価格を参照してください。