2026 OpenClaw Docker Compose в нескольких контейнерах: привязка Gateway, токен и чеклист сетевой починки «pairing субагента 1008» (trustedProxies)

Около 14 минут чтения · MACCOME

Кому актуально: вы поднимаете через Docker Compose Gateway и контейнеры CLI или агентов; в логах Gateway «как будто работает», но дочерние сессии выдают gateway closed (1008): pairing required, либо RPC healthy, а pairing не завершается. Вывод: редко это чинится «ещё раз переустановить образ» — чаще это сочетание поверхности bind, токена, доверенных proxy-подсетей (trustedProxies) и URL между контейнерами; статья даёт матрицу симптомов, фрагмент Compose, шестишаговый runbook и три KPI. Разделение с другими материалами: параллельно читайте официальный docker-setup.sh + GHCR, pairing и токен и сетевой triage для Docker.

Почему в Compose Gateway «запущен», а субагенты всё равно видят 1008

Gateway OpenClaw отвечает за долгие соединения и маршрутизацию; когда CLI или инструменты «подсессий/субагентов» общаются с Gateway по WebSocket/HTTP, одного запущенного процесса мало — с точки зрения Gateway вызывающая сторона должна быть доверенной в сетевом смысле, а pairing должен быть действительным. Docker помещает каждый сервис в своё сетевое пространство имён: если внутри контейнера CLI указать http://127.0.0.1:18789, трафик попадёт только в этот контейнер, а не в хост или другой сервис.

  1. localhost не заменён именем сервиса: нужно имя DNS Compose вроде http://openclaw-gateway:18789 (пример).
  2. Несовпадение bind и пути доступа: если Gateway слушает только loopback, другие контейнеры через bridge-IP могут считаться «не локальными» — ветки auth или pairing.
  3. Нет trustedProxies: за reverse proxy или bridge нужно объявлять подсети Docker (часто 172.16.0.0/12, 10.0.0.0/8 и CIDR вашей кастомной сети), чтобы корректно определять клиента.
  4. Расхождение OPENCLAW_GATEWAY_TOKEN: Gateway и CLI берут токен из разных mount или env — картина «то работает, то 401/1008».
  5. Состояние pairing потеряно после обновления: неполные тома — сессии субагентов нуждаются в повторном pairing, но это принимают за «чисто сеть».
  6. Упускают типичные паттерны из issue: loopback bind + раздельные контейнеры требуют явно менять bind или политику trusted proxy — это сетевой контракт границы, а не случайный ярлык дефекта.

В отличие от обзора установки на три ОС, для Compose важнее не «какая ОС», а какая сеть доверена в каком контейнере.

При воспроизведении сохраните рядом три следа в логах: строки старта Gateway, стек субагента и Subnet attachable-сети из docker inspect — многие 1008 после сравнения сводятся к «не объявлен доверенный диапазон», а не к модели или каналу.

Таблица 1: мгновенный симптом → что проверить (матрица решений)

Снимок симптомаСначала проверить (по порядку)Типичная причина
Контейнер A не достаёт 127.0.0.1:18789Сначала URL с именем сервиса, затем publish портов и адрес прослушиванияНеверная семантика localhost
RPC healthy, sessions_spawn даёт 1008Список pairing → trustedProxies → тройка bindПуть субагента считается внешним / не сопряжённым
В логах trusted proxy / pairingСогласовать CIDR compose и конфиг gateway.authПодсеть вне доверенного множества
Только после смены версииСравнить старые/новые defaults bind/auth и мигрированный том .openclawУжесточение defaults или устаревший pairing
info

Подсказка: даже при официальном docker-setup.sh перепроверьте имена сервисов и тома через эту сетевую призму — см. runbook GHCR и Control UI.

Таблица 2: режим bind и доступ между контейнерами

gateway.bind (концепция)Когда подходитТрение с Compose
loopbackОдин all-in-one контейнер или только хостДругие сервисы не могут трактовать это как локальный loopback
lan / свой listenНесколько сервисов, RPC между контейнерамиНужны токен/auth и сужение экспозиции
trusted reverse proxyСпереди Nginx/CaddyДолжно совпадать с чеклистом reverse proxy по downstream-источникам

Таблица 3: как заполнять trustedProxies (примеры CIDR)

Ниже учебный пример: реальную подсеть берите из docker network inspect, не копируйте слепо.

Тип сетиПример CIDRЧто сделать
Стандартный Docker bridge172.17.0.0/16 (зависит от среды)Проверить, попадает ли исходный IP, который видит Gateway, в этот диапазон
Кастомная сеть Composeнапример 172.18.0.0/16172.30.x.xДобавить всю подсеть в trustedProxies (не отдельные IP контейнеров)
overlay / swarmвыдаёт оркестраторТот же принцип: подсети, а не список pod-IP

Шестишаговый runbook: от «контейнеры пингуются» до «субагенты могут пройти pairing»

  1. Унифицировать OPENCLAW_CONFIG_DIR: Gateway и CLI/агенты монтируют один путь или синхронизированное содержимое.
  2. URL Gateway через имя сервиса: в env контейнера CLI, напр. OPENCLAW_GATEWAY_URL=http://openclaw-gateway:18789 (имя как в compose).
  3. Согласовать токен: OPENCLAW_GATEWAY_TOKEN одинаков с обеих сторон; для файлового токена — читаемость mount.
  4. Задать bind Gateway и trustedProxies: после правок по табл. 2/3 перезапустить Gateway (bind обычно требует жёсткого рестарта).
  5. Цепочка диагностики: openclaw gateway statusopenclaw doctor → воспроизвести действие субагента и искать в логах 1008 / pairing.
  6. Зафиксировать три KPI: время до успешного pairing, число рестартов, остаются ли таймауты RPC между контейнерами — в тикете изменений.
yaml
# Фрагмент-пример (имена сервисов и плейсхолдеры env — заменить перед продом)
services:
  openclaw-gateway:
    environment:
      - OPENCLAW_CONFIG_DIR=/config
      - OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN}
    volumes:
      - ./config:/config
    networks: [oc-net]

  openclaw-cli:
    environment:
      - OPENCLAW_CONFIG_DIR=/config
      - OPENCLAW_GATEWAY_URL=http://openclaw-gateway:18789
      - OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN}
    volumes:
      - ./config:/config
    networks: [oc-net]

networks:
  oc-net: { driver: bridge }

Три KPI для дашборда (проверяемые в эксплуатации)

  1. Доля успеха субагентов: успешные sessions_spawn (или эквивалент) / всего вызовов за окно; ниже порога — открыть страницу triage «pairing + подсеть».
  2. Алерт дрейфа конфигурации: сравнить отпечаток gateway.auth.token или хэш env между контейнерами; при расхождении блокировать релиз.
  3. Стоимость рестартов Gateway: сколько раз пришлось перезапускать после bind/trustedProxies — двигать «конфиг как код» и шаблоны ревью.

Эти KPI — инженерные рекомендации по наблюдаемости, не SLA апстрима.

Почему слепленная из подручного контейнерная среда плохо держит продакшен-цепочку OpenClaw

«Образ поднялся» мало: субагентам и сессионным инструментам нужны стабильный Gateway, предсказуемая сетевая идентичность и согласованные тома конфигурации. Крутить один контейнер docker run на ноутбуке — иной профиль сбоев, чем фиксированный Compose с постоянными томами на выделенном удалённом Mac: последнее ближе к безнадзорным и по расписанию задачам.

Эфемерный VPS или общий десктоп могут показать демо, но часто без ровной дисковой и сетевой базовой линии; когда Gateway, reverse proxy и автоматизация должны жить в одной зоне доверия и масштабироваться, мультирегиональные узлы Apple Silicon с помесячными и поквартальными тарифами часто удобнее, чем вручную наращивать временные Docker-хосты. MACCOME даёт физическую изоляцию и выбор из шести регионов, чтобы разделять «всегда включённый Gateway» и «сборку/подпись»; откройте тарифы и центр помощи, затем подключайте переменные по этому runbook.

Порядок внедрения: сначала закрыть шесть шагов в одном проекте Compose, затем решать, не вынести ли Gateway и остальные нагрузки на отдельные удалённые узлы.

Частые вопросы

При коде 1008 сразу менять bind на LAN?

Сначала таблица 1: часто дело в URL с именем сервиса или trustedProxies, а не в слепом расширении прослушивания. Расширяя экспозицию, согласуйте токен и фаервол. Pairing: чеклист pairing и токен.

Можно ли на хосте curl к 127.0.0.1:18789 вместо проверки из контейнера?

Как проверка с хоста — да, но не заменяет проверку до Gateway по имени сервиса из контейнера — разные сетевые пространства имён. Справка: центр помощи Mac mini.

Не дублирует ли это материал «Сетевой triage Docker»?

Сетевой triage — про пространства имён Compose и доступ CLI; официальная Docker-статья — про пути образов. Здесь явно связываются pairing субагентов и trustedProxies. Далее: проверка MCP и Skills.