Чеклист триажа сети OpenClaw в Docker (2026)
Когда CLI не достигает Gateway: Compose, bind и пространства имён

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

Команды, которые запускают OpenClaw через Docker Compose, редко терпят неудачу из‑за невозможности скачать образы. Чаще ломается связность: логи Gateway выглядят нормально, а браузер или CLI сообщают connection refused, сбой WebSocket handshake или ошибки токена — из‑за адресов прослушивания (bind), публикации портов и того, разделяет ли CLI с Gateway сетевое пространство имён, а не из‑за ключа к API модели. В материале — шесть онколл-классов симптомов, две матрицы «не запущен» против «запущен, но недостижим», карта bind/фаервол/публикации, готовые диагностические команды, шестишаговый runbook и три KPI по логам. Сочетайте с production runbook по Docker, постинсталляционным триажем doctor и гайдом по пробам в Kubernetes: production отвечает на вопрос как развернуть; эта статья — почему контейнеры не видят друг друга или хост так, как вы ожидаете.

Шесть шаблонов, маскирующихся под ошибки токена

Control plane объединяет WebSocket/HTTP Gateway с CLI и Control UI, плюс несколько контейнеров, пользовательские bridge и network_mode: service:.... Без поуровневого триажа команды крутят правки .openclaw, не проверяя, доступен ли слушатель из пространства имён CLI.

  1. Прослушивание только на loopback: Gateway внутри контейнера слушает 127.0.0.1; хост попадает через опубликованные порты, а другой сервис в том же compose идёт по другому пути.
  2. CLI и Gateway в разных пространствах имён: CLI резолвит gateway:18789 через DNS bridge, а Gateway отдаёт loopback только в общем стеке сервиса — классика «один раз сработало, после перезапуска сломалось».
  3. Устаревшая публикация портов: curl на хосте то проходит, то после rolling upgrade залипли старые правила NAT и зонды из контейнера падают.
  4. Фаервол хоста против форвардинга docker0: браузер на localhost в порядке, контейнер CLI — нет.
  5. Обратные прокси без WebSocket upgrade: ошибки handshake принимают за падение Gateway (см. гайд systemd + Tunnel).
  6. Особенности dual-stack: ::1 или некорректные AAAA на минимальных образах.

Фиксируйте эти пункты в том же тикете, что тома, digest образов и health checks из production: достижимость отдельно от корректности версии.

Держите одностраничную топологию сети в репозитории compose: какие сервисы в какой сети, кто публикует порты, как ноутбуки разработки и CI проверяют стек. DNS на пользовательских сетях отличается от default bridge; если имена сервисов не резолвятся, выполните getent hosts или nslookup внутри контейнера прежде чем винить OpenClaw.

Таблица 1: не запущен против запущен, но недостижим

Сначала запускайте официальные doctor и gateway status (см. постинсталляционный гайд). Не ротируйте токены, пока не убедитесь, что слушатель существует.

СигналВероятный классПервое действиеАнтипаттерн
Нет контейнера Gateway или CrashLoopНе поднятdocker logs, OOM, пробы, убивающие podБесконечный pull без проверки ресурсов
Запущен, но внутри нет слушателя ssСбой конфигурации/bindПроверить OPENCLAW_GATEWAY_BIND и команду compose против документацииРедактировать только /etc/hosts на хосте
Слушатель есть, wget из CLI падаетМаршрутизация между пространствами имёнРассмотреть network_mode: "service:openclaw-gateway"Слепой 0.0.0.0 без моделирования угроз
Браузер на хосте падает, из контейнера окПубликация / проксиПроверить ports:, VPN, PACСлучайное отключение TLS

Таблица 2: bind, публикация и фаервол (специфика Docker)

Согласуйте с официальными значениями gateway.bind вроде loopback, lan, tailnet, auto; в compose явно зафиксируйте, кто публикует порты.

ЦельBind / смысл переменныхЗаметки по ComposeБезопасность
Только локальный ноутбукПриоритет loopback; хост бьёт в опубликованный порт127.0.0.1:18789:18789Не предполагайте, что другие сервисы compose наследуют достижимость loopback
CLI жёстко связан с GatewayОбщий сетевой стекnetwork_mode: "service:openclaw-gateway"Общее пространство портов — избегайте дублирующих bind
Отладка в LANlan или эквивалентЯвно: 0.0.0.0 или конкретный NICСвязать с правилами фаервола выше по контуру
Tunnel / reverse proxyGateway на loopback; TLS на периметреРазделённые сети; проверить проход WebSocketНе выставлять голые админ-порты в публичный Интернет
bash
# 1) Host: is the port actually published?
docker compose ps
curl -sv --max-time 2 http://127.0.0.1:18789/  || true

# 2) Inside gateway container
docker compose exec openclaw-gateway sh -lc 'ss -lntp 2>/dev/null || netstat -lntp'

# 3) From CLI container (rename services)
docker compose exec openclaw-cli sh -lc 'wget -qO- --timeout=2 http://openclaw-gateway:18789/ || echo FAIL'

# 4) Inspect effective compose
docker compose config | sed -n '1,200p'
warning

Внимание: в отчётах сообщества случай «CLI не достигает Gateway» часто связан с compose, где CLI никогда не попадает в сетевое пространство имён Gateway. Прогоните блок команд на тестовом стеке до merge в production.

Шестишаговый runbook

Если пути установки неочевидны, начните с гайда по трём платформам.

  1. Зафиксировать compose: Gateway, CLI (если есть), тома и env — в Git.
  2. Запустить doctor и gateway status: выровнять версии и количество файлов токенов.
  3. Классифицировать по таблице 1: для запущенных контейнеров — слушатели и кросс-контейнерные зонды.
  4. Подстроить bind и network_mode по таблице 2: по одной переменной за раз; сохранять вывод.
  5. За tunnel/proxy: проверить заголовки Upgrade и переписывание путей до кручения TLS в Gateway.
  6. Передаточная записка: тройка listen (адрес, порт, процесс), имена сервисов, разделение пространств имён, один успешный фрагмент зонда.

Три KPI по логам и алертам

Совместимо с HTTP-пробами из статьи про health checks в Kubernetes, если тот же стек поднимаете в оркестраторе.

  1. Тройка listen: локальный адрес из ss в контейнере, имя процесса, сервис compose — любое расхождение оформляйте тикетом.
  2. Корзины кросс-пространственных зондов: успех, таймаут и сбой DNS — разные первопричины.
  3. Согласованность опубликованных портов: docker port против NAT iptables после выкатов — устаревшие цепочки в 2026 всё ещё кусаются.

Маркируйте в логах Gateway сбои handshake отдельно от upstream 429/5xx; если доминирует второе, переходите к гайду по failover провайдеров.

Если HTTP-пробы бьют в loopback, а пользовательский трафик приходит с другого интерфейса, возможна картина все пробы зелёные, все пользователи красные; выровняйте URL проб с политикой bind из таблицы 2 прежде чем винить релиз.

Почему одних ноутбуков мало для долгоживущего control plane

Сон Docker Desktop, переключения VPN и локальные прокси меняют резолв localhost. Production-подобной автоматике нужны повторяемые политики listen, аудируемые ревизии compose и стабильные границы хоста. Импровизированные ноутбуки редко дают мультирегиональный egress с изоляцией bare metal, что конфликтует с ожиданием always-on Gateway.

Командам, которым нужен достижимый онколл-control plane, профессиональный облачный Mac обычно надёжнее личного железа. MACCOME предоставляет узлы Mac mini M4 / M4 Pro bare metal в Сингапуре, Японии, Корее, Гонконге, на восточном и западном побережье США. После сетевого триажа сопоставьте SSH и VNC с центром помощи, затем зафиксируйте условия на тарифах аренды и региональных страницах.

Пилотируйте на выделенном тестовом хосте, архивируйте логи, затем промотируйте в общий репозиторий compose — избегайте устных знаний только про network_mode.

Любой временный bind 0.0.0.0 требует документированного отката и ревью экспозиции; цель триажа — согласовать кто должен видеть control plane с дизайном пространств имён, а не максимизировать область прослушивания.

FAQ

Чем это отличается от production runbook по Docker?

Production — образы, тома и выкаты; здесь — достижимость. Используйте вместе центр помощи и production runbook.

Применима ли та же матрица в WSL2?

Тот же порядок шагов, иная модель форвардинга localhost — наложите статью по триажу WSL2.

Где читать про регионы и условия аренды?

Если Gateway переезжает на облачный Mac, сверьтесь с мультирегиональным гайдом и тарифами аренды Mac mini до фиксации SSH egress.