2026-04-25: OpenClaw doctor, CLI-конфиг и триаж allowlist моделей после обновлений на headless арендованном cloud Mac
На арендованном Mac mini M4 в HK / JP / KR / SG / US обычно в первую очередь SSH, а VNC — только когда GUI неизбежен. В этом как раз режим сбоев, под который заточен проект OpenClaw: долгоживущий процесс шлюза, конфиг в форме JSON и быстрый цикл релизов npm, при котором «в git diff ничего не менялось» всё равно может уронить прод, если зависимость ужесточила валидацию, сдвинула дефолты или allowlist моделей. Этот 2026-04-25 runbook — путь триажа, а не пересказ исхода и DNS или онбординга. В нём: openclaw doctor (и по желанию --fix), разрыв между ключами, которыми управляет CLI, и ручными правками файлов, как доказать, какой ~/.openclaw реально прочитал LaunchAgent, и как обойти ловушку «в интерактивной ssh -t работает, а под launchd нет». Держите в сценарии отката npm + двойной рестарт, если doctor сигналит о старых нативных модулях или дублирующихся шлюзах.
Почему обновления всплывают «фантомами» на headless Mac
Три разных часовых механизма: ноутбук (богатый PATH, zshrc, HTTPS_PROXY с VPN, о котором забыли), SSH-сессия в стиле CI, которой пользуется автоматизация, и среда launchd — единственная, которая должна волновать демон. После npm -g или тега OpenClaw валидация схемы может начать отклонять ключ, который несли с апреля, шлюз может создать второй PID-файл, а вызов инструмента, раньше неявный, вдруг потребует явного approval / capability, что видно только в verbose-логах. Readiness — быстрый фильтр для слушателя 127.0.0.1:18789, а не гарантия, что весь «личностный» конфиг ещё согласован: readiness нужен, но недостаточен, чтобы «чат работал во всех каналах».
Сначала 90 секунд: openclaw doctor (и --fix)
Начните с безопасного прохода, затем с прохода с --fix, который можно откатить: openclaw status --all — версии, PID, порты, компактная матрица движущихся частей; openclaw doctor — схема, устаревшие или конфликтующие ключи, подсказки к поддерживаемым путям; openclaw doctor --fix — когда CLI безопасно убирает мусор вроде устаревшего ~/.openclaw/gateway.pid после крэша или устаревшего подключа, который мигратор переписывает. В внутренней вики зафиксируйте точный порядок — команды, где сначала kill -9, а потом doctor, получают другой вывод, чем те, кто сначала делает openclaw gateway stop. Если doctor ругается на плагин, свяжите с классом ошибок WebSocket 1006 в экосистеме; не останавливайтесь на первой строке «another gateway is listening» без поиска старых процессов clawdbot — об этом не раз писали в сообществе.
Один источник правды: CLI config и JSON на диске
Предпочитайте openclaw config set <key> <value> и openclaw config get <key> (точный набор от версии) для изменения конфига — многие ловят schema drift, правя ~/.openclaw/openclaw.json лишней запятой или ключом, который UI записал, а CLI больше не сериализует. После любой ручной правки снова doctor. Горячая перезагрузка покрывает много agent / model / prompt, но gateway.port и gateway.bind всё ещё требуют полного openclaw gateway restart по контракту hot-reload в апстриме — как для nginx + webhook, когда изменилась только половина «раздвоенного» стека. Секреты в ~/.openclaw/.env и те же EnvironmentVariables, что для API-ключей в launchd, а не из cat >> ~/.zshrc в онбординге.
Allowlist моделей: «not allowed» чаще политика, а не сбой
Если провайдер переименовал строку модели, а в skills остаётся anthropic/claude-3-5-sonnet-latest, тогда как шлюз разрешает только закреплённый список, сбой похож на проблему с кредами. Проверьте эффективный allowlist: openclaw config get agents.defaults.models (или ближайший аналог в вашей версии) и сделайте строки идентичны целевому каталогу — регистр, префикс вендора, слот (основной / fallback). Сопоставьте с статьёй об исходе: если ошибка после TLS и HTTP/2 — это маршрутизация модели; если до завершения TCP — вы в зоне DNS/TLS. Для cron и под-агентов нельзя тихо тянуть более узкий allowlist в отдельном профиле, который забыли смержить. Логируйте разрешённую модель для каждой задачи по расписанию, а не ярлык из Slack.
Шлюз, PID-файл и «я же уже убил»
Два слушателя появляются, когда LaunchAgent пользователя перезапустился, а ручной фореграунд ещё держит порт, или после апгрейда остался дочерний Node, сиротой переподвешенный к launchd. lsof -iTCP:18789 -sTCP:LISTEN и ps -ax | grep -i openclaw на том же аккаунте, которому принадлежит plist, не root — ваша опора. Если «ядерный» вариант неизбежен, остановитесь в документированной последовательности, затем снова doctor перед стартом. Это стыкуется с матрицей обновления/отката шлюза: плохой релиз виднее, когда в тикет шаблоном попали старый PID, версию node и DEVELOPER_DIR для sidecar-нативных сборок.
openclaw doctor в CI после обновления staging на одноразовом арендованном хосте плюс сохранённый лог status --all — лучше, чем скрин чата, который доказывает лишь то, что мобильный клиент видит Telegram.
Таблица: симптом / слой (конфиг, сервис, сеть)
| Симптом | Слой | Что стабилизировать |
|---|---|---|
| «Model not in allowlist» сразу после минорного бампа | Политика конфига | Расширить allowlist, зафиксировать строки, повторить один чат в debug |
| Doctor OK, 403 у провайдера при «свежем» API-ключе в shell | Среда launchd / исход | Распечатать env у работающего PID; затем TLS-проверки исхода |
| 1006 на WebSocket после добавления плагина | Граф плагинов Node | Повторить npm install, читать stderr шлюза; сравнить с заметкой про под-агентов |
Связанные runbook’и MacXCode
Операционный «хребет»: ClawHub skills — что можно автоматизировать, структурированные логи, чтобы «не та модель» отличалась от «не тот маршрут», и Tailscale, если в дизайне есть разрез между 100.64/ и публичными hostname. В режиме быстрого старта сначала онбординг + демон.
FAQ: doctor на shared-билдерах
| Вопрос | Практичный ответ |
|---|---|
| Запускать doctor перед каждым деплоем? | Как минимум после смены npm и бампа бинаря шлюза; это быстрее, чем чинить мост в чат на выходных. |
| Ручной JSON вообще допустим? | При слиянии с апстрим-примерами — сразу doctor и дымовой чат, не слепой рестарт. |
| А если регион HK отстаёт от US? | Временные сдвиги в пределах окна — норма; не норма расхождения политики или исхода. Разделяйте дашборды по метке lease, масштаб — через тарифы по регионам. |
Почему «голый» M4 в пяти регионах по-прежнему выигрывает
Диагностика и нагрузка на шлюз важнее дрожания сроков и повторяемого I/O, чем пиковых GFLOPS. Mac mini M4 на MacXCode даёт однотенантный NVMe под подробные JSON-логи, постоянный SSH и вариант добавить второй узел, если команда режет allowlist провайдера по странам. Если в 2026 вы сочетаете OpenClaw с реальными конвейерами поставки, та же линейка может держать ворота Xcode test + coverage во «второй половине» платформенных runbook’ов — относитесь к аренде как к ёмкости, которую можно измерить p95, а не к чёрному ящику, который крутят ребутами до зелёного.
OpenClaw на стабильных Mac с приоритетом SSH
HK · JP · KR · SG · US · VNC по желанию