Зачем сужать границу задачи
Агент сводки кода не должен нести права владельца организации. На одном узле ошибка ограничена одной машиной; в сетке MeshMac один и тот же широкий токен копируют на три воркера — и компрометация или утечка из логов умножает риск. Поэтому политика строится вокруг трёх опор: узкая область токена только под чтение метаданных PR и точечную публикацию результата, физическое разнесение каталогов и секретов по проектам и ролям узлов, дисциплина повторов, при которой ответы 401 и 403 немедленно выводят задачу из цикла backoff, а не «усыпляют» платформу запросами.
Границы сценария: речь о задаче «краткий обзор изменений и рисков» без слияния веток, без массового удаления веток и без администрирования репозитория. Всё, что выходит за эти рамки, оформляется отдельной ролью и отдельным секретом на другом узле или в другом LaunchDaemon.
Webhook или расписание
Выбор триггера — компромисс между задержкой, площадью атаки и стоимостью идемпотентности. Webhook даёт секундную реакцию на событие «открыт или обновлён PR», но требует опубликованной конечной точки HTTPS, корректной проверки подписи или секрета и обычно узла-шлюза, который единственный принимает внешний трафик. Периодический опрос через launchd или cron проще для сегментов без входящего доступа из интернета: достаточно исходящего HTTPS к API GitHub/GitLab и аккуратного учёта rate limit; задержка — от одной до нескольких минут в зависимости от интервала.
| Критерий | Входящий webhook | Расписание (опрос API) |
|---|---|---|
| Задержка | Низкая, удобна при частых PR | Выше; подходит для внутренних сетей без публичного ingress |
| Безопасность | TLS, HMAC или Bearer, анти-replay; только шлюзовые узлы слушают порт | Нет входящего listener; меньше поверхность, больше исходящих вызовов API |
| Идемпотентность | Ключ по delivery id или id события в хранилище дедупликации | Стабильный task_key: репозиторий, номер PR, хеш последнего коммита HEAD |
| Эксплуатация | Сертификаты, reverse proxy, ротация секрета webhook | Квоты API, пагинация, кэш последнего обработанного состояния |
Паттерн «проверить, поставить в общую очередь один раз, затем обработать любым свободным узлом» хорошо стыкуется с описанным в статье про webhook и уведомления: шлюз не выполняет тяжёлую сводку, а лишь нормализует событие и записывает задачу, чтобы воркеры на остальных Mac не дублировали приём HTTP.
Установка, шлюз, изоляция каталогов
Выполняйте шаги в порядке: так любой инженер сможет повторить ту же топологию на новом пуле узлов.
- Установка. Одна мажорная версия macOS в политике обновлений, один способ установки OpenClaw (пакет или скрипт), один зафиксированный релиз на всех узлах. После выката — общий отчёт doctor и контрольная задача сводки на каждом узле с записью
node_idв лог. - Шлюз. Только один или два хоста (например
gateway-a,gateway-b) получают listener на 443 или внутренний ingress; webhook попадает в очередь Redis или ваш API; узлы-исполнители только потребляют задачи и не открывают публичные порты под приём событий SCM. - Изоляция каталогов. Корень вида
/var/lib/openclaw/<команда>/<репозиторий>или согласованный с вашим стандартом путь; группа Unixopenclawrunили отдельная группа на проект; каталоги0750, файлы с токенами0440; не смешивать домашние каталоги разработчиков с рабочими данными агента. - Переменные среды. Явно задать
OPENCLAW_CONFIG_ROOTи при необходимости каталог состояния; на уровне узла переопределять только идентификатор узла и адреса привязки, не дублируя секреты из других проектов. - Логи. Обязательные поля:
node_id,credential_idили имя роли,pr_number, correlation id; значения токенов и полные URL с секретами в запросе не писать.
Шаблоны окружения и слои dev/staging/prod для секретов согласуйте с руководством по env и секретам, чтобы токен staging никогда не монтировался в plist prod-воркера.
Токены и шаблон повторов
Минимальные токены. Разделите «читать PR, diff, комментарии» и «публиковать сводку» если платформа позволяет: два ограниченных объекта лучше одного PAT с правами администратора. Предпочитайте fine-grained PAT или установку GitHub App с явным списком репозиториев. Запретите scope уровня организационного админа и доступ к секретам CI, если сводка им не нужна. Файлы с материалами ключей храните вне репозитория; подстановка через срендеренный env по среде, как в общем конвейере MeshMac.
Шаблон повторов. На уровне очереди задайте max_retries (например 3), экспоненциальный backoff для интервалов вроде 2 с, 8 с, 32 с и применяйте его только к таймаутам сокета, обрывам соединения и ответам 5xx от API. visibility_timeout или эквивалент должен превышать P95 длительности сводки плюс сетевые хвосты, иначе второй воркер возьмёт ту же задачу и продублирует комментарий. Ветвление в политике: при статусах 401 и 403 — запись в dead-letter, оповещение в канал дежурных, без повтора; при 429 — уважать заголовок Retry-After или фиксированную паузу с потолком.
Общая стратегия очереди и переназначения при падении узла описана в материале про очередь и повторы; сочетайте его с этим HowTo, чтобы поведение сводки PR не расходилось с остальными задачами OpenClaw.
FAQ: 401 и таймауты
| Симптом | С чего начать проверку |
|---|---|
| 401 время от времени | Синхронизация времени (NTP) на шлюзе и воркерах; не пересекаются ли старый OAuth и новый fine-grained токен в одном env; в окне ротации оба ключа смонтированы только там, где нужно. |
| Постоянный 401 | Репозиторий не подключён к App; неверный scope; токен отозван — убедиться, что шаблон повторов не гоняет запросы в цикле и не засоряет аудит. |
| Таймаут чтения API | Увеличить разумно connect и read timeout клиента; проверить путь через Jump Host, корпоративный прокси и TLS-инспекцию; увеличить visibility в очереди с учётом худшего времени ответа API и инференса. |
| Ошибка проверки подписи webhook | Секрет в консоли SCM и на шлюзе побайтно совпадает; нет путаницы hex и UTF-8; окно допустимого skew для метки времени не отбрасывает легитимные запросы. |
Дальше по сайту без входа
После прохождения чеклиста цепочка «триггер → очередь → сводка PR» на MeshMac должна опираться на сходящийся шлюз, раздельные каталоги, узкие токены и предсказуемые повторы. Ниже — только внутренние страницы, которые открываются без входа в аккаунт: справка по SSH и VNC, главная, хаб OpenClaw и список статей блога.
Продолжить настройку по открытым страницам сайта
Ссылки ведут на разделы без обязательной авторизации: справочный центр, главная, коллекция OpenClaw и каталог блога — удобно держать рядом с этим HowTo.