Ниже — воспроизводимая цепочка без «устных легенд»: фиксированный gateway на loopback, Dashboard для выпуска узкого Bearer-токена, единый retry_policy на стороне шлюза и слияние HTTP-пробы /health с проверкой критичной зависимости в одну группу оповещений. Контекст по checkpoint и квотам песочницы — в материале про LangGraph checkpoint на Mac; разграничение прав, diff и базовые health-пробы — в гайде IDE-мост и health на удалённом Mac. Справка по установке и переменным — в центре помощи · OpenClaw.
| Компонент | Задача | При сбое смотрите |
|---|---|---|
| Dashboard | Выпуск, ротация и отзыв токенов; минимальные scope | TTL, список skill, аудит выдачи |
| OpenClaw gateway | Проверка Bearer, маршрут к навыкам, единые повторы и breaker | access-лог: 401, trace_id, задержки |
| Объединённые пробы | /health шлюза + критичный downstream → один алерт |
не маскирует ли PID сбой семантики |
Воспроизводимые шаги
1) Каталоги и порт. Выделите на удалённом Mac единый корень, например ~/openclaw-runtime: конфигурация шлюза, логи и scratch для временных файлов. Поднимите процесс gateway на 127.0.0.1 и зафиксируйте порт в plist launchd и в runbook — не дублируйте «магические» значения только в локальном .env. Файлы с секретами держите в режиме 0600; в манифестах навыков указывайте путь к токену, а не саму строку.
2) Минимальный токен в Dashboard. Создайте токен только с теми scope, которые реально нужны узлам графа (типично tools.invoke и привязка к конкретным skill_id). Задайте короткий TTL, разведите токены для разработки, CI и продакшена, чтобы отзыв одного окружения не гасил остальные. Запишите процедуру ротации рядом с мониторингом.
3) Узлы инструментов LangGraph. В общем HTTP-клиенте или обёртке вокруг ToolNode добавьте заголовок Authorization: Bearer <токен>. Прокиньте thread_id и коррелятор трассировки в X-Request-ID (или принятый у вас аналог), чтобы строки access-лога шлюза сопоставлялись с шагами графа без ручного grep по времени.
4) Единая политика повторов на шлюзе. Опишите один retry_policy: экспоненциальный backoff с полным джиттером, явный список условий для повтора (таймаут сокета, обрыв, 429, выбранные 5xx). Для мутаций требуйте ключи идемпотентности. Пороги circuit breaker привяжите к p95 задержки реального downstream, а не к «быстрому» localhost.
5) Слияние health и алертов. Скрипт или агент мониторинга должен считать сбоем отсутствие ответа от /health шлюза или неуспех проверки критичного внешнего API; оба пути ведут в одну группу оповещений с общим идентификатором инцидента. Разведите «процесс запущен» и «семантика сервиса здорова», иначе зелёный systemd/launchd будет прятать деградацию.
6) Приёмка. Выполните openclaw doctor --json, затем три сценария: истёкший токен, занятый порт, искусственно замедленный downstream. Ожидаем стабильные коды ошибок на стороне LangGraph и один понятный корень в алерте.
Дополнительно зафиксируйте в runbook, кто может выпускать токены в Dashboard и как часто проверяется аудит выдачи: при увольнении или компрометации ноутбука достаточно отозвать узкий токен среды, не ротации всей инфраструктуры. Для периодических скриптов health на macOS имеет смысл задать ThrottleInterval в plist или эквивалент в планировщике, чтобы объединённая проба не превратилась в шторм запросов к шлюзу и внешнему API при кратковременных сетевых флуктуациях.
Не дублируйте второй слой экспоненциального backoff в коде узла LangGraph, если он уже задан на шлюзе: иначе получите перемножение задержек и непредсказуемые лимиты на downstream. Граф должен получать классифицированный код ошибки и решать, менять ли план, а не «лечить сеть» повтором внутри tool-функции. Это же упрощает сопоставление логов шлюза с шагами графа по одному correlation id.
# Пример объединённой пробы (замените порт и URL)
curl -sf -H "Authorization: Bearer $OC_TOKEN" \
http://127.0.0.1:${OC_PORT}/health \
&& curl -sf https://api.example.com/readyFAQ: порты и авторизация
Порт занят. Команда lsof -i :<PORT> покажет PID. Если это прежний gateway, корректно остановите сервис через launchctl unload нужного plist, затем поднимите новый экземпляр. Документируйте порт в одном месте для всей команды.
Постоянные 401 / отказ авторизации. Проверьте срок токена и набор scope в Dashboard, синхронизацию часов. Если трафик идёт через reverse proxy, убедитесь, что заголовок Authorization не удаляется и что базовый URL клиента совпадает с префиксом маршрутов шлюза — иначе легко спутать 404 с «неверным ключом».
Алерт молчит, а вызовы инструментов падают. Вероятно, вы мониторите только PID. Добавьте семантическую проверку и объедините её с /health шлюза, как в шаге 5.
Повторы раздражают API с лимитами. Уменьшите maxAttempts, добавьте обработку 429 и заголовка Retry-After; не классифицируйте клиентские ошибки как временные.
Кратко: Dashboard сужает поверхность токена, шлюз централизует повторы и breaker, объединённые пробы связывают «жив ли процесс» с «работает ли цепочка». Граф остаётся оркестратором и передаёт контекст, а не дублирует политику безопасности в каждом узле.
Если вы хотите держать gateway, токены и пробы на выделенном узле под контролем дата-центра, откройте страницу покупки (доступна без входа), сверьтесь с тарифами и зафиксируйте runbook в центре помощи. Готовы к выдаче машины — перейдите с главной в консоль и разверните тот же стек на продакшен-среде.