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 через порт обратной петли ячейки в соответствии с контрактом проверки работоспособности, используемым официальным 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 создаёт резервную копию только одного арендатора за раз; резервное копирование всех арендаторов выполняется оператором отдельно.
Обе команды принимают --max-bytes <bytes> для ограничения объёма архивируемых или извлекаемых файловых данных и применяют одинаковый фиксированный лимит в один миллион сегментов путей архива, чтобы архивные бомбы, состоящие только из метаданных, не могли исчерпать индексные дескрипторы хоста, а любую принятую резервную копию можно было восстановить. Команда резервного копирования принимает --out <path>, а обе команды поддерживают --json.
Архивы содержат только обычные файлы и каталоги. При резервном копировании символьные и жёсткие ссылки, сокеты и узлы устройств никогда не просматриваются и не сохраняются; количество пропущенных объектов указывается в результате. При восстановлении архивы с записями любого другого типа отклоняются. Воспроизводимые деревья символьных ссылок, такие как node_modules рабочей области, после восстановления необходимо заново установить внутри ячейки.
fleet doctor
Проверьте все ячейки или одного арендатора без изменения состояния среды выполнения или файловой системы:
openclaw fleet doctoropenclaw fleet doctor acme --jsonDoctor проверяет локальность среды выполнения, метки владения, работоспособность, защитные настройки, ограничения ресурсов, привязку порта обратной петли, наличие токена, владение сетью и режим исходящего трафика, а также разрешения приватных каталогов состояния. Предупреждения описывают остановленные ячейки или различия во владении; любая неуспешная проверка приводит к ненулевому коду завершения процесса.
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, не предоставляя к ним доступ всем пользователям. Rootful Docker запускает ячейку с UID и GID непривилегированного пользователя, вызвавшего команду; rootless Docker использует UID 0 контейнера, который в пространстве имён пользователей демона сопоставляется с непривилегированным пользователем хоста, вызвавшим команду. Podman использует keep-id с UID и GID пользователя, вызвавшего команду. Если сам Fleet запущен от имени root с rootful-средой выполнения, он сохраняет пользователя образа и назначает начальным файлам точек монтирования UID/GID 1000.
На хостах с SELinux точки монтирования Docker и Podman получают приватную перемаркировку :Z. При восстановлении или перемещении данных ячейки сохраняйте возможность записи в пути привязанных точек монтирования для фактического пользователя контейнера. Профиль совместим с непривилегированным режимом, однако Docker или Podman уже должны быть настроены на хосте для работы без прав root; Fleet не преобразует rootful-демон в rootless-демон.
Профиль безопасности
Fleet применяет к каждой ячейке следующий профиль:
| Механизм защиты | Применяемый профиль | Назначение |
|---|---|---|
| Возможности Linux | --cap-drop=ALL |
Gateway является процессом Node.js и не нуждается в дополнительных возможностях Linux. |
| Повышение привилегий | --security-opt no-new-privileges |
Не позволяет процессам получать привилегии через двоичные файлы setuid или setgid. |
| Процесс инициализации | --init |
Собирает завершившиеся дочерние процессы и передаёт сигналы жизненного цикла контейнера. |
| Ограничение процессов | По умолчанию --pids-limit 512 |
Ограничивает создание дочерних процессов и исчерпание лимита процессов. |
| Ограничение памяти | По умолчанию --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 |
Прослушивает сеть контейнера, чтобы сопоставленный только с обратной петлёй порт хоста мог получить к нему доступ. |
Fleet никогда не монтирует /var/run/docker.sock, не использует --privileged или сеть хоста и не добавляет возможности. Отдельный мост для каждой ячейки является границей разделения ячеек, а не межсетевым экраном для исходящего трафика: ячейки сохраняют сетевой доступ, необходимый для провайдеров и каналов. Разместите перед портом обратной петли прокси-сервер, 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, а не к защите от администратора хоста.