Skip to main content

Docker (необязательно)

Docker — необязателен. Используйте его только если вам нужен контейнеризованный Gateway (шлюз) или вы хотите проверить поток работы с Docker.

Подходит ли мне Docker?

  • Да: вам нужна изолированная, одноразовая среда Gateway (шлюз) или вы хотите запускать OpenClaw на хосте без локальных установок.
  • Нет: вы работаете на своей машине и просто хотите самый быстрый цикл разработки. В этом случае используйте обычный процесс установки.
  • Примечание по sandboxing: sandboxing агентов тоже использует Docker, но не требует запуска всего Gateway (шлюз) в Docker. См. Sandboxing.
Это руководство охватывает:
  • Контейнеризованный Gateway (шлюз) (полный OpenClaw в Docker)
  • Sandbox агента на сеанс (Gateway (шлюз) на хосте + инструменты агента, изолированные Docker)
Подробности по sandboxing: Sandboxing

Требования

  • Docker Desktop (или Docker Engine) + Docker Compose v2
  • Достаточно дискового пространства для образов и логов

Контейнеризованный Gateway (шлюз) (Docker Compose)

Быстрый старт (рекомендуется)

Из корня репозитория:
Этот скрипт:
  • собирает образ Gateway (шлюз)
  • запускает мастер онбординга
  • выводит подсказки по настройке провайдера
  • запускает Gateway (шлюз) через Docker Compose
  • генерирует токен Gateway (шлюз) и записывает его в .env
Необязательные env vars:
  • OPENCLAW_DOCKER_APT_PACKAGES — установить дополнительные пакеты apt во время сборки
  • OPENCLAW_EXTRA_MOUNTS — добавить дополнительные bind-монты хоста
  • OPENCLAW_HOME_VOLUME — сохранять /home/node в именованном томе
После завершения:
  • Откройте http://127.0.0.1:18789/ в браузере.
  • Вставьте токен в Control UI (Settings → token).
  • Нужно снова получить URL? Запустите docker compose run --rm openclaw-cli dashboard --no-open.
Конфиг/рабочее пространство записываются на хост:
  • ~/.openclaw/
  • ~/.openclaw/workspace
Запуск на VPS? См. Hetzner (Docker VPS).

Вспомогательные команды shell (необязательно)

Для более удобного повседневного управления Docker установите ClawDock:
Добавьте в конфигурацию вашей оболочки (zsh):
Затем используйте clawdock-start, clawdock-stop, clawdock-dashboard и т.д. Выполните clawdock-help, чтобы увидеть все команды. Подробности см. в ClawDock Helper README.

Ручной процесс (compose)

Примечание: запускайте docker compose ... из корня репозитория. Если вы включили OPENCLAW_EXTRA_MOUNTS или OPENCLAW_HOME_VOLUME, скрипт настройки записывает docker-compose.extra.yml; подключите его при запуске Compose в другом месте:

Токен Control UI + сопряжение (Docker)

Если вы видите «unauthorized» или «disconnected (1008): pairing required», получите свежую ссылку на панель и одобрите устройство браузера:
Подробнее: Dashboard, Devices.

Дополнительные монтирования (необязательно)

Если вы хотите смонтировать дополнительные каталоги хоста в контейнеры, установите OPENCLAW_EXTRA_MOUNTS перед запуском docker-setup.sh. Принимается список Docker bind-монтов, разделённых запятыми, который применяется к openclaw-gateway и openclaw-cli путём генерации docker-compose.extra.yml. Пример:
Примечания:
  • Пути должны быть расшарены с Docker Desktop на macOS/Windows.
  • Если вы редактируете OPENCLAW_EXTRA_MOUNTS, повторно запустите docker-setup.sh, чтобы пересоздать дополнительный compose-файл.
  • docker-compose.extra.yml генерируется автоматически. Не редактируйте его вручную.

Сохранение всего home контейнера (необязательно)

Если вы хотите, чтобы /home/node сохранялся при пересоздании контейнера, задайте именованный том через OPENCLAW_HOME_VOLUME. Это создаёт Docker-том и монтирует его в /home/node, сохраняя стандартные bind-монты для конфига/рабочего пространства. Используйте здесь именованный том (а не bind-путь); для bind-монтов используйте OPENCLAW_EXTRA_MOUNTS. Пример:
Это можно комбинировать с дополнительными монтированиями:
Примечания:
  • Если вы измените OPENCLAW_HOME_VOLUME, повторно запустите docker-setup.sh, чтобы пересоздать дополнительный compose-файл.
  • Именованный том сохраняется до удаления командой docker volume rm <name>.

Установка дополнительных пакетов apt (необязательно)

Если вам нужны системные пакеты внутри образа (например, инструменты сборки или медиабиблиотеки), установите OPENCLAW_DOCKER_APT_PACKAGES перед запуском docker-setup.sh. Пакеты устанавливаются во время сборки образа, поэтому сохраняются даже при удалении контейнера. Пример:
Примечания:
  • Принимается список имён пакетов apt, разделённых пробелами.
  • Если вы измените OPENCLAW_DOCKER_APT_PACKAGES, повторно запустите docker-setup.sh, чтобы пересобрать образ.

Для опытных пользователей / полнофункциональный контейнер (opt-in)

Образ Docker по умолчанию ориентирован на безопасность и запускается от непривилегированного пользователя node. Это уменьшает поверхность атаки, но означает:
  • отсутствие установки системных пакетов во время выполнения
  • отсутствие Homebrew по умолчанию
  • отсутствие встроенных браузеров Chromium/Playwright
Если вам нужен более полнофункциональный контейнер, используйте следующие opt-in настройки:
  1. Сохранять /home/node, чтобы загрузки браузеров и кэши инструментов сохранялись:
  1. Запекать системные зависимости в образ (воспроизводимо и постоянно):
  1. Устанавливать браузеры Playwright без npx (избегает конфликтов переопределений npm):
Если Playwright требуется установка системных зависимостей, пересоберите образ с OPENCLAW_DOCKER_APT_PACKAGES вместо использования --with-deps во время выполнения.
  1. Сохранять загрузки браузеров Playwright:
  • Установите PLAYWRIGHT_BROWSERS_PATH=/home/node/.cache/ms-playwright в docker-compose.yml.
  • Убедитесь, что /home/node сохраняется через OPENCLAW_HOME_VOLUME, или смонтируйте /home/node/.cache/ms-playwright через OPENCLAW_EXTRA_MOUNTS.

Права доступа + EACCES

Образ запускается от пользователя node (uid 1000). Если вы видите ошибки прав доступа на /home/node/.openclaw, убедитесь, что ваши bind-монты на хосте принадлежат uid 1000. Пример (хост Linux):
Если вы решите запускаться от root для удобства, вы принимаете компромисс по безопасности.

Более быстрые пересборки (рекомендуется)

Чтобы ускорить пересборки, упорядочьте Dockerfile так, чтобы слои зависимостей кешировались. Это позволяет не перезапускать pnpm install, пока не изменятся lock-файлы:

Настройка каналов (необязательно)

Используйте контейнер CLI для настройки каналов, затем при необходимости перезапустите Gateway (шлюз). WhatsApp (QR):
Telegram (токен бота):
Discord (токен бота):
Документация: WhatsApp, Telegram, Discord

OpenAI Codex OAuth (headless Docker)

Если в мастере вы выберете OpenAI Codex OAuth, он откроет URL в браузере и попытается принять callback на http://127.0.0.1:1455/auth/callback. В Docker или headless-настройках этот callback может показать ошибку браузера. Скопируйте полный URL редиректа, на который вы попадаете, и вставьте его обратно в мастер, чтобы завершить аутентификацию.

Проверка здоровья

E2E smoke-тест (Docker)

Smoke-тест импорта QR (Docker)

Примечания

  • Привязка Gateway (шлюз) по умолчанию — lan для использования в контейнере.
  • CMD в Dockerfile использует --allow-unconfigured; смонтированный конфиг с gateway.mode, а не local, всё равно запустится. Переопределите CMD, чтобы принудительно включить проверку.
  • Контейнер Gateway (шлюз) является источником истины для сеансов (~/.openclaw/agents/<agentId>/sessions/).

Sandbox агента (Gateway (шлюз) на хосте + инструменты Docker)

Подробный разбор: Sandboxing

Что он делает

Когда включён agents.defaults.sandbox, неосновные сеансы выполняют инструменты внутри Docker-контейнера. Gateway (шлюз) остаётся на вашем хосте, но выполнение инструментов изолировано:
  • область: "agent" по умолчанию (один контейнер + рабочее пространство на агента)
  • область: "session" для изоляции по сеансам
  • рабочая папка на область, смонтированная в /workspace
  • необязательный доступ агента к рабочему пространству (agents.defaults.sandbox.workspaceAccess)
  • политика разрешения/запрета инструментов (запрет имеет приоритет)
  • входящие медиа копируются в активное рабочее пространство sandbox (media/inbound/*), чтобы инструменты могли их читать (с workspaceAccess: "rw" это попадает в рабочее пространство агента)
Предупреждение: scope: "shared" отключает межсеансовую изоляцию. Все сеансы делят один контейнер и одно рабочее пространство.

Профили sandbox на агента (multi-agent)

Если вы используете маршрутизацию multi-agent, каждый агент может переопределять настройки sandbox и инструментов: agents.list[].sandbox и agents.list[].tools (плюс agents.list[].tools.sandbox.tools). Это позволяет запускать смешанные уровни доступа в одном Gateway (шлюзе):
  • Полный доступ (личный агент)
  • Инструменты только для чтения + рабочее пространство только для чтения (семейный/рабочий агент)
  • Без инструментов файловой системы/оболочки (публичный агент)
Multi-Agent Sandbox & Tools для примеров, приоритетов и устранения неполадок.

Поведение по умолчанию

  • Образ: openclaw-sandbox:bookworm-slim
  • Один контейнер на агента
  • Доступ агента к рабочему пространству: workspaceAccess: "none" (по умолчанию) использует ~/.openclaw/sandboxes
    • "ro" оставляет рабочее пространство sandbox в /workspace и монтирует рабочее пространство агента только для чтения в /agent (отключает write/edit/apply_patch)
    • "rw" монтирует рабочее пространство агента для чтения/записи в /workspace
  • Автоочистка: простой > 24 ч ИЛИ возраст > 7 дн.
  • Сеть: none по умолчанию (явно включайте, если нужен egress)
  • Разрешено по умолчанию: exec, process, read, write, edit, sessions_list, sessions_history, sessions_send, sessions_spawn, session_status
  • Запрещено по умолчанию: browser, canvas, nodes, cron, discord, gateway

Включение sandboxing

Если вы планируете устанавливать пакеты в setupCommand, учтите:
  • Значение docker.network по умолчанию — "none" (без egress).
  • readOnlyRoot: true блокирует установку пакетов.
  • user должен быть root для apt-get (уберите user или установите user: "0:0"). OpenClaw автоматически пересоздаёт контейнеры при изменении setupCommand (или конфигурации Docker), если контейнер не использовался недавно (в течение ~5 минут). «Горячие» контейнеры пишут предупреждение с точной командой openclaw sandbox recreate ....
Параметры усиления защиты находятся в agents.defaults.sandbox.docker: network, user, pidsLimit, memory, memorySwap, cpus, ulimits, seccompProfile, apparmorProfile, dns, extraHosts. Multi-agent: переопределяйте agents.defaults.sandbox.{docker,browser,prune}.* для каждого агента через agents.list[].sandbox.{docker,browser,prune}.* (игнорируется, когда agents.defaults.sandbox.scope / agents.list[].sandbox.scope равно "shared").

Сборка образа sandbox по умолчанию

Это собирает openclaw-sandbox:bookworm-slim с использованием Dockerfile.sandbox.

Общий образ sandbox (необязательно)

Если вам нужен образ sandbox с распространёнными инструментами сборки (Node, Go, Rust и т. д.), соберите общий образ:
Это собирает openclaw-sandbox-common:bookworm-slim. Чтобы использовать его:

Образ браузера sandbox

Чтобы запускать инструмент браузера внутри sandbox, соберите образ браузера:
Это собирает openclaw-sandbox-browser:bookworm-slim с использованием Dockerfile.sandbox-browser. Контейнер запускает Chromium с включённым CDP и необязательным наблюдателем noVNC (headful через Xvfb). Примечания:
  • Headful (Xvfb) снижает блокировку ботами по сравнению с headless.
  • Headless всё ещё можно использовать, установив agents.defaults.sandbox.browser.headless=true.
  • Полноценная среда рабочего стола (GNOME) не требуется; Xvfb обеспечивает дисплей.
Используйте конфиг:
Пользовательский образ браузера:
При включении агент получает:
  • URL управления браузером sandbox (для инструмента browser)
  • URL noVNC (если включён и headless=false)
Помните: если вы используете список разрешённых инструментов, добавьте browser (и удалите его из deny), иначе инструмент останется заблокированным. Правила очистки (agents.defaults.sandbox.prune) применяются и к браузерным контейнерам.

Пользовательский образ sandbox

Соберите собственный образ и укажите его в конфигурации:

Политика инструментов (allow/deny)

  • deny имеет приоритет над allow.
  • Если allow пуст: доступны все инструменты (кроме запрещённых).
  • Если allow непуст: доступны только инструменты из allow (за вычетом deny).

Стратегия очистки

Два параметра:
  • prune.idleHours: удалять контейнеры, не использовавшиеся X часов (0 = отключить)
  • prune.maxAgeDays: удалять контейнеры старше X дней (0 = отключить)
Пример:
  • Сохранять активные сеансы, но ограничивать срок жизни: idleHours: 24, maxAgeDays: 7
  • Никогда не очищать: idleHours: 0, maxAgeDays: 0

Примечания по безопасности

  • Жёсткая изоляция применяется только к инструментам (exec/read/write/edit/apply_patch).
  • Инструменты, работающие только на хосте, такие как browser/camera/canvas, по умолчанию заблокированы.
  • Разрешение browser в sandbox ломает изоляцию (браузер запускается на хосте).

Устранение неполадок

  • Образ отсутствует: соберите с помощью scripts/sandbox-setup.sh или установите agents.defaults.sandbox.docker.image.
  • Контейнер не запущен: он автоматически создаётся по требованию для каждого сеанса.
  • Ошибки прав доступа в sandbox: установите docker.user в UID:GID, соответствующие владельцу смонтированного рабочего пространства (или выполните chown для папки рабочего пространства).
  • Пользовательские инструменты не найдены: OpenClaw запускает команды с sh -lc (login shell), который источает /etc/profile и может сбрасывать PATH. Установите docker.env.PATH, чтобы добавить ваши пути к инструментам (например, /custom/bin:/usr/local/share/npm-global/bin), или добавьте скрипт в /etc/profile.d/ в вашем Dockerfile.