Когда шлюз в духе OpenClaw живёт на удалённом постоянно включённом Mac, большинство инцидентов — не «таинственные» ошибки компилятора, а дрейф состояния launchd, зависшие слушатели или два конкурирующих plist с одним и тем же Label. Этот ориентированный на 2026 год справочник задаёт воспроизводимую триаду — doctor, status и журналы — чтобы каждая SSH-сессия заканчивалась записью в тикете, а не ощущением «вроде починилось». Мы предполагаем, что бинарники уже лежат по явным путям и вы понимаете, почему launchd не читает ваш интерактивный профиль; если нужна карта путей и выбор между Docker и нативным демоном, начните с
2026 OpenClaw: практическое удалённое развёртывание на Mac — пути установки, Docker и постоянный запуск на хосте, частые ошибки и сценарии рабочих процессов.
Для пула self-hosted runner и дисковой гигиены рядом с шлюзом полезен материал
2026: несколько самохостинговых Mac runner и параллельный CI — как настроить GitHub Actions Cache и локальный постоянный диск? Гонки блокировок, заполненный диск и очистка артефактов: FAQ корпоративного пула.
1. Сначала сверьте doctor, status и журналы — и только потом трогайте plist
Проверки в духе doctor должны отвечать на вопросы конфигурации, которые бинарник уже «знает»: админ-порт, файл токена, каталог данных и опциональные модули. Запускайте их по SSH так же, как это сделает launchd — оборачивайте bash -lc или прописывайте тот же PATH, что в plist. Status — правда «на проводе»: HTTP или gRPC health, успешное TLS-рукопожатие и доступность апстрима с самого Mac, а не только с вашего ноутбука. Журналы замыкают цикл, когда doctor зелёный, а статус дёргается: заведите отдельный каталог вроде ~/Library/Logs/OpenClawGateway и ротируйте по размеру, чтобы выходные пики не стёрли улики.
2. Особенности launchd, которые кусают шлюзы на безнадзорных Mac
Пользовательские LaunchAgents поднимаются после объектов входа; системные LaunchDaemons — от root до GUI-сессии. Шлюз, который должен пережить перезагрузку без залогиненного пользователя, почти всегда логичнее держать в /Library/LaunchDaemons с plist и бинарниками под root, если только вам не нужна разблокировка связки ключей при входе — иначе каждый обрыв Screen Sharing превращается в охоту за призраками. В plist фиксируйте WorkingDirectory, абсолютные ProgramArguments, явные StandardOutPath и StandardErrorPath, а также умеренный ThrottleInterval, чтобы цикл падений не крутил CPU. На современных macOS смотрите launchctl print и log show с предикатом к com.apple.launchd, когда задание не держится в загрузке: причина чаще PATH, права или отказ песочницы, которые doctor не увидит, потому что стек сети ещё не открывался.
Если вы обязаны остаться в пользовательском агенте из‑за GUI-секрета, документируйте зависимость: какая учётная запись должна оставаться в сессии, как закрыт удалённый доступ и что произойдёт после патча, который разлогинит консоль. Держите одну и ту же семантическую версию в комментариях plist и в инфраструктурном репозитории — тогда диффы покажут «локальный фикс» на удалённой машине.
3. Занятость порта: когда «address already in use» — это две службы
Шлюзы фиксируют предсказуемые порты; после обновлений иногда остаётся сиротский процесс на том же сокете. По SSH выполните lsof -nP -iTCP:<port> -sTCP:LISTEN и сравните PID с тем, что показывает launchctl print gui/$uid или launchctl print system для вашего Label. Если PID не тот, что стартует plist, выгрузите агент, проверьте путь к бинарнику и завершите лишний процесс осознанно — без широкого killall, если на хосте крутится self-hosted runner. Если Docker Desktop пробрасывает тот же порт на хост, помните, что ВМ Linux успевает занять bind раньше: либо сдвиньте порт контейнера, либо держите шлюз на «голом» macOS, как советует наша заметка про удалённое развёртывание.
4. Два LaunchAgent и один Label: дубли и «полезные» установщики
Два plist с одинаковым Label в разных каталогах дают недетерминированного победителя между перезагрузками — классика после ручного plist и сервисного файла Homebrew с одним com.example.gateway. Снимите инвентаризацию через find по ~/Library/LaunchAgents, /Library/LaunchAgents и /Library/LaunchDaemons, затем оставьте один авторитетный plist под версионированием. На Ventura и новее предпочитайте пары launchctl bootout / bootstrap вместо устаревшего unload, который иногда молча ничего не делает. Зафиксируйте последовательность в runbook, чтобы дежурный не поднял демон под чужим UID и не словил TCC на защищённых путях.
5. Чеклист для удалённого постоянного Mac — можно вставить в тикет
- Питание и сон: отключите сон диска на сети, убедитесь, что Wi‑Fi не отваливается вместе со сном дисплея.
- Синхронизация времени: сетевой NTP; TLS к контрольным плоскостям ломается при сдвиге больше пары минут.
- Свободное место: шлюзы кэшируют вложения — алерт до 85% заполнения, чтобы задания не завершались на
ENOSPC. - Ротация секретов: после смены токена перезапустите job и убедитесь по логам, что пошла новая «отпечаток» учётки, а не бесконечные 401.
- Дымовой тест снаружи:
curlк публичному слушателю тем же путём, что используют пользователи, а не только127.0.0.1.
Почему для такого шаблона по-прежнему выигрывают узлы класса Mac mini
Шлюзы не прощают нестабильное железо: каждый пропущенный health check превращается в шум пейджера. Mac mini на Apple Silicon сочетает сильную однопоточную производительность с очень низким холостым потреблением, поэтому круглосуточные демоны обходятся дешевле, чем простаивающая башня. Тот же стек нативного Unix, Homebrew и macOS с Gatekeeper, SIP и FileVault делает постоянный выход в интернет менее «самодельным», чем на типовых ПК. Если вы стандартизируете автоматизацию OpenClaw в 2026 году, начните с железа, которое тихо, предсказуемо и экономно простаивает; когда понадобится больше региональных нод, сравните модели на главной странице Macstripe, прежде чем покупать ядра, которые launchd никогда не насытит.
Если хотите прогнать именно этот runbook на самом плавном базовом железе, Mac mini M4 — сбалансированная стартовая точка: компактный корпус, тихое охлаждение и запас по CPU для шлюза и соседних CI-задач без превращения стойки в обогреватель. Когда будете готовы оценить выделенную ноду рядом с пулом self-hosted, откройте главную страницу Macstripe и сравните конфигурации под вашу нагрузку.