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.
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.
Туннель хватает, lan насильно: SSH local forward закрывает задачу; смена bind только расширяет attack surface и plist drift.
lan без token: gateway.bind=lan в config, но gateway.auth.mode пуст или token отсутствует — мгновенный exit.
Token только в shell: интерактивный export OPENCLAW_GATEWAY_TOKEN OK, job LaunchAgent без переменной — цикл restart launchd.
URL зонда ≠ listen: после lan curl на 127.0.0.1 или healthz без Authorization — ложный offline.
18789 в интернет без app-auth: security group 0.0.0.0/0, нет token и controlUi.allowedOrigins — шум сканеров в логах.
Без завершённого install-daemon сначала пройдите официальный daemon и чеклист установки, пока loopback не ready в openclaw gateway status --deep — иначе метаданные supervisor и стратегия bind смешаются в одном тикете.
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/.env | OPENCLAW_GATEWAY_TOKEN=<hex>, chmod 600 | Git, sync, скриншоты | WorkingDirectory = CLI |
| openclaw.json | gateway.bind: "lan", gateway.auth.mode: "token" | plaintext gateway.auth.token + .env | restart после bind |
| gateway.reload.mode | hybrid для мягкой config | bind только SIGHUP | версия после restart |
| controlUi.allowedOrigins | whitelist Origin для remote browser | * в prod | тест с token |
| plist EnvironmentVariables | PATH, OPENCLAW_STATE_DIR; без plaintext token | конфликт shell profile | launchctl print vs deep status |
Секрет в .env, политика в openclaw.json, supervisor читает тот же каталог — меньше развилок, меньше класса 401.
При нескольких remote-клиентах выровняйте WS URL и token в профилях — см. разделение remote Gateway. bind lan только расширяет listen-адрес, не заменяет Bearer и Origin policy на клиенте.
Шесть шагов: stop, .env, bind lan, LaunchAgent, healthz, auth клиента
Шаги предполагают launchd Gateway в loopback на облачном Mac KVMNODE. Перед change window сохраните openclaw.json, label plist и вывод openclaw --version — согласовано с rollback в круглосуточной стабильности. Всё на хосте Gateway, не правьте config на ноутбуке в ожидании удалённого узла.
Остановить старые процессы: openclaw gateway stop, lsof -i :18789 без debug — избежать EADDRINUSE.
Записать .env: случайный token в ~/.openclaw/.env, chmod 600; не echo в общие логи.
bind и auth.mode: openclaw config set gateway.bind lan, gateway.auth.mode token, опционально gateway.reload.mode hybrid.
Обновить LaunchAgent: openclaw gateway install --force, затем gateway restart; plist vs which openclaw.
healthz: Authorization: Bearer на /healthz, не только голый curl 200.
Клиент с token: remote CLI или Control UI с тем же Bearer; режим bind и rotation в тикете.
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.
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 status | lsof = config |
| gateway.auth.mode | нет | restart; rotate .env при необходимости | healthz Bearer 200 |
| channels / routing | обычно да | config + hybrid или reload | channels 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.
Развилки ошибок, 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.
Порт по умолчанию: healthchecks часто на 18789; lan экспонирует тот же порт внутри — firewall минимально.
healthz: Bearer обязателен в prod; голый 200 не доказывает auth.
граница 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.
| SKU | lan + 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 обычно оптимальна: шесть регионов, выделенный хост, аренда от дня до месяца. Тарифы: цены, помощь: центр помощи, заказ: оформить.