Три рефлекса эксплуатации, которые нужно выработать до чтения:
-
Двойной зонд — не путайте I/O-пики со сбоем Gateway
curlна порт 18789 всегда сопровождатьlsofдля проверки владельца порта. Медленный Dashboard чаще сигнализирует о пике записи на диск, а не о сбое Gateway.curl + lsof
-
Поэтапное обновление, окно отката 30 мин
Зафиксировать версию → сначала «золотой узел» → затем продакшн. Восстанавливать tarball и старый plist одновременно; откат не должен превышать 30 минут.
≤ 30 мин
-
Логи отдельно от корневого тома
Директория логов и npm-кэш должны ротироваться независимо. Незаметно заполненный корневой диск — главная причина неожиданного завершения Gateway.
logrotate 7д
Эта статья отвечает на один вопрос
После того как скрипт установки OpenClaw завершился и Gateway 18789 впервые загорелся зелёным, команды нередко переходят в режим «работает — не трогай»: спорадические 401, один узел ведёт себя по-другому после обновления, или Gateway молча завершается из-за заполненного корневого диска. Всё это выходит за рамки руководства по установке.
Эта статья отвечает на один вопрос: как стандартизировать ежедневные операции OpenClaw в повторно используемый Runbook, которым любой член команды сможет воспользоваться для проверки работоспособности или отката за 15 минут? Охват: зонды работоспособности Gateway → стратегия поэтапного обновления → процедура отката → выбор Tailscale / SSH → планирование дискового пространства для логов.
1. Зонды работоспособности Gateway 18789
«Проверка работоспособности» во многих командах сводится к одному вызову curl — этого недостаточно. Если порт занят остаточным процессом или launchd не перезапустил сервис корректно, curl зависнет вместо немедленного отказа. Правильный зонд проверяет одновременно HTTP-ответ и владельца порта.
# 1. HTTP-liveness: ожидаем 200, при ошибке — предупреждение curl -fsS --max-time 3 http://127.0.0.1:18789/health \ && echo "gateway OK" || echo "GATEWAY FAIL" # 2. Проверка владельца порта: PID должен принадлежать node/openclaw lsof -nP -iTCP:18789 -sTCP:LISTEN # 3. Последние строки ошибок (скорректировать путь под установку) tail -n 50 ~/.openclaw/logs/gateway.log | grep -i "error\|warn\|exit"
Если curl возвращает 200, но Dashboard тормозит, сначала проверьте дисковый I/O: iostat -d 1 5. Путать пик записи логов со сбоем Gateway — самая частая ложная тревога. Держите выделенный «золотой узел» на той же версии, что и продакшн, чтобы сразу сравнивать при аномалиях.
lsof -iTCP:18789 возвращает PID не от OpenClaw, проверьте состояние сервиса через launchctl list | grep openclaw. Остаточный процесс старой установки нередко удерживает порт. Убить такой процесс без удаления старого plist приведёт к тому, что launchd перезапустит его при следующем входе в систему.
2. Три шага перед каждым обновлением
OpenClaw регулярно выпускает обновления. Слепое следование каждой версии создаёт два риска: изменения ключей конфигурации препятствуют запуску Gateway, или новая версия несовместима с существующей конфигурацией каналов. Поэтапные обновления — стандартный подход, но многие команды понимают «поэтапно» как «сначала попробовать на одной машине», пропуская фиксацию версии и проверку дискового пространства.
| Шаг | Выполнено Поэтапное обновление | Пропущено npm update напрямую |
|---|---|---|
| Фиксация версии (текущий тег) | Откат через npm install openclaw@старый-тег |
Старая версия неизвестна; только восстановление из tarball |
| «Золотой узел» первым | Инцидент изолирован на тестовом узле, продакшн не затронут | Все каналы падают одновременно |
| Корневой диск ≥ 15 % свободно | Временные файлы npm install имеют достаточно места | Установка прерывается на полпути; несогласованное состояние |
# Записать текущую версию
npm list -g openclaw --depth=0 > .upgrade-memo
# Архивировать конфигурацию
tar czf openclaw-config-$(date +%Y%m%d).tar.gz \
~/.openclaw/config/ \
~/Library/LaunchAgents/com.openclaw.gateway.plist
# Проверить свободное место ≥ 15 %
df -h / | awk 'NR==2 {print "Свободно:"$4, "Использовано:"$5}'
3. Откат: двухэтапное восстановление tarball + plist
Самая частая причина неудачного отката — не версия бинарного файла, а несовместимость ключей конфигурации. Новая версия могла добавить обязательные поля; откат бинарного файла при оставшейся новой конфигурации вызовет ошибку запуска Gateway. Правильный порядок: bootout → восстановить tarball → откатить бинарный файл → bootstrap.
# Шаг 1: остановить сервис launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.openclaw.gateway.plist # Шаг 2: восстановить tarball конфигурации tar xzf openclaw-config-20260604.tar.gz -C / # Шаг 3: откатить npm-пакет npm install -g openclaw@1.x.x # заменить на зафиксированный тег версии # Шаг 4: перезапустить сервис launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.openclaw.gateway.plist # Шаг 5: проверка (~10 с на запуск) sleep 10 && curl -fsS http://127.0.0.1:18789/health && echo "Откат OK"
Следите за смещением пути plist: если установщик новой версии перезаписал ProgramArguments, bootout нужно выполнить с новым путём plist, а bootstrap — с восстановленным старым. Эти пути могут различаться — именно поэтому diff старого и нового plist перед обновлением должен входить в Runbook.
4. Tailscale против SSH/rsync: что когда использовать
Вечный командный спор «Tailscale или прямой SSH?» — ложная дилемма. Каждый инструмент оптимален в своём сценарии. Tailscale незаменим для многоустройственного и межрегионального постоянного доступа без правил брандмауэра. SSH/rsync — правильный выбор для массовых передач, где узким местом является исходящая полоса пропускания, а не накладные расходы протокола.
| Критерий | Tailscale WireGuard-меш | SSH / rsync Прямая зашифрованная передача |
|---|---|---|
| Лучший сценарий | Dashboard с любого устройства, многопользовательский удалённый доступ, VPN-плоскость управления | Загрузка артефактов CI, архивов логов, плановая синхронизация TB-масштаба |
| Задержка | DERP-ретранслятор +~50 мс Азия↔Канада; прямое соединение близко к чистому RTT | Чистый TCP, минимальные накладные расходы; требуется открытый порт или jump-хост |
| Пропускная способность | ~+5 % накладные расходы протокола; подходит для постоянных низкопоточных сессий | Используйте --bwlimit, чтобы не насыщать исходящий канал Канады |
| Контроль доступа | ACL Tailscale по устройству/пользователю | SSH-ключи; authorized_keys требует периодического аудита |
| Диагностика | Правила ACL, DERP-узел, разрешение MagicDNS | Маршрутизация, MTU, тайм-аут и возобновление |
# Получить архивы логов с канадского узла, лимит 50 МБ/с, возобновление rsync -avz --bwlimit=50000 --partial \ user@canada-m4.hashvps.com:~/.openclaw/logs/archive/ \ ./local-logs/ # Убедиться, что Tailscale использует прямое соединение (не DERP-ретранслятор) tailscale ping canada-m4 --until-direct
5. Планирование дискового пространства: конфигурация logrotate и советы по разделам
Удивительно большая доля неожиданных завершений Gateway объясняется переполненным корневым диском. По умолчанию OpenClaw пишет логи в домашнюю директорию пользователя — тот же том, что и глобальный npm-кэш. Добавьте экспорты Xcode или временные файлы CI, и 512 ГБ диск может молча заполниться за несколько недель. Правильное решение — logrotate, а не периодический rm.
/Users/mac/.openclaw/logs/*.log {
daily
rotate 7
compress
missingok
notifempty
dateext
copytruncate
}
# Добавить в crontab (ежедневно в 03:00):
# crontab -e, затем добавить:
# 0 3 * * * /usr/local/bin/logrotate /Users/mac/.openclaw/logrotate.conf
Для npm-кэша: npm config set cache-max 10240 ограничивает его 10 ГБ; после каждого обновления выполняйте npm cache clean --force. На узле 1 ТБ рекомендуется перенести ~/.openclaw/logs и npm-кэш на отдельный том — при резком росте логов это не повлияет ни на корневой диск, ни на процесс Gateway.
6. FAQ: шесть частых вопросов об эксплуатации
Проверка работоспособности Gateway 18789 возвращает не 200 — где смотреть в первую очередь?
Выполните lsof -nP -iTCP:18789 -sTCP:LISTEN, чтобы проверить, слушает ли что-то порт. Нет вывода — процесс не запущен: проверьте launchd через launchctl list | grep openclaw, затем последние 50 строк ~/.openclaw/logs/gateway.log. Порт слушает, но HTTP возвращает 500 — вероятно, ошибка ключа конфигурации: сравните с tarball до обновления.
После отката нужно ли вручную исправлять путь plist?
Только если установщик новой версии изменил ProgramArguments. При чистом обновлении npm-пакета без изменений установщика восстановление tarball оставит plist нетронутым. Если путь к бинарному файлу изменился, перед bootstrap обновите ProgramArguments в plist, указав старый путь к бинарному файлу — именно поэтому diff старого и нового plist перед обновлением входит в Runbook.
Обновлять несколько узлов одновременно или по одному?
Всегда по одному. Сначала обновить «золотой узел»; наблюдать за работоспособностью Gateway и SLA каналов в течение 24 часов. Затем развёртывать продакшн-узлы с интервалом не менее 30 минут. Одновременное обновление означает: при возникновении проблемы нет эталона для сравнения, и все узлы падают вместе.
Dashboard показывает 100 % CPU — это баг OpenClaw?
Не обязательно. Используйте top -o cpu или Activity Monitor, чтобы найти реально потребляющий PID. Здоровый процесс Gateway OpenClaw в штатном режиме должен потреблять 1–5 % CPU. Если пикирует процесс node, проверьте накопленные запросы каналов или аномальную запись логов. На выделенном Mac mini используйте renice, чтобы снизить приоритет процессов сборки Xcode и устранить конкуренцию с OpenClaw.
Tailscale подключён, но Dashboard недоступен — почему?
Проверьте в политике ACL Tailscale, что порт 18789 разрешён для данного устройства. Затем получите tailnet IP через tailscale ip -4 и протестируйте напрямую: curl http://<tailnet-ip>:18789/health. Если IP работает, а имя хоста MagicDNS нет — это проблема разрешения DNS, а не проблема Gateway.
После выполнения logrotate Gateway продолжает писать в правильный файл?
При использовании copytruncate logrotate копирует файл и усекает оригинал на месте — файловый дескриптор Gateway остаётся действительным. При стандартном режиме create нужно отправить Gateway сигнал SIGHUP или выполнить launchctl kickstart через скрипт postrotate, чтобы переоткрыть дескриптор лога. copytruncate проще и не прерывает сервис.
Runbook надёжен ровно настолько, насколько надёжно железо под ним
Окно отката 30 минут и предположение «Gateway на 1–5 % CPU» работают только на выделенном железе. На перегруженных виртуальных машинах тот же зонд curl 18789 сегодня возвращает 200, а завтра вызывает тайм-аут. Экземпляры Mac mini M4 Hashvps в Канаде — это bare-metal-узлы без oversubscription: launchd, SSH и npm-кэш ведут себя идентично локальному Mac, поэтому Runbook, протестированный на ноутбуке, работает так же в продакшне. Потребление Apple Silicon 4 Вт в режиме ожидания обеспечивает работу 24/7 без шума вентиляторов и неожиданного теплового замедления. Gatekeeper + SIP + FileVault защищают токены Gateway и конфигурации каналов без дополнительной работы с группами безопасности.
Если вы хотите развернуть этот Runbook на предсказуемом узле, поддающемся аудиту всей командой, облачный Mac mini M4 Hashvps — наиболее прямой старт — смотреть тарифы и превратить эксплуатацию OpenClaw из «работает как-то» в производственный SLA.