Containers

Docker

Docker є необов’язковим. Використовуйте його лише якщо вам потрібен контейнеризований Gateway або ви хочете перевірити Docker-потік.

Чи підходить мені Docker?

  • Так: вам потрібне ізольоване одноразове середовище Gateway або запуск OpenClaw на хості без локальних інсталяцій.
  • Ні: ви запускаєте на власній машині й просто хочете найшвидший цикл розробки. Натомість використовуйте звичайний потік інсталяції.
  • Примітка про пісочницю: стандартний бекенд пісочниці використовує Docker, коли пісочницю ввімкнено, але пісочниця вимкнена за замовчуванням і не вимагає запуску всього Gateway у Docker. Також доступні бекенди пісочниці SSH і OpenShell. Див. Пісочниця.

Передумови

  • Docker Desktop (або Docker Engine) + Docker Compose v2
  • Щонайменше 2 ГБ RAM для складання образу (pnpm install може бути завершено через OOM на хостах з 1 ГБ із кодом виходу 137)
  • Достатньо дискового простору для образів і журналів
  • Якщо запускаєте на VPS/публічному хості, перегляньте Посилення безпеки для мережевого доступу, особливо політику брандмауера Docker DOCKER-USER.

Контейнеризований Gateway

  • Зберіть образ

    З кореня репозиторію запустіть скрипт налаштування:

    ./scripts/docker/setup.sh
    

    Це локально збере образ Gateway. Щоб натомість використати попередньо зібраний образ:

    export OPENCLAW_IMAGE="ghcr.io/openclaw/openclaw:latest"
    ./scripts/docker/setup.sh
    

    Попередньо зібрані образи публікуються в GitHub Container Registry. Поширені теги: main, latest, <version> (наприклад, 2026.2.26).

  • Завершіть первинне налаштування

    Скрипт налаштування автоматично запускає первинне налаштування. Він:

    • попросить ключі API провайдера
    • згенерує токен Gateway і запише його до .env
    • запустить Gateway через Docker Compose

    Під час налаштування первинне налаштування перед стартом і записи конфігурації виконуються напряму через openclaw-gateway. openclaw-cli призначений для команд, які ви запускаєте після того, як контейнер Gateway уже існує.

  • Відкрийте Control UI

    Відкрийте http://127.0.0.1:18789/ у браузері та вставте налаштований спільний секрет у Settings. Скрипт налаштування за замовчуванням записує токен до .env; якщо ви перемкнете конфігурацію контейнера на автентифікацію паролем, використовуйте натомість цей пароль.

    Потрібна URL-адреса ще раз?

    docker compose run --rm openclaw-cli dashboard --no-open
    
  • Налаштуйте канали (необов’язково)

    Використовуйте контейнер 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 build -t openclaw:local -f Dockerfile .
    docker compose run --rm --no-deps --entrypoint node openclaw-gateway \
      dist/index.js onboard --mode local --no-install-daemon
    docker compose run --rm --no-deps --entrypoint node openclaw-gateway \
      dist/index.js config set --batch-json '[{"path":"gateway.mode","value":"local"},{"path":"gateway.bind","value":"lan"},{"path":"gateway.controlUi.allowedOrigins","value":["http://localhost:18789","http://127.0.0.1:18789"]}]'
    docker compose up -d openclaw-gateway
    

    Змінні середовища

    Скрипт налаштування приймає ці необов’язкові змінні середовища:

    Змінна Призначення
    OPENCLAW_IMAGE Використати віддалений образ замість локального складання
    OPENCLAW_DOCKER_APT_PACKAGES Встановити додаткові apt-пакети під час складання (розділені пробілами)
    OPENCLAW_EXTENSIONS Додати вибрані допоміжні засоби bundled Plugin під час складання
    OPENCLAW_EXTRA_MOUNTS Додаткові bind mount хоста (розділені комами source:target[:opts])
    OPENCLAW_HOME_VOLUME Зберігати /home/node в іменованому томі Docker
    OPENCLAW_SANDBOX Увімкнути bootstrap пісочниці (1, true, yes, on)
    OPENCLAW_SKIP_ONBOARDING Пропустити інтерактивний крок первинного налаштування (1, true, yes, on)
    OPENCLAW_DOCKER_SOCKET Перевизначити шлях до сокета Docker
    OPENCLAW_DISABLE_BONJOUR Вимкнути оголошення Bonjour/mDNS (за замовчуванням 1 для Docker)
    OPENCLAW_DISABLE_BUNDLED_SOURCE_OVERLAYS Вимкнути bind-mount накладання джерел bundled Plugin
    OTEL_EXPORTER_OTLP_ENDPOINT Спільна кінцева точка колектора OTLP/HTTP для експорту OpenTelemetry
    OTEL_EXPORTER_OTLP_*_ENDPOINT Специфічні для сигналів кінцеві точки OTLP для трас, метрик або журналів
    OTEL_EXPORTER_OTLP_PROTOCOL Перевизначення протоколу OTLP. Наразі підтримується лише http/protobuf
    OTEL_SERVICE_NAME Ім’я сервісу, що використовується для ресурсів OpenTelemetry
    OTEL_SEMCONV_STABILITY_OPT_IN Увімкнути найновіші експериментальні семантичні атрибути GenAI
    OPENCLAW_OTEL_PRELOADED Пропустити запуск другого OpenTelemetry SDK, коли один уже попередньо завантажено

    Мейнтейнери можуть тестувати джерело bundled Plugin проти упакованого образу, монтувавши один каталог джерела Plugin поверх його упакованого шляху джерела, наприклад OPENCLAW_EXTRA_MOUNTS=/path/to/fork/extensions/synology-chat:/app/extensions/synology-chat:ro. Цей змонтований каталог джерела перевизначає відповідний скомпільований пакет /app/dist/extensions/synology-chat для того самого ідентифікатора Plugin.

    Спостережуваність

    Експорт OpenTelemetry є вихідним з контейнера Gateway до вашого колектора OTLP. Він не потребує опублікованого порту Docker. Якщо ви збираєте образ локально й хочете, щоб bundled експортер OpenTelemetry був доступний усередині образу, додайте його runtime-залежності:

    export OPENCLAW_EXTENSIONS="diagnostics-otel"
    export OTEL_EXPORTER_OTLP_ENDPOINT="http://otel-collector:4318"
    export OTEL_SERVICE_NAME="openclaw-gateway"
    ./scripts/docker/setup.sh
    

    Установіть офіційний Plugin @openclaw/diagnostics-otel з ClawHub у упакованих інсталяціях Docker перед увімкненням експорту. Власні образи, зібрані з джерел, усе ще можуть додавати локальне джерело Plugin за допомогою OPENCLAW_EXTENSIONS=diagnostics-otel. Щоб увімкнути експорт, дозвольте й увімкніть Plugin diagnostics-otel у конфігурації, потім установіть diagnostics.otel.enabled=true або використайте приклад конфігурації в Експорт OpenTelemetry. Заголовки автентифікації колектора налаштовуються через diagnostics.otel.headers, а не через змінні середовища Docker.

    Метрики Prometheus використовують уже опублікований порт Gateway. Установіть clawhub:@openclaw/diagnostics-prometheus, увімкніть Plugin diagnostics-prometheus, потім збирайте:

    http://<gateway-host>:18789/api/diagnostics/prometheus
    

    Маршрут захищено автентифікацією Gateway. Не відкривайте окремий публічний порт /metrics або неавтентифікований шлях reverse-proxy. Див. Метрики Prometheus.

    Перевірки справності

    Кінцеві точки перевірок контейнера (автентифікація не потрібна):

    curl -fsS http://127.0.0.1:18789/healthz   # liveness
    curl -fsS http://127.0.0.1:18789/readyz     # readiness
    

    Образ Docker містить вбудований HEALTHCHECK, який пінгує /healthz. Якщо перевірки постійно не проходять, Docker позначає контейнер як unhealthy, а системи оркестрації можуть перезапустити або замінити його.

    Автентифікований глибокий знімок справності:

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

    LAN проти loopback

    scripts/docker/setup.sh за замовчуванням установлює OPENCLAW_GATEWAY_BIND=lan, щоб доступ хоста до http://127.0.0.1:18789 працював із публікацією портів Docker.

    • lan (за замовчуванням): браузер хоста та CLI хоста можуть дістатися опублікованого порту Gateway.
    • loopback: лише процеси всередині мережевого простору імен контейнера можуть напряму дістатися Gateway.

    Локальні провайдери хоста

    Коли OpenClaw працює в Docker, 127.0.0.1 усередині контейнера — це сам контейнер, а не ваша хост-машина. Використовуйте host.docker.internal для AI-провайдерів, які працюють на хості:

    Провайдер Стандартна URL-адреса хоста URL-адреса для Docker setup
    LM Studio http://127.0.0.1:1234 http://host.docker.internal:1234
    Ollama http://127.0.0.1:11434 http://host.docker.internal:11434

    Bundled Docker setup використовує ці URL-адреси хоста як стандартні значення первинного налаштування LM Studio й Ollama, а docker-compose.yml зіставляє host.docker.internal із host gateway Docker для Linux Docker Engine. Docker Desktop уже надає те саме ім’я хоста на macOS і Windows.

    Сервіси хоста також мають слухати адресу, доступну з Docker:

    lms server start --port 1234 --bind 0.0.0.0
    OLLAMA_HOST=0.0.0.0:11434 ollama serve
    

    Якщо ви використовуєте власний Compose-файл або команду docker run, додайте таке саме зіставлення хоста самостійно, наприклад --add-host=host.docker.internal:host-gateway.

    Bonjour / mDNS

    Мережа мосту Docker зазвичай не пересилає multicast Bonjour/mDNS (224.0.0.251:5353) надійно. Тому bundled Compose setup за замовчуванням установлює OPENCLAW_DISABLE_BONJOUR=1, щоб Gateway не потрапляв у цикл падіння або багаторазово не перезапускав оголошення, коли міст відкидає multicast-трафік.

    Використовуйте опубліковану URL-адресу Gateway, Tailscale або wide-area DNS-SD для хостів Docker. Установлюйте OPENCLAW_DISABLE_BONJOUR=0 лише під час запуску з мережею хоста, macvlan або іншою мережею, де відомо, що multicast mDNS працює.

    Підводні камені й усунення несправностей див. у Виявлення Bonjour.

    Сховище та сталість

    Docker Compose bind-mount-ить OPENCLAW_CONFIG_DIR до /home/node/.openclaw і OPENCLAW_WORKSPACE_DIR до /home/node/.openclaw/workspace, тому ці шляхи зберігаються після заміни контейнера. Коли будь-яка зі змінних не задана, bundled docker-compose.yml повертається до ${HOME}/.openclaw${HOME}/.openclaw/workspace для монтування workspace) або до /tmp/.openclaw, коли самого HOME також немає. Це не дає docker compose up видавати специфікацію тому з порожнім джерелом у мінімальних середовищах.

    У цьому змонтованому каталозі конфігурації OpenClaw зберігає:

    • openclaw.json для конфігурації поведінки
    • agents/<agentId>/agent/auth-profiles.json для збереженої автентифікації OAuth/API-key провайдерів
    • .env для runtime-секретів на основі env, таких як OPENCLAW_GATEWAY_TOKEN

    Установлені завантажувані Plugin зберігають стан своїх пакетів у змонтованому домашньому каталозі OpenClaw, тому записи встановлення Plugin і корені пакетів зберігаються після заміни контейнера. Запуск Gateway не генерує дерева залежностей bundled Plugin.

    Повні відомості про сталість у VM-розгортаннях див. у Docker VM Runtime - Що де зберігається.

    Гарячі точки зростання диска: стежте за media/, файлами JSONL сесій, cron/runs/*.jsonl, коренями встановлених пакетів plugin і rolling file logs у /tmp/openclaw/.

    Допоміжні засоби оболонки (необов'язково)

    Для простішого щоденного керування Docker установіть ClawDock:

    mkdir -p ~/.clawdock && curl -sL https://raw.githubusercontent.com/openclaw/openclaw/main/scripts/clawdock/clawdock-helpers.sh -o ~/.clawdock/clawdock-helpers.sh
    echo 'source ~/.clawdock/clawdock-helpers.sh' >> ~/.zshrc && source ~/.zshrc
    

    Якщо ви встановили ClawDock зі старішого raw-шляху scripts/shell-helpers/clawdock-helpers.sh, повторно виконайте наведену вище команду встановлення, щоб ваш локальний допоміжний файл відстежував нове розташування.

    Потім використовуйте clawdock-start, clawdock-stop, clawdock-dashboard тощо. Виконайте clawdock-help, щоб переглянути всі команди. Див. ClawDock, щоб отримати повний посібник із допоміжних засобів.

    Enable agent sandbox for Docker gateway
    export OPENCLAW_SANDBOX=1
    ./scripts/docker/setup.sh
    

    Власний шлях до сокета (наприклад, rootless Docker):

    export OPENCLAW_SANDBOX=1
    export OPENCLAW_DOCKER_SOCKET=/run/user/1000/docker.sock
    ./scripts/docker/setup.sh
    

    Скрипт монтує docker.sock лише після успішного проходження передумов sandbox. Якщо налаштування sandbox не може завершитися, скрипт скидає agents.defaults.sandbox.mode до off.

    Automation / CI (non-interactive)

    Вимкніть виділення псевдо-TTY у Compose за допомогою -T:

    docker compose run -T --rm openclaw-cli gateway probe
    docker compose run -T --rm openclaw-cli devices list --json
    
    Shared-network security note

    openclaw-cli використовує network_mode: "service:openclaw-gateway", щоб команди CLI могли дістатися до Gateway через 127.0.0.1. Розглядайте це як спільну межу довіри. Конфігурація compose вимикає NET_RAW/NET_ADMIN і вмикає no-new-privileges як для openclaw-gateway, так і для openclaw-cli.

    Permissions and EACCES

    Образ запускається як node (uid 1000). Якщо ви бачите помилки дозволів у /home/node/.openclaw, переконайтеся, що bind mounts на вашому хості належать uid 1000:

    sudo chown -R 1000:1000 /path/to/openclaw-config /path/to/openclaw-workspace
    

    Така сама невідповідність може проявлятися як попередження plugin, наприклад blocked plugin candidate: suspicious ownership (... uid=1000, expected uid=0 or root) із подальшим plugin present but blocked. Це означає, що uid процесу та власник змонтованого каталогу plugin не збігаються. Бажано запускати контейнер із типовим uid 1000 і виправити власника bind mount. Виконуйте chown /path/to/openclaw-config/npm до root:root лише якщо ви навмисно запускаєте OpenClaw як root довгостроково.

    Faster rebuilds

    Упорядкуйте Dockerfile так, щоб шари залежностей кешувалися. Це уникає повторного запуску pnpm install, якщо lockfiles не змінюються:

    FROM node:24-bookworm
    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"]
    
    Power-user container options

    Типовий образ орієнтований насамперед на безпеку й запускається як non-root node. Для більш функціонального контейнера:

    1. Зберігайте /home/node: export OPENCLAW_HOME_VOLUME="openclaw_home"
    2. Вбудуйте системні залежності: export OPENCLAW_DOCKER_APT_PACKAGES="git curl jq"
    3. Установіть браузери Playwright:
      docker compose run --rm openclaw-cli \
        node /app/node_modules/playwright-core/cli.js install chromium
      
    4. Зберігайте завантаження браузерів: задайте PLAYWRIGHT_BROWSERS_PATH=/home/node/.cache/ms-playwright і використовуйте OPENCLAW_HOME_VOLUME або OPENCLAW_EXTRA_MOUNTS.
    OpenAI Codex OAuth (headless Docker)

    Якщо ви виберете OpenAI Codex OAuth у майстрі, він відкриє URL у браузері. У Docker або headless-налаштуваннях скопіюйте повний URL перенаправлення, на який ви потрапите, і вставте його назад у майстер, щоб завершити автентифікацію.

    Base image metadata

    Основний runtime-образ Docker використовує node:24-bookworm-slim і публікує OCI анотації базового образу, зокрема org.opencontainers.image.base.name, org.opencontainers.image.source та інші. Дайджест базового образу Node оновлюється через PR Dependabot для базового образу Docker; release-збірки не запускають шар оновлення дистрибутива. Див. анотації образів OCI.

    Запуск на VPS?

    Див. Hetzner (Docker VPS) і Docker VM Runtime, щоб отримати кроки розгортання на спільній VM, зокрема вбудовування бінарного файлу, сталість даних і оновлення.

    Sandbox агента

    Коли agents.defaults.sandbox увімкнено з бекендом Docker, Gateway запускає виконання інструментів агента (оболонка, читання/запис файлів тощо) всередині ізольованих Docker контейнерів, тоді як сам Gateway залишається на хості. Це дає жорстку межу навколо недовірених або multi-tenant сесій агентів без контейнеризації всього Gateway.

    Область sandbox може бути для кожного агента (типово), для кожної сесії або спільною. Кожна область отримує власний робочий простір, змонтований у /workspace. Ви також можете налаштувати політики дозволу/заборони інструментів, ізоляцію мережі, ліміти ресурсів і браузерні контейнери.

    Повну конфігурацію, образи, примітки щодо безпеки й профілі multi-agent див. тут:

    • Sandboxing -- повний довідник із sandbox
    • OpenShell -- інтерактивний доступ оболонки до контейнерів sandbox
    • Multi-Agent Sandbox and Tools -- перевизначення для кожного агента

    Швидке ввімкнення

    {
      agents: {
        defaults: {
          sandbox: {
            mode: "non-main", // off | non-main | all
            scope: "agent", // session | agent | shared
          },
        },
      },
    }
    

    Зберіть типовий образ sandbox (із вихідного checkout):

    scripts/sandbox-setup.sh
    

    Для npm-встановлень без вихідного checkout див. Sandboxing § Images and setup щодо inline-команд docker build.

    Усунення несправностей

    Image missing or sandbox container not starting

    Зберіть образ sandbox за допомогою scripts/sandbox-setup.sh (вихідний checkout) або inline-команди docker build з Sandboxing § Images and setup (npm-встановлення), або задайте agents.defaults.sandbox.docker.image для вашого власного образу. Контейнери автоматично створюються для кожної сесії на вимогу.

    Permission errors in sandbox

    Задайте docker.user як UID:GID, що відповідає власнику вашого змонтованого робочого простору, або змініть власника теки робочого простору через chown.

    Custom tools not found in sandbox

    OpenClaw запускає команди через sh -lc (login shell), що зчитує /etc/profile і може скинути PATH. Задайте docker.env.PATH, щоб додати ваші власні шляхи інструментів на початок, або додайте скрипт у /etc/profile.d/ у вашому Dockerfile.

    OOM-killed during image build (exit 137)

    VM потребує щонайменше 2 ГБ RAM. Використайте більший клас машини й повторіть спробу.

    Unauthorized or pairing required in Control UI

    Отримайте свіже посилання на dashboard і схваліть пристрій браузера:

    docker compose run --rm openclaw-cli dashboard --no-open
    docker compose run --rm openclaw-cli devices list
    docker compose run --rm openclaw-cli devices approve <requestId>
    

    Докладніше: Dashboard, Devices.

    Gateway target shows ws://172.x.x.x or pairing errors from Docker CLI

    Скиньте режим Gateway і прив'язку:

    docker compose run --rm openclaw-cli config set --batch-json '[{"path":"gateway.mode","value":"local"},{"path":"gateway.bind","value":"lan"}]'
    docker compose run --rm openclaw-cli devices list --url ws://127.0.0.1:18789
    

    Пов'язане