2026年 OpenClaw 同一VPSマルチインスタンス:データディレクトリ、Compose プロジェクト名、API キー注入の分離チェックリスト

COMPOSE_PROJECT_NAME · 独立したデータボリュームとポート表 · env_file とコンテナ内 env の突き合わせ

2026 OpenClaw Docker Compose マルチインスタンスの分離

同一台のVPS上で二つのOpenClawを並行稼働させるとき、もっとも多いトラブルはポートの衝突デフォルトのネットワーク名やボリューム名の衝突、そしてホストには API キーがあるのにコンテナの env が空であるという組み合わせです。本文ではシングルインスタンス基準とマルチインスタンスで変える最小差分の対照表で COMPOSE_PROJECT_NAMEデータディレクトリポート表を整理し、env_fileenvironment の注入経路を説明したうえで、六段階の確認手順とシングルへ戻す条件を示します。Docker Compose 本番基準の記事およびExit 137 と立ち上げ時のトラブルシュート記事とあわせて読むと流れがつながります。

01

同一ホストで OpenClaw を複数動かすときによくある「分離できたつもり」の事故パターン五つ

docker-compose.yml を複製してポートだけ変えても、それだけでは分離になっていません。デフォルトのプロジェクト名のままだとネットワークや匿名ボリュームが衝突します。ホストの export は自動ではコンテナに入りません。リバースプロキシの upstream は古いコンテナ IP を指したまま残ることがあります。次のような兆候が出たら、対照表の項目を順に確認し、コンテナを増やす前に原因を切り分けます。

  1. 01

    ポートだけ変えて COMPOSE_PROJECT_NAME を変えていない:デフォルトのブリッジネットワークと内部 DNS が、もう一つのスタックのコンテナ名を解決してしまうことがあります。

  2. 02

    データディレクトリのシンボリックリンクやマウントの重なり:二系統の ~/.openclaw やワークスペースが実際には同じディスク上の接頭辞を共有しており、アップグレードスクリプトが互いの状態を上書きします。

  3. 03

    API キーがシェルのプロファイルにしかない:docker compose up の子プロセスが、compose が期待する env_file のパスを読めていません。

  4. 04

    healthcheck の猶予が短すぎる:二番目のインスタンスはコールドスタートが長く、オーケストレータが異常と判断して再起動を繰り返し、一つ目のインスタンスとロックを奪い合います。

  5. 05

    リバプロが 127.0.0.1 の古いポートを向いたまま:二つの Gateway を切り替えても、エッジ側のトラフィックがすでに停止したインスタンスへ流れ続けます。揃え方はリバプロと TLS の記事を参照してください。

02

シングル基準とマルチの最小差分:対照表

次の列は、同一ホストに二スタックを置くときにいちばんよく触る「最小差分」です。短期の検証用に副系だけ立てる場合でも、自動化の前にプロジェクト名、データディレクトリ、ホスト側ポート、env_file のパスの四つは必ず分けます。リソース上限とログローテーションは本番基準の記事に従います。

項目シングル基準マルチで必ず分けるよくある落とし穴
COMPOSE_PROJECT_NAMEディレクトリ名のデフォルトスタックごとの短い一意名(例 oc_a / oc_bフォルダ名だけ変えてプロジェクト名が同じまま匿名ボリュームを共有する
データボリュームのパス単一のホストバインド/srv/openclaw-a/srv/openclaw-b を完全に分離子パスのシンボリックリンクが同じ親ディレクトリを指す
ホスト側ポート単一の 3000:3000空いているホストポートに写し、ポート表に記録する二番目のスタックの起動に失敗しても systemd が再起動を繰り返す
環境の注入単一の .envスタックごとに .env.oc-a を用意し compose で env_file を明示するホストの export が compose の解釈範囲に含まれていない
ヘルスチェック単一の start_periodコールドスタートが長い場合は start_periodretries を増やす二スタックが同時に再起動して CPU が尖る

プロジェクト名とデータディレクトリを先に決め、ポート表はそのあとです。順序が逆だと、はじめてアップグレードスクリプトを流したタイミングで二系統の状態が同じ接頭辞に書き込まれます。

03

六段階の確認:空のディレクトリから二番目の OpenClaw を起動できるまで

ここでは、公式またはチームの compose で単一ホストの起動まで済んでいる前提です。二番目のスタックについて、レンダリング後の設定実行時の envを監査できる状態にすることが目的です。

  1. 01

    プロジェクト名とディレクトリを書き込む:COMPOSE_PROJECT_NAME をエクスポートし、独立したデータディレクトリを作成し、入れ子のシンボリックリンクがないことを確認します。

  2. 02

    ポート表を固定する:Gateway、コントロール UI、追加チャネル用に空いているホストポートを割り当て、運用表に記録します。

  3. 03

    env_file を分ける:スタックごとに秘密ファイルのパスを持たせ、.env を共有しません。docker compose --project-directory で作業ディレクトリを明示します。

  4. 04

    レンダリングで確認する:docker compose -f ... config を実行し、二スタックの networksvolumesports に同名のマウントが残っていないか比較します。

  5. 05

    実行時に検証する:docker compose exec でコンテナに入り、対象の変数を表示し、ホスト側でマスクした grep の結果と一致するか確認します。

  6. 06

    ヘルスとログ:基準記事に沿って start_periodjson-file の上限を設定し、二スタックが同時にディスクを埋めないようにします。

bash
export COMPOSE_PROJECT_NAME=oc_b
docker compose --env-file ./.env.oc-b -f docker-compose.yml config > /tmp/oc-b.rendered.yml
docker compose --env-file ./.env.oc-b -f docker-compose.yml up -d
docker compose --env-file ./.env.oc-b exec -T openclaw-gateway sh -lc 'env | grep -E "ANTHROPIC|OPENAI" | sed "s/=.*/=***MASK***/"'

補足:config サブコマンドは合成結果だけを解釈し、コンテナは起動しません。レンダリング結果の差分を保存してから up すると、一つ目のスタックとの突き合わせがしやすくなります。

04

チケットにそのまま貼れる確認項目:「混線の疑い」を欄に落とす

次の項目はオンコールと事後レビューの出発点です。実際の compose 断片とホストの監視しきい値に置き換えて使い、対外向けの SLA であるかのように書かないでください。「たまに別インスタンスにつながる」事象では、少なくとも二スタックのレンダリング結果、docker inspect のネットワーク、リバプロの upstream のスナップショットを同時に保存します。

  • ポート占有の確認:二番目のスタックを up する前に ss -lntp または同等のコマンドを実行し、出力をチケットの添付に残します。
  • ディスク inode とログ:json-file の書き込みが二倍になると、inode と帯域が CPU より先に限界になります。巡回の間隔は基準記事の節を参照してください。
  • UID とボリューム権限:ホスト側のディレクトリ所有者とコンテナ内ユーザーがずれると、起動はできても状態が永続化されない「半成功」になります。権限の段落はExit 137 の記事を参照してください。
症状まず疑う項目推奨コマンドまたは証跡
コンテナ内に API キーがないenv_file のパス、compose の作業ディレクトリdocker compose config と exec での env の突き合わせ
ヘルスチェックが不安定で再起動するstart_period、CPU stealホストの dmesg、cgroup の統計、コンテナログの時系列
リクエストが別インスタンスに届くリバプロの upstream、古いコンテナの残骸リロード前後の docker ps -a と upstream 設定の diff

注意:一つ目のスタックを止めないまま同じパスで .env を上書きすると、二系統のキー交代の順序が崩れます。必ず新しいファイルをコピーしてから参照を切り替えてください。

05

構成の比較と現場での選び方

メモリの小さい VPS に本番相当の OpenClaw を二つ詰め込むと、しばしばディスクとログで先に負けます。独立したデータディレクトリとポート表がなければ、障害対応は「どの Gateway に届いているか当てる」作業に戻ります。compose を手でいじるだけでレンダリング差分を残さないと、アップグレード後に「誰がどの環境変数を変えたか」を説明できなくなります。

一方で、安定したホスト、帯域の見通し、分離できる作業ディレクトリが必要なチームでは、OpenClaw を契約可能なクラウド Mac や専用 VPS プランの上で動かしたほうが、このチェックリストを実行しやすいです。マルチの検証と本番を同じ運用の物語の中で分けたい場合は、ノード役割を分けられ、経路を監査できるVpsMesh の Mac mini クラウドレンタルのほうが向くことが多く、compose の差分セットとキュー方針も同じ粒度で受け入れ基準にできます。

FAQ

よくある質問

本文の対照表に沿って、匿名ボリューム、デフォルトのネットワーク名、ホスト側ポート、env_file が一つ目のスタックとまだ重なっていないか確認してください。ディレクトリ名だけ変えてプロジェクト名を変えていないパターンがもっとも多いです。healthcheck と restart の細部はCompose 本番基準の記事を参照してください。

compose が正しい env_file を読んでいない、作業ディレクトリがずれている、変数が build ブロックにしかない、といった場合が多いです。本文の六段階で docker compose config と exec の出力を揃えてください。立ち上げ時はExit 137 とトラブルシュートの記事の環境変数の節も参照してください。

まず docker compose down で副スタックを止め、ポートが解放されたことを確認します。続けて二系統のデータディレクトリをバックアップし、設定を書き出す前にボリュームを削除しないでください。プランの比較は価格ページ、手続きは注文ページ、接続方針はヘルプセンターを参照してください。