Docker (опционально)

Docker опционален. Используйте его только если хотите контейнеризованный шлюз или проверить процесс Docker.

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

  • Да: вы хотите изолированную, одноразовую среду шлюза или запустить OpenClaw на хосте без локальных установок.
  • Нет: вы работаете на своей машине и просто хотите самый быстрый цикл разработки. Используйте обычный процесс установки вместо этого.
  • Примечание о песочнице: песочницы агентов тоже используют Docker, но это не требует запуска полного шлюза в Docker. См. Песочницы.

Это руководство охватывает:

  • Контейнеризованный шлюз (полный OpenClaw в Docker)
  • Песочница агента для сессии (шлюз на хосте + изолированные инструменты агента в Docker)

Детали песочниц: Песочницы

Требования

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

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

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

Из корня репозитория:

./docker-setup.sh

Этот скрипт:

  • собирает образ шлюза
  • запускает мастер onboarding
  • печатает подсказки по опциональной настройке провайдера
  • запускает шлюз через Docker Compose
  • генерирует токен шлюза и записывает его в .env

Опциональные переменные окружения:

  • OPENCLAW_DOCKER_APT_PACKAGES — установить дополнительные apt пакеты во время сборки
  • OPENCLAW_EXTRA_MOUNTS — добавить дополнительные bind mount с хоста
  • OPENCLAW_HOME_VOLUME — сохранить /home/node в именованном volume

После завершения:

  • Откройте http://127.0.0.1:18789/ в браузере.
  • Вставьте токен в Control UI (Settings → token).

Он записывает config/workspace на хосте:

  • ~/.openclaw/
  • ~/.openclaw/workspace

Работаете на VPS? См. Hetzner (Docker VPS).

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

docker build -t openclaw:local -f Dockerfile .
docker compose run --rm openclaw-cli onboard
docker compose up -d openclaw-gateway

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

Если вы хотите смонтировать дополнительные каталоги хоста в контейнеры, установите OPENCLAW_EXTRA_MOUNTS перед запуском docker-setup.sh. Это принимает список bind mount Docker через запятую и применяет их к обоим openclaw-gateway и openclaw-cli, генерируя docker-compose.extra.yml.

Пример:

export OPENCLAW_EXTRA_MOUNTS="$HOME/.codex:/home/node/.codex:ro,$HOME/github:/home/node/github:rw"
./docker-setup.sh

Примечания:

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

Сохранение всего домашнего каталога контейнера (опционально)

Если вы хотите, чтобы /home/node сохранялся между пересозданиями контейнера, установите именованный volume через OPENCLAW_HOME_VOLUME. Это создаёт Docker volume и монтирует его в /home/node, сохраняя стандартные bind mount для config/workspace. Используйте именованный volume здесь (не bind путь); для bind mount используйте OPENCLAW_EXTRA_MOUNTS.

Пример:

export OPENCLAW_HOME_VOLUME="openclaw_home"
./docker-setup.sh

Вы можете комбинировать это с дополнительными монтированиями:

export OPENCLAW_HOME_VOLUME="openclaw_home"
export OPENCLAW_EXTRA_MOUNTS="$HOME/.codex:/home/node/.codex:ro,$HOME/github:/home/node/github:rw"
./docker-setup.sh

Примечания:

  • Если вы меняете OPENCLAW_HOME_VOLUME, перезапустите docker-setup.sh для регенерации extra compose файла.
  • Именованный volume сохраняется до удаления с помощью docker volume rm <name>.

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

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

Пример:

export OPENCLAW_DOCKER_APT_PACKAGES="ffmpeg build-essential"
./docker-setup.sh

Примечания:

  • Это принимает список имён apt пакетов, разделённых пробелами.
  • Если вы меняете OPENCLAW_DOCKER_APT_PACKAGES, перезапустите docker-setup.sh для пересборки образа.

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

Для ускорения пересборок упорядочьте ваш Dockerfile так, чтобы слои зависимостей кэшировались. Это позволяет избежать повторного запуска pnpm install, если lockfile не изменились:

FROM node:22-bookworm

# Установить Bun (требуется для скриптов сборки)
RUN curl -fsSL https://bun.sh/install | bash
ENV PATH="/root/.bun/bin:${PATH}"

RUN corepack enable

WORKDIR /app

# Кэшировать зависимости если метаданные пакетов не изменились
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./
COPY ui/package.json ./ui/package.json
COPY scripts ./scripts

RUN pnpm install --frozen-lockfile

COPY . .
RUN pnpm build
RUN pnpm ui:install
RUN pnpm ui:build

ENV NODE_ENV=production

CMD ["node","dist/index.js"]

Настройка канала (опционально)

Используйте CLI контейнер для настройки каналов, затем перезапустите шлюз если нужно.

WhatsApp (QR):

docker compose run --rm openclaw-cli channels login

Telegram (токен бота):

docker compose run --rm openclaw-cli channels add --channel telegram --token "<token>"

Discord (токен бота):

docker compose run --rm openclaw-cli channels add --channel discord --token "<token>"

Документация: WhatsApp, Telegram, Discord

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

docker compose exec openclaw-gateway node dist/index.js health --token "$OPENCLAW_GATEWAY_TOKEN"

E2E smoke test (Docker)

scripts/e2e/onboard-docker.sh

QR import smoke test (Docker)

pnpm test:docker:qr

Примечания

  • Gateway bind по умолчанию lan для использования контейнера.
  • Контейнер шлюза — источник истины для сессий (~/.openclaw/agents/<agentId>/sessions/).

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

Глубокое погружение: Песочницы

Что это делает

Когда agents.defaults.sandbox включён, не-main сессии запускают инструменты внутри Docker контейнера. Шлюз остаётся на вашем хосте, но выполнение инструментов изолировано:

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

Предупреждение: scope: "shared" отключает межсессионную изоляцию. Все сессии делят один контейнер и одно рабочее пространство.

Профили песочниц для каждого агента (мульти-агент)

Если вы используете маршрутизацию мульти-агента, каждый агент может переопределить настройки песочницы + инструментов: agents.list[].sandbox и agents.list[].tools (плюс agents.list[].tools.sandbox.tools). Это позволяет запускать смешанные уровни доступа в одном шлюзе:

  • Полный доступ (личный агент)
  • Инструменты только для чтения + рабочее пространство только для чтения (семейный/рабочий агент)
  • Без инструментов файловой системы/shell (публичный агент)

См. Песочницы и инструменты мульти-агента для примеров, приоритетов и устранения неполадок.

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

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

Включение песочниц

Если вы планируете устанавливать пакеты в 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: {
        mode: "non-main", // off | non-main | all
        scope: "agent", // session | agent | shared (agent по умолчанию)
        workspaceAccess: "none", // none | ro | rw
        workspaceRoot: "~/.openclaw/sandboxes",
        docker: {
          image: "openclaw-sandbox:bookworm-slim",
          workdir: "/workspace",
          readOnlyRoot: true,
          tmpfs: ["/tmp", "/var/tmp", "/run"],
          network: "none",
          user: "1000:1000",
          capDrop: ["ALL"],
          env: { LANG: "C.UTF-8" },
          setupCommand: "apt-get update && apt-get install -y git curl jq",
          pidsLimit: 256,
          memory: "1g",
          memorySwap: "2g",
          cpus: 1,
          ulimits: {
            nofile: { soft: 1024, hard: 2048 },
            nproc: 256
          },
          seccompProfile: "/path/to/seccomp.json",
          apparmorProfile: "openclaw-sandbox",
          dns: ["1.1.1.1", "8.8.8.8"],
          extraHosts: ["internal.service:10.0.0.5"]
        },
        prune: {
          idleHours: 24, // 0 отключает очистку idle
          maxAgeDays: 7  // 0 отключает очистку max-age
        }
      }
    }
  },
  tools: {
    sandbox: {
      tools: {
        allow: ["exec", "process", "read", "write", "edit", "sessions_list", "sessions_history", "sessions_send", "sessions_spawn", "session_status"],
        deny: ["browser", "canvas", "nodes", "cron", "discord", "gateway"]
      }
    }
  }
}

Настройки усиления находятся под agents.defaults.sandbox.docker: network, user, pidsLimit, memory, memorySwap, cpus, ulimits, seccompProfile, apparmorProfile, dns, extraHosts.

Мульти-агент: переопределите agents.defaults.sandbox.{docker,browser,prune}.* для каждого агента через agents.list[].sandbox.{docker,browser,prune}.* (игнорируется когда agents.defaults.sandbox.scope / agents.list[].sandbox.scope равен "shared").

Сборка образа песочницы по умолчанию

scripts/sandbox-setup.sh

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

Общий образ песочницы (опционально)

Если вы хотите образ песочницы с общими инструментами сборки (Node, Go, Rust и т.д.), соберите общий образ:

scripts/sandbox-common-setup.sh

Это собирает openclaw-sandbox-common:bookworm-slim. Чтобы использовать его:

{
  agents: { defaults: { sandbox: { docker: { image: "openclaw-sandbox-common:bookworm-slim" } } } }
}

Образ браузера песочницы

Чтобы запустить инструмент браузера внутри песочницы, соберите образ браузера:

scripts/sandbox-browser-setup.sh

Это собирает 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 предоставляет дисплей.

Используйте конфигурацию:

{
  agents: {
    defaults: {
      sandbox: {
        browser: { enabled: true }
      }
    }
  }
}

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

{
  agents: {
    defaults: {
      sandbox: { browser: { image: "my-openclaw-browser" } }
    }
  }
}

Когда включено, агент получает:

  • URL управления браузером песочницы (для инструмента browser)
  • URL noVNC (если включён и headless=false)

Помните: если вы используете список разрешённых для инструментов, добавьте browser (и удалите его из deny) или инструмент останется заблокированным. Правила очистки (agents.defaults.sandbox.prune) применяются и к контейнерам браузера.

Пользовательский образ песочницы

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

docker build -t my-openclaw-sbx -f Dockerfile.sandbox .
{
  agents: {
    defaults: {
      sandbox: { docker: { image: "my-openclaw-sbx" } }
    }
  }
}

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

  • deny выигрывает над allow.
  • Если allow пуст: все инструменты (кроме deny) доступны.
  • Если 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 в песочнице нарушает изоляцию (браузер запускается на хосте).

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

  • Образ отсутствует: соберите с помощью scripts/sandbox-setup.sh или установите agents.defaults.sandbox.docker.image.
  • Контейнер не запущен: он будет автоматически создан для сессии по требованию.
  • Ошибки прав в песочнице: установите 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.