CLI commands
Парк устройств
openclaw fleet
openclaw fleet управляет полноценными экземплярами OpenClaw, называемыми ячейками. Каждая ячейка имеет собственные Gateway, состояние, учётные данные, аккаунты каналов, контейнер и порт хоста, доступный только через loopback-интерфейс. Используйте отдельную ячейку для каждой границы доверия арендатора; не используйте общий 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-адресом ячейки. Немедленно сохраните токен, а затем настройте аккаунты каналов каждого арендатора внутри его ячейки.
Идентификаторы арендаторов
Идентификаторы арендаторов должны соответствовать следующему выражению:
^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$Допускаются от 1 до 40 строчных букв, цифр и внутренних дефисов. Идентификатор должен начинаться и заканчиваться буквой или цифрой. Прописные буквы, символы подчёркивания, косые черты, точки, пробелы и строки обхода путей, такие как ../acme, отклоняются.
Идентификатор становится частью имени контейнера: 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 |
Порт хоста на loopback-интерфейсе. Явно выбранный порт не должен принадлежать другой зарегистрированной ячейке. |
--memory <value> |
2g |
Ограничение памяти контейнера в синтаксисе Docker/Podman. |
--cpus <value> |
2 |
Ограничение ресурсов ЦП контейнера. |
--disk <size> |
Нет | Ограничивает записываемый слой контейнера, если серверная часть хранилища поддерживает квоты. |
--network <mode> |
bridge |
Режим исходящей сети: bridge или internal. |
--pids-limit <number> |
512 |
Максимальное количество процессов в контейнере. |
--env <KEY=VALUE> |
Нет | Передаёт переменную среды ячейке. Повторите для нескольких значений. |
--gateway-token <value> |
Случайный 32-символьный шестнадцатеричный токен | Использует предоставленный токен Gateway вместо создания нового. См. Обработка токенов. |
--no-start |
Ячейка запускается | Создаёт контейнер без его запуска. |
--json |
Удобочитаемый вывод | Выводит данные в машиночитаемом формате. |
При автоматическом выделении выбирается первый неиспользуемый порт реестра, равный 19100 или превышающий его. Fleet отклоняет повторяющиеся идентификаторы арендаторов и явно заданные порты, уже назначенные другой ячейке.
Ссылки на образы передаются среде выполнения контейнеров как один аргумент. Пустые ссылки и значения, начинающиеся с -, отклоняются, чтобы образ нельзя было интерпретировать как параметр Docker или Podman.
Выбранная конечная точка Docker или Podman должна быть локальной. Fleet отклоняет удалённые контексты Docker, конечные точки DOCKER_HOST и удалённые службы Podman до резервирования порта или создания локального состояния. Удалённые хосты ячеек не поддерживаются.
Когда Fleet запускает новую ячейку, команда создания ожидает до приблизительно одной минуты, пока её Gateway не ответит на /healthz. Если ячейка не переходит в исправное состояние, Fleet сохраняет её контейнер и строку реестра для fleet status, fleet logs или явного удаления. --no-start пропускает эту проверку работоспособности. Сгенерированный токен Gateway новой неисправной ячейки не теряется: он остаётся в среде контейнера (docker|podman inspect). Поскольку ячейка ещё не обслуживала трафик, безопасной альтернативой всегда является fleet rm --force с последующим повторным созданием.
Закрепление по дайджесту
Команды создания и обновления принимают ссылки на образы, закреплённые по дайджесту, например --image ghcr.io/openclaw/openclaw@sha256:<digest>. Fleet без изменений передаёт ссылку на образ Docker или Podman, что позволяет оператору закрепить ячейку за неизменяемыми байтами образа вместо изменяемого тега.
Результат создания содержит идентификатор арендатора, имя контейнера, порт хоста, токен Gateway и локальный URL-адрес. Даже при выводе в формате JSON считайте результат содержащим секретные данные, поскольку в нём присутствует токен.
Ограничения диска
--disk ограничивает только записываемый слой контейнера. Подключённые с привязкой каталоги состояния и аутентификации каждого арендатора остаются в хранилище хоста; если для этих каталогов также требуется жёсткое ограничение, используйте проектные квоты файловой системы хоста.
| Среда выполнения/серверная часть хранилища | Поддержка --disk |
|---|---|
| Docker overlay2 на XFS | Требуется параметр монтирования XFS pquota. |
| Docker btrfs или zfs | Поддерживается драйвером хранилища. |
| Podman overlay | Требуется базовое хранилище XFS. |
| Другие серверные части | Создание контейнера завершается ошибкой демона и выводом рекомендаций Fleet для серверной части. |
Политика исходящего трафика
| Режим | Docker | Podman |
|---|---|---|
bridge |
Поддерживается; исходящий трафик по умолчанию не ограничен. | Поддерживается; исходящий трафик по умолчанию не ограничен. |
internal |
Отклоняется, поскольку Docker не сохраняет опубликованный loopback-порт Gateway во внутренней сети. | Поддерживается; loopback-порт Gateway остаётся опубликованным, а исходящий трафик блокируется. |
Для Docker сохраните режим моста и применяйте политику исходящего трафика с помощью правил межсетевого экрана хоста, например цепочки DOCKER-USER.
fleet list
Выведите список ячеек в порядке идентификаторов арендаторов:
openclaw fleet listopenclaw fleet lsopenclaw fleet list --jsonТаблица содержит:
| Столбец | Значение |
|---|---|
tenant |
Идентификатор арендатора. |
state |
Текущее состояние контейнера по данным проверки Docker или Podman. unknown означает, что среда выполнения недоступна либо существует контейнер с именем ячейки, но его метки принадлежности Fleet не соответствуют записи реестра (признак коллизии или вмешательства — проверьте его вручную перед выполнением действий). |
port |
Порт хоста на loopback-интерфейсе, сопоставленный с Gateway ячейки. |
image |
Зарегистрированный образ контейнера. |
created |
Время создания ячейки. |
Строки реестра остаются видимыми, когда Docker или Podman недоступны; только текущее состояние меняется на unknown.
fleet status
Проверьте одну ячейку:
openclaw fleet status acmeopenclaw fleet status acme --jsonСтатус объединяет строку реестра Fleet, текущие данные проверки контейнера и короткий запрос, выполняемый по мере возможности, к адресу:
http://127.0.0.1:<host-port>/healthzРезультат проверки работоспособности — ok, failed или skipped. /healthz подтверждает работоспособность Gateway, но не полную готовность каждого настроенного канала или плагина. Проверка пропускается, если нет пригодной локальной конечной точки.
fleet logs
Передавайте поток журналов контейнера ячейки непосредственно в терминал:
openclaw fleet logs acmeopenclaw fleet logs acme --followopenclaw fleet logs acme --tail 200openclaw fleet logs acme --since 10mПеред чтением журналов Fleet проверяет метки принадлежности зарегистрированного контейнера, поэтому отклоняет сторонний контейнер с ожидаемым именем ячейки. Поток привязывается к идентификатору проверенного контейнера, поэтому параллельная замена не может перенаправить его на более новое поколение. Нажмите Ctrl-C, чтобы завершить --follow, не считая остановку оператором ошибкой команды. Вывод журнала проходит через фильтр редактирования, который заменяет текущий токен Gateway ячейки на <redacted> до попадания данных в терминал.
У fleet logs нет режима --json, поскольку журналы контейнера представляют собой необработанный поток stdout/stderr. В скриптах ограничивайте объём вывода с помощью --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. Подключённое состояние сохраняется при замене контейнера; заданные образом переменные среды по умолчанию могут измениться вместе с целевым образом.
Замена фиксируется только после того, как её Gateway ответит на /healthz через loopback-порт ячейки согласно тому же контракту проверки работоспособности, который используется в официальном файле Compose. Если новый контейнер завершается, циклически аварийно перезапускается или не становится работоспособным примерно в течение минуты, он удаляется, а предыдущий контейнер восстанавливается, поэтому неисправный образ не выведет из строя работающую ячейку.
Токен Gateway намеренно не сохраняется в реестре Fleet. Перед удалением старого контейнера Fleet считывает его среду и переносит OPENCLAW_GATEWAY_TOKEN в новый контейнер. Не удаляйте старый контейнер вручную перед обновлением, если токен больше нигде не хранится под вашим контролем.
fleet backup и fleet restore
Создайте резервную копию одной остановленной ячейки:
openclaw fleet stop acmeopenclaw fleet backup acme --out ./acme.tgzВосстановите этот архив в зарегистрированную ячейку:
openclaw fleet restore acme --from ./acme.tgzЭти команды требуют привилегий оператора хоста. Архивы содержат состояние арендатора и секреты аутентификации, создаются с режимом 0600 и должны храниться как учётные данные. Резервное копирование не допускается для работающей ячейки, чтобы состояние SQLite было сохранено согласованно. Восстановление не допускается для работающей ячейки, если не указан --force; оно заменяет состояние только этого арендатора, обновляет токен Gateway и выводит новый токен один раз. Fleet создаёт резервную копию только одного арендатора за раз; резервное копирование всех арендаторов выполняется отдельным действием оператора.
Для восстановления требуется существующий остановленный контейнер, поскольку его проверенный профиль среды выполнения предоставляет ограничения, сопоставление пользователя, происхождение среды и образ для нового контейнера. Если зарегистрированный контейнер был удалён вне Fleet, сначала выполните fleet rm <tenant> --force без --purge-data, заново создайте ячейку с нужным образом и --no-start, а затем повторите восстановление. При первом удалении оба каталога данных арендатора сохраняются.
Обе команды принимают --max-bytes <bytes> для ограничения объёма архивируемых или извлекаемых файловых данных и применяют одинаковый фиксированный лимит в один миллион сегментов путей архива, чтобы архивные бомбы, состоящие только из метаданных, не могли исчерпать индексные дескрипторы хоста, а каждую принятую резервную копию можно было восстановить. Команда резервного копирования принимает --out <path>, а обе команды поддерживают --json.
Архивы содержат только обычные файлы и каталоги. При резервном копировании символические и жёсткие ссылки, сокеты и узлы устройств никогда не обходятся и не сохраняются; количество пропущенных объектов указывается в результате. При восстановлении архивы с объектами любого другого типа отклоняются. Воспроизводимые деревья символических ссылок, например node_modules рабочей области, после восстановления необходимо переустановить внутри ячейки.
fleet doctor
Проведите аудит всех ячеек или одного арендатора без изменения состояния среды выполнения или файловой системы:
openclaw fleet doctoropenclaw fleet doctor acme --jsonDoctor проверяет локальность среды выполнения, метки владения, работоспособность, усиление защиты, ограничения ресурсов, привязку loopback-порта, наличие токена, владение сетью и режим исходящего трафика, а также разрешения приватных каталогов состояния. Предупреждения описывают остановленные ячейки или различия во владении; любая неуспешная проверка приводит к ненулевому коду завершения процесса.
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. Второй подключается в /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 |
Созданный или предоставленный токен ячейки |
По умолчанию официальный образ использует непривилегированного пользователя node с UID 1000. Fleet сохраняет возможность записи в приватные подключаемые каталоги 0700, не делая их общедоступными. В Docker с правами root ячейка запускается с UID и GID вызвавшего её непривилегированного пользователя; Docker без прав root использует UID 0 контейнера, который в пространстве имён пользователей демона сопоставляется с вызвавшим процесс непривилегированным пользователем хоста. Podman использует keep-id с UID и GID вызывающего пользователя. Если сама Fleet запускается с правами root в среде выполнения с правами root, она сохраняет пользователя образа и назначает начальные файлы подключаемых каталогов UID/GID 1000.
На хостах с SELinux подключаемые каталоги Docker и Podman получают приватную перемаркировку :Z. При восстановлении или перемещении данных ячейки сохраняйте возможность записи в подключённые пути для фактического пользователя контейнера. Профиль рассчитан на работу без прав root, но Docker или Podman уже должны быть настроены на такую работу на хосте; Fleet не преобразует демон с правами root в демон без прав root.
Профиль безопасности
Fleet применяет следующий профиль к каждой ячейке:
| Мера защиты | Применяемый профиль | Назначение |
|---|---|---|
| Возможности Linux | --cap-drop=ALL |
Gateway является процессом Node.js и не требует дополнительных возможностей Linux. |
| Повышение привилегий | --security-opt no-new-privileges |
Не позволяет процессам получать привилегии через двоичные файлы setuid или setgid. |
| Процесс инициализации | --init |
Завершает дочерние процессы и перенаправляет сигналы жизненного цикла контейнера. |
| Ограничение процессов | По умолчанию --pids-limit 512 |
Ограничивает исчерпание ресурсов из-за создания процессов и вызовов fork. |
| Ограничение памяти | По умолчанию --memory 2g |
Ограничивает потребление памяти ячейкой. |
| Ограничение ЦП | По умолчанию --cpus 2 |
Ограничивает использование ЦП ячейкой. |
| Диск записываемого слоя | Необязательный --disk |
Ограничивает слой контейнера, если серверная часть хранилища среды выполнения поддерживает квоты. |
| Политика перезапуска | --restart unless-stopped |
Перезапускает аварийно завершившуюся ячейку, не отменяя намеренную остановку. |
| Публикация на хосте | Только 127.0.0.1:<host-port>:18789 |
Не допускает Gateway на подстановочных интерфейсах хоста. |
| Сеть ячейки | Одна мостовая или внутренняя сеть Podman на ячейку | Разделяет трафик по IP-адресам контейнеров и при необходимости блокирует исходящий трафик Podman. |
| Идентификатор контейнера | Сопоставление пользователя с хостом | Сохраняет возможность записи в приватные подключаемые каталоги без предоставления общего доступа. |
| Постоянное состояние | Подключаемые каталоги отдельных ячеек; без общего подключаемого каталога состояния | Сохраняет конфигурацию, учётные данные, сеансы и рабочие области арендатора в его собственном дереве данных. |
| Команда контейнера | node dist/index.js gateway --bind lan --port 18789 |
Прослушивает сеть контейнера, чтобы сопоставленный только с loopback-интерфейсом порт хоста мог подключиться к нему. |
Fleet никогда не подключает /var/run/docker.sock, не использует --privileged или сеть хоста и не добавляет возможности. Мостовая сеть отдельной ячейки служит границей разделения ячеек, а не межсетевым экраном для исходящего трафика: ячейки сохраняют сетевой доступ, необходимый для провайдеров и каналов. Разместите перед loopback-портом прокси, туннель SSH или конфигурацию tailnet, соответствующую вашей среде развёртывания. http://127.0.0.1:<port> доступен напрямую только с хоста Fleet.
Этот профиль разделяет контейнеры арендаторов, но не защищает арендаторов от оператора Fleet, администратора среды выполнения контейнеров или скомпрометированного хоста. Полная модель доверия и варианты более строгой изоляции описаны в разделе Мультитенантный хостинг.
Обработка токенов
По умолчанию fleet create создаёт криптографически случайный 32-символьный шестнадцатеричный токен Gateway и один раз выводит его в результате создания. Сохраните его в одобренном диспетчере секретов и не допускайте записи результата создания в журналы.
--gateway-token помещает пользовательский токен в аргументы локального процесса, которые могут сохраняться в истории оболочки или быть видны в списках процессов. Используйте созданный токен, если только существующий процесс управления секретами не требует предоставленного значения.
Токен и каждое значение, переданное с --env, находятся в среде контейнера. Fleet записывает их в кратковременный файл среды с режимом 0600, передаёт Docker или Podman только путь к этому файлу и удаляет его после завершения команды среды выполнения. Значения, явно введённые в openclaw fleet create --gateway-token ... или --env KEY=VALUE, всё равно могут быть видны в аргументах внешнего процесса openclaw и истории оболочки.
Значения переменных окружения контейнера не скрыты от доверенного оператора хоста: администраторы Docker или Podman могут прочитать их с помощью средств инспектирования контейнера. Примечание Fleet «показывается один раз» описывает обычный вывод CLI, а не защиту от администратора хоста.