2026 OpenClaw Docker Compose: подключение и сопоставление — 1006 и 1008, один источник токена, Unix‑сокеты и общие сетевые пространства имён

≈ 20 мин · MACCOME

Аудитория: команды, где Gateway и CLI openclaw в разных сервисах Compose, в логах Gateway «зелёный», а CLI получает gateway closed (WebSocket 1006/1008), pairing required или два независимых токена (env и файл). Тезис: зафиксировать семантику URL (TCP по DNS сервиса или общий Unix‑сокет), свести OPENCLAW_GATEWAY_TOKEN и gateway.auth.* к единому источнику правды, при необходимости сузить вызов через общее сетевое пространство имён. Отличие от апрельской статьи 1008 + trustedProxies: там крупные CIDR; здесь — как контейнер адресует Gateway и читает токен. Дополнительно: сеть Docker, сопоставление токенов, тома.

Пять «сетевых» корней при разрезанном Compose

  1. Зашитый 127.0.0.1: loopback — только текущий контейнер; используйте DNS Compose, напр. http://openclaw-gateway:18789.
  2. Два источника токена: OPENCLAW_GATEWAY_TOKEN может перекрыть файл — похоже на чередование 401/1008.
  3. Unix‑сокет не смонтирован одинаково: при gateway.sock один путь на хосте и согласованные UID/GID.
  4. 1006 за «дрожащий» WebSocket: чаще аномальное закрытие (рестарт, таймаут, прокси) — сначала рестарты Gateway.
  5. Нужна эквивалентность loopback без архитектуры: либо network_mode: service:<gateway>, либо везде DNS TCP — не смешивать в одном тикете.

Пока пять пунктов не закрыты, смена тега образа редко лечит контракт namespace/токена.

Сопоставьте метки времени stderr Gateway, stdout CLI и docker events — «случайные» обрывы часто совпадают с рестартами или агрессивными healthcheck.

СимптомДальше смотретьОбычно
1006 + новый PID / OOMлоги хоста/ядра → лимиты рестартов → таймаутыобрыв транспорта только политика pairing
1008 + pairingистина токена → URL Gateway → состояние на дискедвойной mount / недоступные каталоги
Connection refused только в CLIзонд внутри того же контейнераошибка loopback / неопубликованный порт
Сокет ENOENT / доступls -la томов и родительские каталогисокет не виден дочернему namespace
warning

Сами по себе коды закрытия мало значат: связывайте 1006/1008 с логами Gateway, машиной состояний pairing и ретраями reverse proxy.

Шесть шагов — сначала достижимость, потом праздник pairing

  1. Один канал токена (файл или env), проверенный через docker compose config.
  2. Заморозить семантику URL: везде TCP по DNS или везде один общий Unix‑socket bind.
  3. Идентичный .openclaw: одно дерево записи (чеклист томов).
  4. openclaw gateway status и doctor: выровнять метки времени хоста и контейнера.
  5. Эквивалентность loopback действительно нужна: зафиксировать network_mode: service:<gateway>, согласованно с trustedProxies.
  6. Пакет доказательств: успех в CLI‑namespace + короткий хэш URL/токена — не закрывайте тикет одним curl с ноутбука.

Перед Gateway стоит Nginx/Caddy — согласуйте Upgrade/idle с URL Compose (обратный прокси), иначе 1006 перепутаете с авторизацией.

yaml
# Подставьте имена/тома, затем docker compose config
services:
  openclaw-gateway:
    environment:
      - OPENCLAW_CONFIG_DIR=/data/.openclaw
      - OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN}
    volumes:
      - oc-data:/data/.openclaw
    networks: [oc-net]

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

networks:
  oc-net:
    driver: bridge

volumes:
  oc-data:

Инженерные факты для запроса на изменение

  • Зонд только в упавшем namespace — иначе «Зелёный на ноутбуке, красный в CI».
  • Короткие отпечатки по файлу и env до релизного тега.
  • Частые liveness усиливают 1006 раньше, чем поможет смена auth.
  • Команда вне проблемного образа — это обсуждение, не RCA.

Почему «одноразовые» контейнеры на ноутбуке редко тянут цепочку продакшена

Продакшену нужны предсказуемые рестарты, базовая линия диска и аудируемая история pairing. На выделенном удалённом Mac в шести регионах и с понятным биллингом месяц/квартал это лучше сочетается с ротацией секретов CI. См. цены аренды Mac mini и центр помощи, затем отразите переменные из этого runbook.

Итог: сначала контракт

Большинство сбоев Compose — namespace + токен + каталог состояния, описанные в трёх разных документах. Без повторяемого рукопожатия WebSocket внутри контейнера не «меняйте образ» и не «отключайте TLS». Далее — GHCR и Control UI и жёсткие прокси.

FAQ

Пересечение с апрельской статьёй trustedProxies?

Там CIDR и субтрафик; здесь URL, сокеты, namespaces, один токен — читайте обе.

curl на хосте означает успех CI?

Нет. Повторите проверку в том же образе контейнера.