OpenClaw SSH-туннель 2026.05.19

OpenClaw 2026 удалённый Gateway: SSH-туннель, Health Check macOS и чек-лист LaunchAgent

Gateway OpenClaw уже работает на облачном Mac JEXCLOUD, но локальное приложение macOS застревает на «Health check pending» или сбое сопряжения gateway.remote? В 2026 году чаще всего обрывается цепочка локальное приложение ↔ SSH-туннель ↔ удалённый 127.0.0.1:18789, а не «Gateway не поднялся». Статья для разработчиков и SRE, которым нужно управлять удалённым Gateway с локального клиента OpenClaw: матрица SSH vs Direct WSS, чек-лист LaunchAgent, скрипты Health Check и таблица сопоставления (официальная документация onboarding OpenClaw).

После прочтения вы ответите на три вопроса: (1) SSH LocalForward или Direct wss:// для вашей сети; (2) как разделить OPENCLAW_GATEWAY_TOKEN между ai.openclaw.ssh-tunnel и ai.openclaw.gateway; (3) если openclaw health OK, а UI pending — порт, токен или процесс туннеля?

01 Архитектура удалённого Gateway OpenClaw: локальный macOS управляет облачным Mac

В 2026 году OpenClaw на macOS предлагает Local (Gateway и приложение на одной машине) и Remote (Gateway на другом Mac, доступ по SSH-туннелю или Direct WebSocket). В продакшене Gateway часто на bare metal Mac JEXCLOUD в 127.0.0.1:18789, ноутбук — «пульт». Дополняет выбор узла и launchd Token: там установка и узел, здесь подключение, поддержание и проверка.

На ревью эти пять болевых точек часто недооценивают:

  • Туннель не постоянный:сессия SSH обрывается, приложение показывает старый статус до таймаута Health Check.
  • Двойной токен:расхождение launchctl, ~/.openclaw и токена в приложении → ошибки pairing / device token.
  • Неверный порт или forward:порт 18789 занят или LocalForward неверен — CLI на удалённом OK, localhost на ноутбуке отказ.
  • UI отстаёт от CLI:Health CLI OK, UI macOS pending (openclaw#66306).
  • Поверхность атаки:Gateway на 0.0.0.0 без mTLS на публичном IP рискован; рекомендуется 127.0.0.1 + SSH/Tailscale.

Правило: «Gateway только на loopback, туннель для выхода, один токен — источник истины». Обход правила — часы отладки.

02 SSH-туннель или Direct WSS: матрица удалённого Gateway

В настройках OpenClaw, блок OpenClaw runs, transport — SSH tunnel или Direct (ws/wss). Нет универсального варианта — только подходящий под файрвол, Tailscale и практику ops.

SSH-туннель vs Direct WSS для удалённого Gateway (продакшен 2026)
Измерение SSH-туннель + LocalForward Direct WSS
Граница безопасности Gateway только на 127.0.0.1; исходящий трафик через SSH TLS-терминация и токен; часто Tailscale / внутренний DNS
Совместимость с файрволом Достаточно SSH (22 или свой порт) Порты wss и цепочка сертификатов; часто блокируется корпоративным прокси
Задержка и стабильность Лишний hop SSH, RTT 15–40 ms обычно приемлем; plist KeepAlive для самовосстановления На hop меньше при стабильном WSS reverse proxy
Операционная сложность Поддержка ~/.ssh/config + LaunchAgent туннеля Сертификаты, reverse proxy и ротация токенов
Рекомендуемый сценарий Один разработчик и узел JEXCLOUD; малая команда без SRE Команда с Tailscale Serve / единым API-шлюзом

При SSH-ключе из справочного центра и Gateway только на loopback: сначала SSH-туннель. Direct — если wss://gateway.example.ts.net стабилен и «Test remote» зелёный.

03 Подготовка облачного Mac: PATH, права токена и фрагменты SSH

На удалённом хосте OpenClaw CLI должен работать в неинтерактивной shell (pnpm link --global, symlink в /opt/homebrew/bin или /usr/local/bin). Файл токена: 600, владелец = пользователь Gateway.

~/.ssh/config (ноутбук)
Host jex-openclaw-sg
  HostName your-instance.jexcloud.com
  User macuser
  IdentityFile ~/.ssh/jexcloud_ed25519
  LocalForward 18789 127.0.0.1:18789
  ServerAliveInterval 30
  ServerAliveCountMax 3
~/Library/LaunchAgents/ai.openclaw.ssh-tunnel.plist (фрагмент)
<key>Label</key>
<string>ai.openclaw.ssh-tunnel</string>
<key>ProgramArguments</key>
<array>
  <string>/usr/bin/ssh</string>
  <string>-N</string>
  <string>jex-openclaw-sg</string>
</array>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>

Gateway через LaunchAgent ai.openclaw.gateway; OPENCLAW_GATEWAY_TOKEN через launchctl setenv или EnvironmentVariables в plist — не дублировать в shell profile и plist.

04 Сопряжение удалённого Gateway за шесть шагов: от Test remote до LaunchAgent

  1. CLI и Gateway на удалённом:на инстансе JEXCLOUD openclaw gateway install; lsof -i :18789 слушает только 127.0.0.1.
  2. Записать и проверить токен:сгенерировать, chmod 600; launchctl setenv OPENCLAW_GATEWAY_TOKEN '…', перезапуск агента Gateway.
  3. SSH на ноутбуке:добавить LocalForward 18789 в ~/.ssh/config, выполнить ssh -N jex-openclaw-sg, во втором терминале curl -s -o /dev/null -w '%{http_code}' -H "Authorization: Bearer $TOKEN" http://127.0.0.1:18789/health200.
  4. LaunchAgent туннеля:launchctl bootstrap gui/$UID ~/Library/LaunchAgents/ai.openclaw.ssh-tunnel.plist — туннель после входа автоматически.
  5. Клиент macOS:Настройки → OpenClaw runs → Remote + SSH tunnel, user@host или alias Host, Test remote до успеха.
  6. Патруль:скрипт Health с StartInterval (300 с) или CI SSH job; при сбое launchctl kickstart -k gui/$UID/ai.openclaw.ssh-tunnel и код выхода для on-call.

После сопряжения проверьте канал Agent в onboarding; при CLI OK и UI pending — таблица ниже, не переустанавливайте Gateway вслепую.

05 Скрипты Health Check и справочные данные

В продакшене проверяйте HTTP 200 скриптом, не только индикаторами UI. Для документов (практика сообщества и наблюдения JEXCLOUD 2026, не SLA):

  • Порт Gateway по умолчанию:18789(LocalForward должен совпадать; несколько инстансов — доп. порты по документации).
  • Endpoint Health:обычно /health с Bearer Token; мониторинг при ≠ 200 с ненулевым exit.
  • Самовосстановление туннеля:KeepAlive + ServerAliveInterval 30 → восстановление часто 30–90 с.
  • RTT APAC:Восточная Азия → узлы SG/JP/HK по SSH часто 15–35 ms; накладные расходы туннеля < 5 ms.
  • Права файла токена:всегда 600; неверный владелец — launchd может молча не загрузить.
health-patrol.sh
#!/bin/bash
TOKEN="${OPENCLAW_GATEWAY_TOKEN:?}"
CODE=$(curl -sf -o /dev/null -w '%{http_code}' \
  -H "Authorization: Bearer $TOKEN" http://127.0.0.1:18789/health)
[[ "$CODE" == "200" ]] || exit 1

06 FAQ, таблица pending и выбор JEXCLOUD

CLI в норме vs UI macOS pending
Симптом Сначала проверить Действие
CLI 200, UI pending Кэш приложения, transport, forward localhost Перезапуск приложения; Remote+SSH; повтор Test remote
pairing / token mismatch Двойной токен, файл device token Унифицировать plist и токен в приложении; документация remote gateway для сброса
Connection refused Процесс туннеля, занятый порт launchctl list | grep openclaw;проверить 18789
Частые обрывы туннеля Сон ноутбука, таймаут NAT ServerAlive; plist KeepAlive туннеля; не полагаться только на ручной ssh -N

Домашний интернет или нестабильный Wi‑Fi как вход туннеля 7×24 даёт «утром зелёный, днём красный» (NAT, сон). Gateway на shared VPS или перепроданной виртуализации — прерывистый Health; локальный Mac — обновления и Keychain. Командам нужны стабильное управление, аудируемые токены, самовосстанавливающийся туннель — Gateway на bare metal Mac JEXCLOUD в нескольких регионах с SSH loopback + LaunchAgent: выделенный Apple Silicon, ~120 с развёртывания, M4 Pro по необходимости. Тарифы: страница цен JEXCLOUD; графическая отладка: VNC.