CLI commands
フリート
openclaw fleet
openclaw fleet は、セルと呼ばれる完全な OpenClaw インスタンスを管理します。各セルには、独自の Gateway、状態、認証情報、チャネルアカウント、コンテナ、および local loopback 専用ホストポートがあります。テナントの信頼境界ごとに1つのセルを使用してください。敵対的なマルチテナント境界として1つの共有 Gateway を使用しないでください。
Fleet は実験的機能です。コマンド名、フラグ、出力形式、およびコンテナプロファイルは、非推奨期間なしでリリース間に変更される可能性があります。
Fleet は Docker と Podman をサポートします。デフォルトイメージは ghcr.io/openclaw/openclaw:latest です。
Fleet は Linux および macOS ホストでテストされています。Windows ホストは現在テストされていません。
クイックスタート
openclaw fleet create acmeopenclaw fleet status acmeopenclaw fleet listfleet create は、生成された Gateway トークンをセルの URL とともに一度だけ出力します。トークンをすぐに保存してから、各テナントのチャネルアカウントをそのテナントのセル内で設定してください。
テナント ID
テナント ID は次の正規表現に一致する必要があります。
^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$使用できるのは、1~40文字の小文字、数字、および内部のハイフンです。ID の先頭と末尾は文字または数字でなければなりません。大文字、アンダースコア、スラッシュ、ドット、空白、および ../acme などのトラバーサル文字列は拒否されます。
ID はコンテナ名の一部になります: openclaw-cell-<tenant>。
fleet create
セルを作成して起動します。
openclaw fleet create acme固定ポートに Podman セルを作成し、起動はしません。
openclaw fleet create acme \ --runtime podman \ --port 19125 \ --no-start--env を繰り返して、テナント固有の環境変数を渡します。
openclaw fleet create acme \ --env TZ=America/Los_Angeles \ --env OPENCLAW_DISABLE_BONJOUR=1環境変数キーには文字、数字、アンダースコアを使用でき、数字で始めることはできません。Fleet は保護されたランタイム環境ファイルを介して値を渡すため、値は単一行でなければなりません。Fleet は、ストレージとコンテナのレイアウトに記載された、管理対象のコンテナパス変数および Gateway トークン変数を上書きしようとする操作を拒否します。
作成オプション
| オプション | デフォルト | 説明 |
|---|---|---|
--image <ref> |
ghcr.io/openclaw/openclaw:latest |
セルのコンテナイメージ。 |
--runtime <runtime> |
docker |
コンテナ CLI: docker または podman。 |
--port <number> |
19100 から自動的に割り当て |
local loopback ホストポート。明示的に選択するポートは、別の登録済みセルに属していてはなりません。 |
--memory <value> |
2g |
Docker/Podman 構文によるコンテナのメモリ上限。 |
--cpus <value> |
2 |
コンテナの CPU 上限。 |
--disk <size> |
なし | ストレージバックエンドがクォータをサポートする場合に、コンテナの書き込み可能レイヤーを制限します。 |
--network <mode> |
bridge |
送信ネットワークモード: bridge または internal。 |
--pids-limit <number> |
512 |
コンテナ内の最大プロセス数。 |
--env <KEY=VALUE> |
なし | セルに環境変数を渡します。複数の値には繰り返し指定します。 |
--gateway-token <value> |
ランダムな32文字の16進数トークン | 生成する代わりに、指定した Gateway トークンを使用します。トークンの取り扱いを参照してください。 |
--no-start |
セルを起動 | 起動せずにコンテナを作成します。 |
--json |
人間が読みやすい出力 | 機械可読な出力を表示します。 |
自動割り当てでは、19100 以上でレジストリに未使用の最初のポートが選択されます。Fleet は、重複するテナント ID と、別のセルにすでに割り当てられている明示的なポートを拒否します。
イメージ参照は、コンテナランタイムの1つの引数として渡されます。イメージが Docker または Podman のオプションとして解釈されないように、空の参照と - で始まる値は拒否されます。
選択した Docker または Podman エンドポイントはローカルでなければなりません。Fleet は、ポートの予約やローカル状態の作成を行う前に、リモート Docker コンテキスト、DOCKER_HOST エンドポイント、およびリモート Podman サービスを拒否します。リモートのセルホストはサポートされていません。
Fleet が新しいセルを起動すると、create はその Gateway が /healthz に応答するまで最大約1分間待機します。セルが正常な状態にならない場合、Fleet は fleet status、fleet logs、または明示的な削除のために、そのコンテナとレジストリ行をそのまま残します。--no-start はこのヘルスゲートをスキップします。正常でない新しいセルの生成済み Gateway トークンは失われず、コンテナ環境(docker|podman inspect)に残ります。また、そのセルはまだトラフィックを処理していないため、fleet rm --force を実行してから新しく作成し直す方法も常に安全です。
ダイジェストによる固定
create と upgrade は、--image ghcr.io/openclaw/openclaw@sha256:<digest> などのダイジェストで固定されたイメージ参照を受け付けます。Fleet はイメージ参照をそのまま Docker または Podman に渡すため、運用者は変動するタグではなく、不変のイメージバイトにセルを固定できます。
作成結果には、テナント ID、コンテナ名、ホストポート、Gateway トークン、およびローカル URL が含まれます。JSON 出力の場合でもトークンが含まれるため、結果を機密情報として扱ってください。
ディスク上限
--disk が制限するのは、コンテナの書き込み可能レイヤーのみです。バインドマウントされたテナントごとの状態ディレクトリと認証ディレクトリは、引き続きホストストレージを使用します。これらのディレクトリにも厳格な上限が必要な場合は、ホストファイルシステムのプロジェクトクォータを使用してください。
| ランタイム/ストレージバックエンド | --disk のサポート |
|---|---|
| XFS 上の Docker overlay2 | XFS の pquota マウントオプションが必要です。 |
| Docker btrfs または zfs | ストレージドライバーでサポートされています。 |
| Podman overlay | XFS バッキングストレージが必要です。 |
| その他のバックエンド | デーモンエラーと Fleet のバックエンドに関する案内を伴ってコンテナ作成が失敗します。 |
送信ポリシー
| モード | Docker | Podman |
|---|---|---|
bridge |
サポートされています。デフォルトでは外部への送信は制限されません。 | サポートされています。デフォルトでは外部への送信は制限されません。 |
internal |
Docker は内部ネットワーク上で公開済みの local loopback Gateway ポートを維持しないため、拒否されます。 | サポートされています。外部への送信がブロックされている間も、local loopback Gateway は公開されたままです。 |
Docker では、ブリッジモードを維持し、DOCKER-USER チェーンなどのホストファイアウォールルールで送信ポリシーを適用してください。
fleet list
テナント ID 順にセルを一覧表示します。
openclaw fleet listopenclaw fleet lsopenclaw fleet list --json表には次の項目が含まれます。
| 列 | 意味 |
|---|---|
tenant |
テナント ID。 |
state |
Docker または Podman の検査から取得した稼働中のコンテナ状態。unknown は、ランタイムが利用できなかったか、セル名と同じ名前のコンテナが存在するものの、その Fleet 所有権ラベルがレジストリレコードと一致しないことを意味します(衝突または改ざんの兆候です。操作する前に手動で検査してください)。 |
port |
セルの Gateway にマッピングされた local loopback ホストポート。 |
image |
記録されたコンテナイメージ。 |
created |
セルの作成時刻。 |
Docker または Podman が利用できない場合でもレジストリ行は表示され続け、稼働状態のみが unknown になります。
fleet status
1つのセルを検査します。
openclaw fleet status acmeopenclaw fleet status acme --jsonstatus は、Fleet レジストリ行、稼働中のコンテナ検査、および次の URL への短時間のベストエフォートリクエストを組み合わせます。
http://127.0.0.1:<host-port>/healthzヘルス結果は ok、failed、または skipped です。/healthz が証明するのは Gateway の稼働性であり、設定済みのすべてのチャネルや Plugin が完全に準備できていることではありません。確認可能な使用可能なローカルエンドポイントがない場合、プローブはスキップされます。
fleet logs
セルのコンテナログをターミナルに直接ストリーミングします。
openclaw fleet logs acmeopenclaw fleet logs acme --followopenclaw fleet logs acme --tail 200openclaw fleet logs acme --since 10mFleet はログを読み取る前に、登録済みコンテナの所有権ラベルを検証するため、想定されるセル名を使用する外部コンテナからの読み取りを拒否します。ストリームは検査済みのコンテナ ID に固定されるため、同時に置き換えが発生しても新しい世代へリダイレクトされません。運用者による停止をコマンド失敗として扱わずに --follow を終了するには、Ctrl-C を押します。ログ出力は秘匿化フィルターを通過し、ターミナルに到達する前にセルの現在の Gateway トークンが <redacted> に置き換えられます。
コンテナログは生の stdout/stderr ストリームであるため、fleet logs には --json モードがありません。スクリプトでは、--tail で出力を制限し、通常のシェルリダイレクトまたはパイプラインを使用してください。
fleet start、fleet stop、fleet restart
記録されたランタイムを使用して既存のセルを制御します。
openclaw fleet start acmeopenclaw fleet stop acmeopenclaw fleet restart acmeこれらのコマンドは、登録済みのコンテナ名を対象に動作します。テナントが不明な場合、または記録されたランタイムが操作を実行できない場合は失敗します。
fleet upgrade
記録されたイメージを再度プルし、セルコンテナを置き換えます。
openclaw fleet upgrade acmeセルを別のイメージに移行します。
openclaw fleet upgrade acme --image ghcr.io/openclaw/openclaw:<version>アップグレードでは、対象イメージをプルし、既存のコンテナとセルごとのネットワークを検査してから、コンテナを停止して削除し、再作成して起動します。置き換え後も、同じホストポート、データディレクトリ、セルごとのブリッジネットワーク、ランタイムプロファイル、リソース制限、再起動ポリシー、Fleet が管理する環境、および --env で最初に指定された値が保持されます。マウントされた状態はコンテナの置き換え後も維持されますが、イメージのデフォルト環境は対象イメージによって変わる可能性があります。
置き換えが確定されるのは、公式の compose ファイルで使用されるヘルス契約と同様に、その Gateway がセルのループバックポートで /healthz に応答した後のみです。置き換え後のコンテナが終了する、クラッシュループに陥る、または約 1 分以内に正常状態にならない場合、そのコンテナは削除され、以前のコンテナが復元されます。そのため、壊れたイメージによって稼働中のセルが停止することはありません。
Gateway トークンは意図的に Fleet レジストリへ保存されません。古いコンテナを削除する前に、Fleet はその環境を読み取り、OPENCLAW_GATEWAY_TOKEN を置き換え後のコンテナへ引き継ぎます。トークンが管理下のほかの場所に存在しない場合は、アップグレード前に古いコンテナを手動で削除しないでください。
fleet backup と fleet restore
停止中のセルを 1 つバックアップします。
openclaw fleet stop acmeopenclaw fleet backup acme --out ./acme.tgzそのアーカイブを登録済みセルへ復元します。
openclaw fleet restore acme --from ./acme.tgzこれらはホストオペレーター権限を必要とするコマンドです。アーカイブにはテナントの状態と認証シークレットが含まれ、モード 0600 で作成されるため、認証情報と同様に保管する必要があります。SQLite の状態を一貫して取得するため、稼働中のセルはバックアップできません。復元では、--force が指定されていない限り稼働中のセルを拒否し、そのテナントの状態のみを置き換え、Gateway トークンをローテーションして、新しいトークンを一度だけ出力します。Fleet が一度にバックアップするのは 1 テナントのみです。全テナントのバックアップは、別途オペレーターが実行する操作です。
復元には既存の停止済みコンテナが必要です。検査されたそのランタイムプロファイルから、置き換え後の制限、ユーザーマッピング、環境の出所、イメージが提供されるためです。登録済みコンテナが Fleet 以外から削除されている場合は、まず --purge-data を付けずに fleet rm <tenant> --force を実行し、目的のイメージと --no-start を使用してセルを再作成してから、復元を再試行してください。最初の削除では、テナントの両方のデータディレクトリがそのまま保持されます。
どちらのコマンドも、アーカイブまたは展開されるファイルデータを制限するために --max-bytes <bytes> を受け付けます。また、メタデータのみのアーカイブ爆弾がホストの inode を枯渇させず、受け入れられたすべてのバックアップを復元可能に保つため、アーカイブパスセグメントに対して同じ固定の 100 万件の上限を適用します。バックアップは --out <path> を受け付け、どちらのコマンドも --json をサポートします。
アーカイブに含まれるのは通常ファイルとディレクトリのみです。バックアップでは、シンボリックリンク、ハードリンク、ソケット、デバイスノードをたどることも保存することもありません。スキップされた件数は結果に報告されます。復元では、それ以外のエントリ種別を含むアーカイブを拒否します。ワークスペースの node_modules など、再作成可能なシンボリックリンクツリーは、復元後にセル内で再インストールする必要があります。
fleet doctor
ランタイムやファイルシステムの状態を変更せずに、すべてのセルまたは 1 つのテナントを監査します。
openclaw fleet doctoropenclaw fleet doctor acme --jsonDoctor は、ランタイムのローカル性、所有権ラベル、正常性、ハードニング、リソース制限、ループバックポートのバインド、トークンの存在、ネットワークの所有権とエグレスモード、非公開状態ディレクトリの権限を確認します。警告には停止中のセルや所有権の差異が記載されます。いずれかの検査結果が失敗すると、プロセスの終了コードは 0 以外になります。
fleet rm
テナントデータを保持したまま、停止中のセルをランタイムとレジストリから削除します。
openclaw fleet rm acme稼働中のコンテナには --force が必要です。
openclaw fleet rm acme --forceセルデータも完全に削除します。
openclaw fleet rm acme --purge-data --forceFleet は専用ブリッジネットワークを削除する前に、セルコンテナを削除します。--purge-data には --force が必要です。再帰的に削除する前に、Fleet は Fleet が所有する両方のルートと、テナントごとの両方のディレクトリを解決します。各対象は、想定された正確なテナント末端ディレクトリであり、そのルートの厳密な内側にあり、シンボリックリンクではない必要があります。これらの包含チェックにより、破損したレジストリパスやテナントをまたぐシンボリックリンクによって削除先がほかの場所へ変更されるのを防ぎます。
想定された正確なテナントディレクトリがすでに存在しない場合でも、パージは再試行できます。これにより、まだ存在するディレクトリに対するパスチェックを緩和することなく、ファイルシステムの部分的な障害後に、後続の呼び出しでクリーンアップを完了できます。
ストレージとコンテナのレイアウト
セルの状態と認証プロファイルの暗号化キーは、アクティブな OpenClaw 状態ディレクトリ配下にある、テナントごとの個別のホストパスを使用します。
<state-dir>/fleet/cells/<tenant>/<state-dir>/fleet/auth-profile-secrets/<tenant>/最初のディレクトリは /home/node/.openclaw にマウントされます。2 番目のディレクトリは /home/node/.config/openclaw にマウントされ、公式 Docker セットアップの暗号化キーマウントと一致します。そのため、暗号化キーは通常の状態マウント配下に公開されず、セル状態ディレクトリのみをバックアップまたは共有する場合にも含まれません。どちらのディレクトリも通常の削除とアップグレード後に維持されます。fleet rm --purge-data --force は、個別の包含チェック後に両方を削除します。
初回起動前に、Fleet は gateway.mode=local、トークン認証、LAN コンテナバインド、および割り当てられたホストポート用の Control UI オリジンを使用してセル設定を初期化します。トークン値はその設定には書き込まれず、コンテナ環境に保持されます。
Fleet は、次の環境値を使用して公式イメージのコンテナパスを固定します。
| 変数 | コンテナの値 |
|---|---|
HOME |
/home/node |
OPENCLAW_HOME |
/home/node |
OPENCLAW_STATE_DIR |
/home/node/.openclaw |
OPENCLAW_CONFIG_PATH |
/home/node/.openclaw/openclaw.json |
OPENCLAW_WORKSPACE_DIR |
/home/node/.openclaw/workspace |
OPENCLAW_GATEWAY_TOKEN |
生成または指定されたセルのトークン |
公式イメージは、デフォルトで UID 1000 の非 root ユーザー node を使用します。Fleet は、非公開の 0700 バインドマウントを、全ユーザーからアクセス可能にすることなく書き込み可能に保ちます。rootful Docker は、呼び出し元の非 root UID と GID でセルを実行します。rootless Docker はコンテナ UID 0 を使用し、これはデーモンのユーザー名前空間内で、呼び出し元の権限を持たないホストユーザーにマッピングされます。Podman は呼び出し元の UID および GID とともに keep-id を使用します。Fleet 自体が root として rootful ランタイムに接続する場合、イメージのユーザーを維持し、初期マウントファイルを UID/GID 1000 に割り当てます。
SELinux ホストでは、Docker と Podman のマウントに非公開の :Z 再ラベル付けが適用されます。セルデータを復元または移動する場合は、実効コンテナユーザーがバインドマウントされたパスへ書き込める状態を維持してください。このプロファイルは rootless 環境に適していますが、Docker または Podman はホスト上ですでに rootless 操作用に設定されている必要があります。Fleet は rootful デーモンを rootless に変換しません。
セキュリティプロファイル
Fleet は、すべてのセルに次のプロファイルを適用します。
| 制御 | 適用されるプロファイル | 理由 |
|---|---|---|
| Linux ケイパビリティ | --cap-drop=ALL |
Gateway は Node.js プロセスであり、追加の Linux ケイパビリティを必要としません。 |
| 権限昇格 | --security-opt no-new-privileges |
setuid または setgid バイナリを介してプロセスが権限を取得するのを防ぎます。 |
| init プロセス | --init |
子孫プロセスを回収し、コンテナのライフサイクルシグナルを転送します。 |
| プロセス制限 | デフォルトで --pids-limit 512 |
fork とプロセスの枯渇を制限します。 |
| メモリ制限 | デフォルトで --memory 2g |
セルのメモリ使用量を制限します。 |
| CPU 制限 | デフォルトで --cpus 2 |
セルの CPU 使用量を制限します。 |
| 書き込み可能レイヤーのディスク | 任意の --disk |
ランタイムのストレージバックエンドがクォータをサポートする場合に、コンテナレイヤーを制限します。 |
| 再起動ポリシー | --restart unless-stopped |
意図的な停止を上書きすることなく、障害が発生したセルを再起動します。 |
| ホストへの公開 | 127.0.0.1:<host-port>:18789 のみ |
Gateway をホストのワイルドカードインターフェースから切り離します。 |
| セルネットワーク | セルごとに 1 つのブリッジまたは Podman 内部ネットワーク | コンテナ IP トラフィックを分離し、必要に応じて Podman の外向きエグレスをブロックします。 |
| コンテナ ID | ホストに一致するユーザーマッピング | 全ユーザーへのアクセスを許可せずに、非公開のバインドマウントを書き込み可能に保ちます。 |
| 永続状態 | セルごとのマウント。共有状態マウントなし | テナントの設定、認証情報、セッション、ワークスペースを、そのテナントのデータツリー内に保持します。 |
| コンテナコマンド | node dist/index.js gateway --bind lan --port 18789 |
コンテナネットワークで待ち受けることで、ループバック専用のホストポートマッピングから到達できるようにします。 |
Fleet は、/var/run/docker.sock をマウントしたり、--privileged やホストネットワークを使用したり、ケイパビリティを追加したりすることはありません。セルごとのブリッジはセル間の分離境界であり、外向きファイアウォールではありません。セルはプロバイダーとチャンネルに必要なネットワークエグレスを維持します。デプロイ環境に合ったプロキシ、SSH トンネル、または tailnet 設定をループバックポートの前段に配置してください。http://127.0.0.1:<port> へ直接到達できるのは Fleet ホストからのみです。
このプロファイルはテナントコンテナを分離しますが、Fleet オペレーター、コンテナランタイム管理者、または侵害されたホストからテナントを保護するものではありません。完全な信頼モデルと、より強力な分離オプションについては、マルチテナントホスティングを参照してください。
トークンの取り扱い
デフォルトでは、fleet create は暗号学的にランダムな 32 文字の 16 進数 Gateway トークンを生成し、作成結果に一度だけ出力します。承認済みのシークレットマネージャーに保存し、作成時の出力をログへ記録しないでください。
--gateway-token は、カスタムトークンをローカルプロセスの引数に配置します。この引数はシェル履歴に残る、またはプロセス一覧に表示される可能性があります。既存のシークレット管理ワークフローで指定値が必要な場合を除き、生成されたトークンを使用してください。
トークンと --env で渡されたすべての値は、コンテナ環境に保持されます。Fleet は、それらを短期間だけ存在するモード 0600 の環境ファイルへ書き込み、そのファイルのパスのみを Docker または Podman に渡し、ランタイムコマンドの完了後に削除します。openclaw fleet create --gateway-token ... または --env KEY=VALUE に明示的に入力された値は、外側の openclaw プロセス引数やシェル履歴には引き続き表示される可能性があります。
コンテナ環境の値は、信頼されたホストオペレーターから隠されるものではありません。Docker または Podman の管理者は、コンテナの検査によってそれらを読み取れます。Fleet の「shown once」という注記は通常の CLI 出力について説明するものであり、ホスト管理者によるアクセスへの耐性を示すものではありません。