Шлюз OpenClaw на macOS должен переживать перезагрузки через launchd, но быстрые обновления канала 2026.x иногда оставляют тихий сбой: бинарник обновился, LaunchAgent не перезагрузился, и все мосты сообщений перестают отвечать. Этот плейбук сопоставляет симптомы с исправлениями, сравнивает тактики восстановления в матрице и перечисляет девять воспроизводимых шагов по SSH на NodeMac Mac mini M4 без угадывания путей.
Сочетайте с операционным runbook OpenClaw по расположению логов и политике обновлений и с первичной установкой macOS, если собираете с нуля.
Признаки дрейфа LaunchAgent — не просто «ИИ лежит»
- Процесса нет, диалога о падении нет: в
psнет воркера шлюза при простаивающем CPU — типичный выгруженный агент. - HTTP 401 от всех провайдеров после reboot: ключи в dotenv есть, но демон унаследовал пустое окружение, потому что plist не содержал нужных переменных.
- Ручной запуск CLI работает, автозапуск нет: операторы успешно стартуют шлюз в терминале; после выхода сервис останавливается, потому что LaunchAgent указывает на устаревший рабочий каталог или имя entry из старой структуры.
Матрица вариантов восстановления
| Тактика | Простой | Когда применять |
|---|---|---|
launchctl kickstart -k |
5–15 с | Агент загружен, процесс завис; самый быстрый первый шаг |
| Unload + load plist | 20–40 с | После правок ProgramArguments или WorkingDirectory |
openclaw gateway install --force |
1–3 мин | CLI вендора может переписать plist; сверить diff до reboot |
| Откат пакета + бэкап plist | 5–10 мин | Регрессия блокирует прод; восстановить архив последней стабильной версии |
Переменные окружения: где они должны жить у демонов
Интерактивные оболочки читают .zshrc; LaunchAgents — нет. Если ключи провайдера только в файле, который plist не подхватывает, шлюз поднимается без аутентификации и сыплет непонятными 401.
- Перечислить обязательные ключи (API-токены, опциональные proxy URL) в фрагменте runbook для вставки после ротации.
- Дублировать в
EnvironmentVariablesplist или использовать поддерживаемую обёртку с явной загрузкой dotenv при старте — одна стратегия на машину, не обе наполовину. - Тест перезагрузки: планировать ежеквартально; ловить пропущенные переменные в течение 24 часов после смены учётных данных.
- Ограничить права plist пользователем сервиса; world-readable plist утекают секреты.
- Задокументировать активный домен (
gui/$(id -u)vs фон), чтобы дежурный не выгрузил неверный job.
Совет для headless cloud Mac: кратко посмотреть UI шлюза — через VNC по нашему руководству; иначе оставайтесь на SSH, логах и HTTP health.
Почему обновления ломают автозапуск при исправном бинарнике
Обновления пакета могут сразу сдвинуть три хрупких точки: путь к исполняемому файлу в ProgramArguments, рабочий каталог для относительных конфигов и ожидаемую мажорную версию Node в бандле шлюза. Достаточно одного рассогласования: launchd считает job «настроенным», хотя он сразу выходит — галочки в UI, который так и не устоял.
Относитесь к каждому апгрейду как к мини-миграции: снимок plist, контрольные суммы entry-скрипта шлюза, предыдущий tarball хранить минимум семь дней. На облачных Mac вы платите за аптайм независимо от ответов бота; дисциплина в календаре изменений окупается при первом пятничном деплое, который рвёт клиентскую автоматизацию.
- Дросселировать автообновления на прод-шлюзах; canary в staging берёт свежую сборку первой.
- Согласовать мажорные Node с документацией вендора — неверные мажоры часто дают загадочные ошибки резолва модулей в первой строке лога.
- Централизовать ротацию секретов, чтобы правки plist делались раз на флот, а не на каждую панику.
Девять шагов runbook (SSH на Mac mini M4)
- Подтвердить связь тем же SSH-пользователем, что и LaunchAgent; несовпадение прав часто объясняет «вручную ок, при загрузке нет».
- Сохранить вывод
launchctl print gui/$(id -u)к заметкам инцидента для diff. - Найти plist в
~/Library/LaunchAgents/; проверить существование путейProgramArguments. - Запустить kickstart с
-k; подождать 30 секунд и проверить listening-порты. - Если всё ещё down — аккуратно unload/load plist; искать дубликаты в
/Library/LaunchDaemons, если экспериментировали. - Свести переменные окружения; добавить недостающие ключи, снова загрузить.
- Тейлить логи шлюза две минуты на crash-loop — откат, если один и тот же стек повторяется больше трёх раз.
- Интеграционный смоук (тестовое сообщение по каналу с минимальным риском) до объявления «зелёный».
- Обновить внутренние доки точными командами; флоты в HK, JP, KR, SG и US делят одну каноническую страницу восстановления.
Логи, health-check и эскалация
После перезапуска проверяйте не только «процесс жив», а осмысленные строки лога: успешные рукопожатия с провайдерами, стабильные WebSocket, отсутствие повторяющихся stack trace. Добавьте простой HTTP health-check (если шлюз его поддерживает) в то же мониторинговое ядро, что и остальной прод, чтобы отличать «launchd считает job здоровым» от реально отвечающих мостов.
Для распределённых команд централизованную агрегацию логов (rsyslog, агент и т. п.) включайте только после threat model и согласования по данным — API-ключи не должны попадать в общий индекс в открытом виде. На машинах NodeMac оставайтесь близко к хосту по SSH и при необходимости VNC; дополняйте короткими еженедельными «diff plist» после каждого обновления вендора, чтобы видеть дрейф до тикета клиента.
Цепочка эскалации: сначала kickstart, затем reload plist, затем переустановка CLI, затем откат — зафиксируйте порядок, чтобы ночная смена не экспериментировала. Если подряд падают два релиза, зафиксируйте прод-версию и откройте тикет вендору с приложенной plist и отредактированными логами.
Постмортем и контроль изменений
После каждого инцидента фиксируйте в тикет-системе хеш plist, версию шлюза и сработавшие команды launchctl. Привязывайте изменения к формальному запросу, чтобы пятничные эксперименты не попадали на прод без согласования. На выделенных машинах NodeMac группируйте политики по хосту и применяйте ту же модель SSH-доступа, что в справочном центре.
Чеклист до обвинения провайдера моделей
| Проверка | Критерий успеха |
|---|---|
| DNS / исходящий HTTPS | curl -I к endpoint провайдера даёт 2xx/401 (не timeout) |
| Место на диске | Не меньше 25 ГБ свободно на системном томе |
| Сдвиг часов | Дрейф NTP меньше 2 минут — JWT ломается тихо при скачках времени |
FAQ
Почему OpenClaw пропадает из строки меню после обновления?
Процесс шлюза мог завершиться, а launchd так и не перезагрузил plist LaunchAgent, либо plist всё ещё указывает на старый путь к программе после смены структуры пакета. Исправление: проверить plist, перезагрузить агент и убедиться, что переменные окружения переживают перезагрузку.
Безопасно ли запускать kickstart на продакшен-шлюзе?
Да, если готовы к нескольким секундам простоя; для команд, зависящих от мостов сообщений, предпочтительны окна обслуживания. Всегда смотрите логи в первую минуту после перезапуска.
Нужны всегда включённые шлюзы без присмотра за ноутбуками? Сравните тарифы NodeMac на выделенные Mac mini M4 с SSH/VNC в регионах ваших пользователей и используйте этот плейбук как стандартный чеклист после обновлений.
Железо Mac mini M4 делает восстановление демонов скучным в хорошем смысле: запас производительности Apple Silicon позволяет уместить шлюз, локальные хелперы и лёгкую автоматизацию без свопа, unified memory снижает OOM при всплесках логов. NodeMac поставляет выделенные физические машины — не общие VM — с SSH и VNC в Гонконге, Японии, Корее, Сингапуре и США, чтобы операторы выполняли этот плейбук удалённо сразу после выхода обновления. Аренда снижает CapEx, пока вы настраиваете политики LaunchAgent, и сочетается с справкой платформы по гигиене доступа на флоте.