Три ограничения, если webhook смотрит сразу на сборщик
- Ротация секретов. Каждый новый Mac в пуле не должен требовать новой записи в Linear и нового signing secret.
- Аудит и HMAC. Проверка подписи и лимиты входа проще стандартизировать на одном процессе, чем копировать на N runner’ов.
- Исходящие вызовы. GraphQL Linear и URL чатов держите на шлюзе с узким egress; узлы остаются «тупыми» исполнителями с Xcode и общим томом артефактов.
Общая картина мультиузла — в руководстве по мультиузловому развёртыванию MeshMac и в шаблоне webhook для общей сборки.
Установка шлюза и проверка работоспособности
Только шлюз должен принимать POST от Linear. Узлы подключаются и отключаются без смены URL в настройках workspace.
- Шаг 1. Установите OpenClaw на выделенном Mac-шлюзе, задайте
OPENCLAW_CONFIG_ROOT, запустите агент под LaunchDaemon (или аналогом), чтобы процесс переживал перезагрузки, пока пул обновляет Xcode. - Шаг 2. Опубликуйте
https://…на стабильном имени хоста шлюза — именно его вставьте в Linear. Вынесите путь webhook в отдельныйlocationreverse-proxy с разумнымclient_max_body_size; край и TLS согласуйте с матрицей Nginx vs Caddy. - Шаг 3. Подтвердите готовность:
openclaw doctor, журналы старта,GET /healthили составной probe из материала про prewarm и health-check навыков, чтобы балансировщик снимал нездоровые инстансы при выкатке. - Шаг 4. Логируйте
correlation_id, маршрут и задержку до ack очереди; лимиты одновременных webhook’ов сверьте с FAQ по rate limit и сессиям на шлюзе. Дополнительные сценарии — в хабе OpenClaw в блоге.
Проверка подписи Linear
Сначала проверка, потом разбор JSON. Linear подписывает точное сырое тело; ранний json_decode ломает HMAC под нагрузкой.
- Шаг 1. Создайте webhook в Linear, один раз скопируйте signing secret, сохраните в файл с правами 0440 по гайду секреты и минимальные права на узлах, например
/etc/openclaw/secrets.d/linear/webhook.secret. - Шаг 2. Буферизуйте байты тела, вычислите HMAC-SHA256 согласно документации Linear, сравните заголовок
Linear-Signatureв постоянном времени; при наличии окна времени отсекайте устаревшие доставки. - Шаг 3. На неверной подписи отвечайте
401; в лог пишите только обезличенные поля (та же гигиена, что в статье про Teams и статус сборки). - Шаг 4.
200 OKотдавайте только после долговременной записи задачи в очередь, иначе повторы Linear размножат джобы; порядок и синхронизацию очереди см. единый деплой и синхронизацию очереди.
Сбои: повторы и уведомления
В мультиузловом пуле растёт число транзиентных отказов; держите одну историю уведомлений. Разделите входящий контур (Linear → вы) и исходящий (вы → чат и API Linear).
- Шаг 1. Быстро подтверждайте приём после записи в очередь; пусть Linear повторяет свой край при сетевых сбоях. Таймауты обработчика уложите в бюджет параллелизма шлюза.
- Шаг 2. Для webhook’ов чатов применяйте exponential backoff с полным джиттером на
429и5xx, ограничьте число попыток, дедуплицируйте поidempotency_key + состояниена окно порядка 72 часов — в духе раздела про Teams в указанной выше статье. - Шаг 3. Для GraphQL Linear логируйте массив
errors, на rate limit откатывайтесь по backoff; на401не крутите цикл — сначала исправьте ключ и scope. - Шаг 4. Если и чат, и комментарий в Linear недоступны, эскалируйте через IM по runbook из материала про алерты; отказоустойчивость шлюза планируйте с балансировкой и failover.
Матрица: куда ставить webhook в mesh
| Вариант | Плюсы для пула MeshMac | Минусы / риск |
|---|---|---|
| Один шлюз OpenClaw | Один signing secret, единый аудит, Linear не трогают при добавлении 4-го и 5-го Mac | Нужен health-check и дренаж за балансировщиком |
| Webhook на каждом сборщике | Кажется «проще» на первом Mac | N секретов, расхождение версий обработчика, сложнее idempotency |
| Прямой вызов скрипта без очереди | Минимум компонентов на POC | Потеря события при рестарте, нет справедливого распределения по узлам |
Цифры и ориентиры для runbook
- Права на секрет webhook: файл
0440, владелец процесса шлюза — снижает риск утечки при бэкапах репозитория. - Окно дедупликации исходящих уведомлений: держите не менее 24–72 ч по паре «ключ идемпотентности + итог», чтобы повторные прогоны CI не забивали канал.
- Размер тела для edge: заранее задайте лимит тела запроса на location webhook выше типичного JSON Linear, но без избыточного запаса — проще отлавливать аномалии.
FAQ
- В curl подпись совпадает, в продакшене — нет
- Сравните байты: фреймворк мог перекодировать тело, CDN — пересжать gzip, WAF — убрать заголовок. Снимите эталон с staging, отключите лишние трансформации на edge, проверяйте по захваченным из access-лога образцам (обезличенным).
- Двойные сборки при быстром перетаскивании карточки
- Добавьте debounce в маппере состояний или требуйте стабильную метку «готово к сборке». Включите в idempotency ключ issue, колонку и короткий временной bucket, чтобы дрожание руки не создавало две записи.
- Комментарий в Linear не появляется при зелёной сборке
- Проверьте scope ключа на команду, убедитесь, что в GraphQL передаёте тот же
issueId, что пришёл в webhook, и прочитайтеerrorsответа — после обновлений API схема могла сдвинуться. - Действительно ли только один Mac должен звонить в Linear API?
- Для секретов и аудита — да. Сборщики остаются взаимозаменяемыми; шлюз владеет проверкой подписи, токенами и URL чатов. Добавление узла — это мощность CPU и диска, а не новый security review в Linear.
Кратко
Итог: шлюз → health-check → HMAC по сырому телу → очередь с idempotency → общий скрипт на любом MeshMac → broadcast в чат → опционально GraphQL-комментарий с ограниченными повторами. Смежные материалы — в хабе OpenClaw.
Публичные страницы без входа
Главная, блог, справочный центр и тарифы и пакеты открыты без регистрации — удобно заранее оценить, сколько узлов MeshMac нужно под шлюз и очередь.
Расширяйте пул Mac — не умножайте webhook’и
Аренда дополнительных узлов MeshMac даёт параллельные сборки без перенастройки Linear: секрет остаётся на шлюзе, очередь честно раздаёт задачи. Откройте страницу тарифов и пакетов (без входа в аккаунт), загляните в центр помощи по SSH и VNC, на главную и в блог — спланируйте ёмкость шлюза и воркеров до оформления заказа.