В экосистеме self-hosted шлюзов 2026 года одни и те же промахи всплывают в постмортемах: процесс слушает не тот адрес привязки (например 0.0.0.0 без ACL), долгоживущий токен утекает в историю shell или в артефакты CI, а политика обновлений сводится к «всегда latest» и ломает совместимость Node/MCP между перезагрузками. Этот текст — не манифест, а короткая карта рисков и дальше — конкретные шаги: окружение, bind, патруль, launchd, логи и FAQ.
| Тема | Рациональный выбор | Где больно |
|---|---|---|
| Адрес bind | 127.0.0.1 + контролируемый вход (SSH/VPN/прокси) |
Сканирование и брутфорс по публичным портам |
| Токен | Файл 600, подстановка через plist |
Shared-логины, утечки в логах пайплайна |
| Обновления | Закреплённый semver, окно обслуживания | Ночной авто-апгрейд ломает рабочие каталоги навыков |
Для пользователей MacPull это не абстракция: предзагрузка Git-репозиториев, кешей npm/Homebrew/CocoaPods и сопутствующих артефактов на выделенном узле имеет смысл только если gateway стабильно отвечает на вашем сценарии аутентификации. Патруль и понятные логи сокращают время, когда CI «стучится в регистры вслепую», пока шлюз перезапускается после очередного эксперимента с plist.
Предварительные условия и переменные окружения
Зафиксируйте среду до того, как завести демон. Для стека OpenClaw в 2026 году на практике стандартизируют Node 22+ (проверьте node -v и npm -v под той же учётной записью, от которой будет работать LaunchAgent). Установите CLI по документации вашей ветки и заведите отдельного пользователя macOS для шлюза, чтобы права на каталоги логов и workspace не пересекались с интерактивным админом.
Вынесите секреты в файл, например ~/.openclaw/gateway.env, с правами chmod 600. Минимальный набор имён (уточните по своей сборке): OPENCLAW_GATEWAY_TOKEN, при необходимости хост и порт шлюза, а также HTTPS_PROXY / NO_PROXY, если патруль и сам процесс ходят в корпоративный прокси — иначе health check будет «дрожать» при смене маршрута, хотя процесс жив.
Мини-чеклист окружения
- Версия Node зафиксирована (
.node-versionили default в nvm для сервисной УЗ) - Каталог логов создан заранее, например
~/Library/Logs/OpenClaw/ - Путь health-endpoint записан в runbook (часто
/healthили/v1/status) - Токен не фигурирует в репозитории и в выводе шагов CI
Запуск шлюза и стратегия привязки (bind)
Сначала поднимите шлюз вручную в одной сессии: убедитесь, что порт свободен (lsof -nP -iTCP:ПОРТ), выполните документированную команду запуска OpenClaw gateway и проверьте запрос с заголовком Authorization: Bearer …. Полезно один раз убедиться, что без заголовка приходит ожидаемый отказ (401/403) — так вы отделяете проблемы сети от проблем аутентификации.
Для сценария «тот же Mac, что и CI-runner»: завяжите тяжёлые задания предзагрузки (git/npm/registry) на успешный внешний health check или на exit-код патруля. Пока gateway недоступен, не имеет смысла гонять обходные скрипты подтягивания — вы только множите таймауты у регистров. Именно здесь пользователям MacPull чаще всего нужен предсказуемый узел Apple Silicon с постоянным SSH и диском под кеши: меньше сюрпризов, чем на перегруженном мультитенанте.
- Остановите «зависшие» процессы на том же порту (старые node после экспериментов).
- Экспортируйте те же переменные, что потом пойдут в plist.
- Запустите шлюз, зафиксируйте пути stdout/stderr для переноса в LaunchAgent.
- Проверьте один успешный и один намеренно неавторизованный HTTP-запрос.
- Запишите semver и время в внутренний changelog перед включением cron/CI.
Шаблон скрипта проверки здоровья, LaunchAgent и логи
Пользовательский LaunchAgent кладите в ~/Library/LaunchAgents/. В plist укажите WorkingDirectory, ProgramArguments, StandardOutPath и StandardErrorPath (например под ~/Library/Logs/OpenClaw/), RunAtLoad и пару KeepAlive + ThrottleInterval (например 30 с), чтобы при падении не крутить tight loop. На современных macOS загрузка обычно через launchctl bootstrap gui/$UID …; на старых заметках ещё встречается launchctl load.
Отдельный скрипт патруля (по cron на хосте или шагу CI с SSH) должен вызывать curl к health-endpoint с Bearer-токеном, проверять HTTP-код и при наличии — простое поле в JSON. Ненулевой exit-код пусть триггерит алерт раньше, чем в очередь встанут задания предзагрузки.
#!/bin/bash
set -euo pipefail
# Шаблон патруля — задайте HOST, PORT, TOKEN, HEALTH_PATH под вашу среду
HOST="${OPENCLAW_GATEWAY_HOST:-127.0.0.1}"
PORT="${OPENCLAW_GATEWAY_PORT:-18789}"
TOKEN="${OPENCLAW_GATEWAY_TOKEN:?укажите токен}"
HEALTH_PATH="${OPENCLAW_HEALTH_PATH:-/health}"
CODE=$(curl -s -o /tmp/oc_health.json -w "%{http_code}" \
-H "Authorization: Bearer ${TOKEN}" \
"http://${HOST}:${PORT}${HEALTH_PATH}")
test "$CODE" = "200" || { echo "health HTTP $CODE"; exit 1; }
if grep -q '"ok"' /tmp/oc_health.json 2>/dev/null; then
grep -q '"ok":true' /tmp/oc_health.json || exit 1
fi
exit 0
Если тело ответа не JSON, уберите блок с grep и оставьте проверку кода 200 и при желании порога времени curl. После сбоя смотрите в первую очередь StandardErrorPath агента, затем — отдельный access-log шлюза, если вы его включили. Нехватка места на томе с логами иногда выглядит как «мистические» перезапуски: проверьте df -h на каталоге с логами.
Частые ошибки: компактный FAQ
Другой экземпляр node или дубликат plist держит порт. Выполните lsof -i :ПОРТ, выгрузите лишний агент, уберите «осиротевшие» PID, затем загрузите plist снова — один раз, без гонок.
Сравните curl -v из-под пользователя раннера и из админской сессии: часто расходятся DNS, прокси или NO_PROXY для частных подсетей.
Проверьте владельца файлов после копирования plist с другой машины и ограничения macOS Privacy; выдавайте Full Disk Access только если это действительно необходимо.
Минимальный порядок разбора (копируйте в runbook)
- Патруль красный → открыть stderr LaunchAgent.
- Сверить порт и целевой URL с ручным
curl. - Перечитать токен (без кавычек и лишнего перевода строки).
openclaw doctor/ статус по документации после обновления.- Только после зелёного патруля — снова включать предзагрузку в CI.
Итоги и оформление узла
Надёжный OpenClaw на удалённом Mac — это в первую очередь скучная эксплуатация: осознанный bind, аккуратные токены, дисциплина обновлений, прозрачный LaunchAgent и health check, который падает быстрее, чем ваши пайплайны. Когда патруль зелёный, имеет смысл снова включать обходную автоматизацию предзагрузки зависимостей и CI-sidecar — так вы экономите время на Apple Silicon, не списывая его на сетевые таймауты из-за «тихо» лежащего шлюза.
Ознакомиться с тарифами и оформить аренду можно без входа в аккаунт: цены, покупка / аренда, центр помощи; обзор материалов — в блоге и на главной.
Стабильный gateway и предзагрузка
Страницы блога, главная, помощь и оформление аренды доступны без логина.