Конфигурация Incoming Webhook
Один отправитель. Зафиксируйте модель «сначала шлюз», как в материале про единый выкат и синхронизацию очереди: исходящий TLS к SaaS завершает только хост OpenClaw, а Mac-узлы лишь отдают нормализованные терминальные события (успех, провал, отмена) во внутреннюю шину или брокер.
Создание Webhook. В целевом пространстве Webex добавьте интеграцию Incoming Webhook, дайте понятное имя (например, meshmac-ci-prod), один раз скопируйте полный HTTPS URL. Строка целиком эквивалентна bearer-токену: любой, кто может выполнить успешный POST, может писать в пространство от имени интеграции.
Подключение шлюза. Настройте сервис OpenClaw на POST с Content-Type: application/json и полем markdown (или согласованным текстовым полем по документации Webex для вашей версии API). В тело включите: имя pipeline/workflow, branch, короткий commit, mesh_node_id, provider_run_id, state, ссылку run_url и при failure — 2–6 строк хвоста лога или первой релевантной ошибки без секретов.
Проверка egress. С хоста шлюза выполните пробный curl с теми же переменными прокси и CA, что у демона. Таймауты клиента согласуйте с лимитами шлюза и конкурентностью сессий, чтобы «медленный» ответ Webex не блокировал воркеры очереди.
- Не логируйте полный URL — достаточно хоста и последних символов пути.
- Разведите staging и production разными webhook и разными пространствами или ветками политики.
- Корпоративный прокси: явно задайте доверенный набор корней и проверьте SNI до
webexapis.com.
Минимальные права
Храните URL в файле вроде /etc/openclaw/secrets.d/webex/build-status.url с правами 0440, владелец root, узкая группа процесса (например openclaw-notify), по образцу секретов и минимальных прав на узлах MeshMac. Разработчики и интерактивные пользователи Mac не должны входить в эту группу.
Не подменяйте Incoming Webhook широким бот-токеном Webex на builder-ах, если вам не нужны произвольные REST-вызовы: отдельный OAuth/bot оставьте на шлюзе во втором файле с ещё более узкой политикой.
Ротация «URL как секрета»: создайте новый Incoming Webhook, обновите файл на шлюзе, перезапустите или перечитайте конфигурацию сервиса, отправьте канареечное сообщение, затем отключите старый webhook в админке Webex. Порядок шагов и привязка каналов тревог зафиксируйте рядом с каналами тревог и ротацией токенов.
Повторы и экспоненциальный backoff
При пиках CI и сетевых дрожаниях Webex может отвечать 429 или 503. Используйте экспоненциальный backoff с полным джиттером, жёсткий потолок числа попыток и уважение к заголовку Retry-After, если он присутствует. Сериализуйте исходящие посты на одно пространство, чтобы не устраивать «стадо» параллельных ретраев после кратковременной деградации.
Перед отправкой в Webex вычисляйте ключ идемпотентности из provider_run_id и терминального state: повтор того же состояния в коротком окне не должен создавать вторую карточку. Эти же идеи раскрыты в шагах по очереди и повторам и в контексте потоковых лимитов — в статье про streaming и backpressure.
Ориентиры: markdown обычно укладывают в порядка 1–2 KiB для читаемости карточки; таймаут HTTP-клиента разумно держать в диапазоне 10–20 с; при инциденте предпочтительнее одна сводная карточка, чем десяток частичных статусов подряд.
Типовые ответы 4xx и 5xx
Ниже — компактная матрица для дежурного: не заменяет официальную документацию Webex, но ускоряет разбор в проде.
| HTTP | Вероятная причина и действие |
|---|---|
400 | Невалидный JSON, пустой markdown или запрещённое поле — исправить схему, добавить фикстуру в CI шлюза; не крутить бесконечные ретраи. |
401 / 403 | Просроченный, отозванный или заблокированный политикой URL — ротация webhook, проверка членства в пространстве и корпоративных ограничений. |
404 | Интеграция удалена или путь опечатан — пересоздать Incoming Webhook и обновить секрет на шлюзе. |
429 | Throttling — снизить параллелизм постов, объединять алерты, следовать Retry-After, расширить backoff. |
500 / 503 | Сбой на стороне Webex или инфраструктуры — ограниченные ретраи с джиттером; фиксировать корреляционный id в логах шлюза для тикета в поддержку. |
Ценность мультиузловой коллаборации
Когда в пуле MeshMac несколько машин, единый шлюз + очередь дают предсказуемую картину для команды: одинаковая схема полей с любого узла, одна временная шкала в Webex, отсутствие повторной выдачи секрета при добавлении Mac и единый аудит исходящего TLS. Это снижает операционный шум при масштабировании ёмкости и при смене провайдера CI.
Если часть стейкхолдеров сидит в Microsoft Teams, а инженеры — в Webex, тот же нормализованный поток событий можно развести на второй канал по паттерну потоковой сводки Teams, не дублируя бизнес-логику на узлах.
Чеклист и разбор типовых сбоев
Чеклист перед продом
- С шлюза
curlк webhook возвращает 200 и в Webex видна тестовая карточка. - Воркеры публикуют только терминальные переходы, а не каждый шаг скрипта.
- В памяти или БД шлюза включена дедупликация по
provider_run_id+state. - Firewall разрешает
443/tcpкwebexapis.comтолько с подсети шлюза. - Runbook ротации содержит владельца, резервный канал и порядок отката.
Разбор
Симптом: в CI всё зелёное, в Webex пусто.
Что делать: убедиться, что шлюз получил событие и залогировал исходящий POST; проверить непустой markdown; убедиться, что webhook не удалён; повторить запрос под тем же UID, что у демона.
Симптом: уведомления пропали только с части Mac.
Что делать: на узлах мог остаться прямой POST со старым URL — запретите обход шлюза политикой egress и конфигурацией OpenClaw.
Симптом: дубликаты после обрыва Wi‑Fi или рестарта шлюза.
Что делать: включить идемпотентность и сократить число параллельных отправителей на одно пространство.
Дальше без входа в аккаунт
Главная, каталог блога, справочный центр и страница тарифов аренды открываются сразу — отдельная регистрация для первичного ознакомления не требуется. Так проще согласовать пул MeshMac и политику уведомлений с командой до покупки.
Масштабируйте пул Mac — секрет Webex остаётся на шлюзе
Новые узлы MeshMac должны добавлять пропускную способность, а не копии webhook URL. Откройте главную Meshmac, изучите тарифы без входа, загляните в блог и в справку по SSH и удалённому рабочему столу перед оформлением.