AI / Автоматизация 25 апреля 2026

2026-04-25: OpenClaw doctor, CLI-конфиг и триаж allowlist моделей после обновлений на headless арендованном cloud Mac

MacXCode Engineering Team 25 апреля 2026 ~17 мин чтения

На арендованном 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-нативных сборок.

Правило merge-gate: зелёный 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 шлюза; сравнить с заметкой про под-агентов

Операционный «хребет»: 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 по желанию