Разработчикам, у которых OpenClaw Gateway уже работает на выделенном облачном Mac KVMNODE в режиме loopback и нужен bind на не-loopback (Control UI, remote-клиенты, intranet-зонды на порту 18789), в 2026 году мешают три типовых узких места: gateway.bind=lan без валидной auth блокирует старт, OPENCLAW_GATEWAY_TOKEN существует только в интерактивной shell, а LaunchAgent его не видит, и после правки config считают, что hybrid reload заменяет полный restart при смене bind. Ниже — дерево loopback vs lan, таблица единого источника для .env и openclaw.json, шесть шагов с блоком команд, граница gateway.reload.mode=hybrid vs ручной restart плюс gateway.controlUi.allowedOrigins, развилки refusing to bind without auth, EADDRINUSE и unauthorized; ссылки на launchd token, апгрейд и удалённый доступ, remote Gateway, диагностическую лестницу и install-daemon.
01

loopback или lan: решение по bind OpenClaw Gateway на облачном Mac 2026

OpenClaw Gateway по умолчанию слушает loopback — подходит, когда инженер по SSH открывает dashboard на самом облачном Mac или когда только CLI и launchd общаются с демоном. Как только Control UI на втором ноутбуке, несколько remote-клиентов или intranet-зонды в том же VPC должны достигать 18789 без SSH-туннеля, gateway.bind переводят с loopback на lan. Сборки OpenClaw 2026 ужесточают guard: выход с 127.0.0.1 без валидного gateway.auth.token или инжектированного OPENCLAW_GATEWAY_TOKEN — процесс не стартует, в логах refusing to bind without auth. Это не баг, а принуждение документировать расширение listen-поверхности и prod-auth в одном change ticket.

Не решайте только по ping: один оператор должен держать loopback плюс ssh -L или Tailnet (см. статью про туннели); lan + token оправдан, когда фиксированные RFC1918-сегменты ходят напрямую или Control UI открывает WebSocket через подсети. Пять пунктов ниже — типовые ошибки triage до смены routing модели или переустановки channels.

01

Туннель хватает, lan насильно: SSH local forward закрывает задачу; смена bind только расширяет attack surface и plist drift.

02

lan без token: gateway.bind=lan в config, но gateway.auth.mode пуст или token отсутствует — мгновенный exit.

03

Token только в shell: интерактивный export OPENCLAW_GATEWAY_TOKEN OK, job LaunchAgent без переменной — цикл restart launchd.

04

URL зонда ≠ listen: после lan curl на 127.0.0.1 или healthz без Authorization — ложный offline.

05

18789 в интернет без app-auth: security group 0.0.0.0/0, нет token и controlUi.allowedOrigins — шум сканеров в логах.

Без завершённого install-daemon сначала пройдите официальный daemon и чеклист установки, пока loopback не ready в openclaw gateway status --deep — иначе метаданные supervisor и стратегия bind смешаются в одном тикете.

02

Token в .env и openclaw.json: единый источник в prod

В prod секрет не должен дублироваться открытым текстом в openclaw.json, plist, чатах и CI-логах. OpenClaw 2026 рекомендует держать gateway token в ~/.openclaw/.env (или пути, видимом launchd) как OPENCLAW_GATEWAY_TOKEN; openclaw.json объявляет только gateway.bind, gateway.auth.mode, gateway.reload.mode и gateway.controlUi.allowedOrigins. EnvironmentVariables plist указывают на тот же state dir через OPENCLAW_STATE_DIR, чтобы CI-user и login home не читали две разные .env — та же развилка, что в статье launchd token, здесь для lan.

Не смешивайте устаревший ключ gateway.token с gateway.auth.token: после апгрейда schema молча игнорирует старые ключи, dashboard крутит unauthorized. Миграция: перенос структурных полей, новый token на целевом облачном Mac в .env — не копировать исторические plaintext.

Поле / файлРекомендацияЗапретПроверка LaunchAgent
~/.openclaw/.envOPENCLAW_GATEWAY_TOKEN=<hex>, chmod 600Git, sync, скриншотыWorkingDirectory = CLI
openclaw.jsongateway.bind: "lan", gateway.auth.mode: "token"plaintext gateway.auth.token + .envrestart после bind
gateway.reload.modehybrid для мягкой configbind только SIGHUPверсия после restart
controlUi.allowedOriginswhitelist Origin для remote browser* в prodтест с token
plist EnvironmentVariablesPATH, OPENCLAW_STATE_DIR; без plaintext tokenконфликт shell profilelaunchctl print vs deep status

Секрет в .env, политика в openclaw.json, supervisor читает тот же каталог — меньше развилок, меньше класса 401.

При нескольких remote-клиентах выровняйте WS URL и token в профилях — см. разделение remote Gateway. bind lan только расширяет listen-адрес, не заменяет Bearer и Origin policy на клиенте.

03

Шесть шагов: stop, .env, bind lan, LaunchAgent, healthz, auth клиента

Шаги предполагают launchd Gateway в loopback на облачном Mac KVMNODE. Перед change window сохраните openclaw.json, label plist и вывод openclaw --version — согласовано с rollback в круглосуточной стабильности. Всё на хосте Gateway, не правьте config на ноутбуке в ожидании удалённого узла.

01

Остановить старые процессы: openclaw gateway stop, lsof -i :18789 без debug — избежать EADDRINUSE.

02

Записать .env: случайный token в ~/.openclaw/.env, chmod 600; не echo в общие логи.

03

bind и auth.mode: openclaw config set gateway.bind lan, gateway.auth.mode token, опционально gateway.reload.mode hybrid.

04

Обновить LaunchAgent: openclaw gateway install --force, затем gateway restart; plist vs which openclaw.

05

healthz: Authorization: Bearer на /healthz, не только голый curl 200.

06

Клиент с token: remote CLI или Control UI с тем же Bearer; режим bind и rotation в тикете.

bash
export PATH="/opt/homebrew/bin:/usr/local/bin:$PATH"
openclaw gateway stop 2>/dev/null || true
lsof -i :18789
TOKEN=$(openssl rand -hex 32)
echo "OPENCLAW_GATEWAY_TOKEN=${TOKEN}" > ~/.openclaw/.env
chmod 600 ~/.openclaw/.env
openclaw config set gateway.bind lan
openclaw config set gateway.auth.mode token
openclaw config set gateway.reload.mode hybrid
openclaw gateway install --force
openclaw gateway restart
curl -sS -o /dev/null -w "%{http_code}\n" \
  -H "Authorization: Bearer ${TOKEN}" \
  http://127.0.0.1:18789/healthz
openclaw gateway status --deep

Шаг шесть — минимум два пути: openclaw channels probe если настроено, плюс remote profile со второй машины — host в WS URL должен быть intranet облачного Mac, не 127.0.0.1. Remote 401 при локальном green — кэш loopback token или нет Authorization header. split brain после force — сначала выравнивание CLI.

04

Hybrid reload vs gateway restart: какие поля требуют перезапуска

gateway.reload.mode=hybrid даёт hot-reload для routing channels, мягких agent rules и интервалов зондов без долгого обрыва WS — удобно при частых правках Skills днём. Bind-адрес, порт, auth.mode и TLS hard fields требуют полного restart supervisor; SIGHUP после смены bind даёт split view: CLI читает новый config, процесс слушает старый адрес. Таблица идёт в runbook рядом с лестницей L2 Runtime running · probe failed.

Изменениеhybrid достаточно?ДействиеСигнал
gateway.bind / портнетgateway restart + deep statuslsof = config
gateway.auth.modeнетrestart; rotate .env при необходимостиhealthz Bearer 200
channels / routingобычно даconfig + hybrid или reloadchannels probe green
upstream keys моделиобычно даhot или короткий restartтест ≠ 401
controlUi.allowedOriginsзависит от версии; prod: restartмассив + очистка cache браузеранет CORS remote

Remote Control UI требует явных Origins в gateway.controlUi.allowedOrigins помимо token. Открытие с https://ops.example.com на 18789 требует этого Origin в whitelist — иначе WebSocket или CORS при валидном Bearer. lan, allowedOrigins и token — три независимые переменные.

Проверяйте дрейф LaunchAgent после каждого bind или force: gateway status --deep, launchctl print для EnvironmentVariables, openclaw doctor. Неразрешённый drift + hybrid продлевает coexistence старого процесса и нового файла — cron-зонды мигают. Probes из cron health должны читать ту же .env и при bind=lan использовать intranet IP.

05

Развилки ошибок, M4 vs M4 Pro и постоянный облачный Mac

refusing to bind without auth: lan без token — таблица §2, не переустанавливать OpenClaw.EADDRINUSE: 18789 занят, lsof owner перед force.unauthorized: расхождение Bearer или launchd без .env — launchd token.probe failed, Runtime running: URL зонда, bind и Authorization не выровнены — лестница L2.

A

Порт по умолчанию: healthchecks часто на 18789; lan экспонирует тот же порт внутри — firewall минимально.

B

healthz: Bearer обязателен в prod; голый 200 не доказывает auth.

C

граница hybrid: после bind/auth всегда deep status; hybrid только для channels.

Triage: doctor → deep status → .env и plist → healthz с token → Origin клиента. Закрытый ноутбук убивает lan listen и remote sessions; NAS без паритета launchd. Выделенный облачный Mac KVMNODE объединяет bind, rotation token, hybrid и cron в одном auditable runbook.

SKUlan + multi-client + CIВывод
Mac Mini M4 16GBодин gateway, мало remote-клиентовprod default; учитывать xcodebuild
M4 Pro 24GB+iOS CI + Skills + lan-зондыпри jitter 18789 в пиковые недели
Закрытый ноутбукlan не даёт 7×24только эксперимент

WeChat ClawBot, multi-client remote и nightly CI на одном хосте могут давить 16GB unified memory — медленные ответы без auth failure; см. изоляцию same-pool или M4 Pro. Для auditable non-loopback bind с .env secrets и приёмкой LaunchAgent аренда Mac Mini KVMNODE обычно оптимальна: шесть регионов, выделенный хост, аренда от дня до месяца. Тарифы: цены, помощь: центр помощи, заказ: оформить.