HowTo · Mattermost · мультиузел

2026 OpenClaw MeshMac на практике: минимально воспроизводимые шаги для Mattermost Incoming Webhook и broadcast статуса общей сборки с нескольких узлов

17 апреля 2026 г. Команда Meshmac 8 минут чтения

Командам с пулом MeshMac в 2026 году нужен один канал Mattermost, куда попадает итог сборки с любого удалённого Mac, без гонок и утечки секретов на runner. Ниже — короткий воспроизводимый контур: шлюз OpenClaw как единственный клиент к /hooks/…, нормализация полей CI, очередь и broadcast, плюс FAQ, когда лента «молчит». Смежная схема для Microsoft Teams — в статье про Teams; общие принципы webhook общей сборки — в материале про shared build notify и на хабе OpenClaw.

Шлюз и настройка Incoming Webhook

Исходите из той же модели, что и в руководстве по мультиузловому развёртыванию MeshMac: один логический шлюз запускает сервисы OpenClaw и владеет исходящими интеграциями. На стороне Mattermost откройте Integrations → Incoming Webhooks, привяжите webhook к целевому каналу (или разрешите переопределение канала полем channel в теле — только если политика безопасности это допускает). Скопируйте HTTPS URL вида https://mattermost.example.com/hooks/<id> один раз и считайте всю строку секретом уровня bearer: любой, кто может POST, может писать в канал.

На шлюзе сохраните значение в файл вроде /etc/openclaw/secrets.d/mattermost/build-status.url с правами 0440, владелец root, группа узкой роли (например openclaw-notify), по образцу секретов и минимальных прав на узлах MeshMac. Не копируйте URL на каждый Mac: воркеры публикуют событие «сборка завершена» во внутреннюю очередь, а POST в Mattermost выполняет только процесс шлюза. Исходящий трафик согласуйте с ИБ: для self-hosted откройте TLS к хосту сервера Mattermost; при корпоративном forward proxy задайте те же HTTP_PROXY/HTTPS_PROXY, что у демона, и проверьте curl -I с хоста шлюза.

Минимальное тело запроса — JSON с полем text (Markdown). Для карточек используйте attachments с fallback, чтобы мобильные клиенты не теряли смысл. Лимиты одновременных вызовов и размер тела согласуйте с лимитами шлюза и конкурентностью сессий, иначе пики CI перегрузят край интеграции.

Минимальные шаги агрегации статуса с нескольких узлов

Шаг 1. Каждый узел MeshMac по завершении job отправляет на шлюз нормализованное событие (HTTP из CI или внутренний брокер), а не вызывает Mattermost напрямую.

Шаг 2. На шлюзе сведите payload разных провайдеров к одной структуре, затем сформируйте одну строку или вложение для канала — так при смене runner или узла пула лента остаётся читаемой. Рекомендуемые ключи:

Поле Назначение
workflow / pipelineИмя workflow или pipeline для фильтра в Mattermost
statesuccess, failure, cancelled
branch, commitВетка и короткий SHA
run_urlСсылка на страницу run в CI
mesh_node_idМетка узла MeshMac, выполнившего job
provider_run_idИдемпотентность и дедупликация

Шаг 3. Перед POST вычислите ключ идемпотентности из provider_run_id и state; повтор того же состояния в коротком окне не должен дублировать сообщение. Политику повторов при временных сбоях зафиксируйте рядом с очередью и повторами. Если нужна сводка по нескольким узлам для одной логической сборки, агрегируйте на шлюзе (например «все green» / «первый red») и отправьте один broadcast — аналогично описанным сценариям для Google Chat и Matrix в статье про Matrix.

Токены и минимальные права

URL webhook целиком — это секрет. Не логируйте полный путь; для отладки достаточно хоста и последних символов идентификатора. Ротация: отключить старый Incoming Webhook в Mattermost, создать новый, обновить файл на шлюзе, перезапустить сервис — процедуру опишите рядом с каналами тревог и ротацией токенов.

  • Разделение сред. Отдельные webhook и каналы для staging и production, чтобы тестовый pipeline не будил релизный канал.
  • Права в Mattermost. Incoming Webhook публикует от имени интеграции; убедитесь, что политика команды разрешает публикацию в выбранный канал и не запрещает вложения, если вы их используете.
  • CI → шлюз. Если CI передаёт общий секрет, ограничьте его заголовком X-Meshmac-Secret или HMAC по сырому телу на входе шлюза; это не заменяет секрет URL на выходе в Mattermost, а защищает приём.
  • Отказоустойчивость. При переключении узлов пула не переносите файл webhook на builder — держите его только на шлюзе, согласно идеям из кластера, прав и failover.

FAQ: не приходит сообщение — разбор типовых причин

Вопрос: В логах CI всё зелёное, в канале пусто.
Ответ: Проверьте, что шлюз получил событие и выполнил исходящий POST: статус HTTP, тело ошибки Mattermost (часто 400 при невалидном JSON). Выполните тестовый curl -X POST с {"text":"ping"} с того же хоста и под тем же пользователем процесса.

Вопрос: Раньше работало, после выходных — нет.
Ответ: Истёк или отозван webhook в Mattermost; сменился сертификат на прокси; DNS к self-hosted серверу; ночной деплой затронул путь к файлу секрета. Сверьте с runbook ротации.

Вопрос: Сообщения дублируются.
Ответ: Несколько процессов бьют в один URL, или отключена дедупликация по provider_run_id + state. Оставьте единственного отправителя на шлюзе.

Вопрос: Сообщение обрезано или без форматирования.
Ответ: Превышен лимит длины text или некорректный Markdown; укоротите сводку, вынесите детали во вложение с fallback.

Симптом Куда смотреть
401 / 404 на POSTНеверный или удалённый ID в пути /hooks/…
Таймаут исходящегоПрокси, MTU, firewall до хоста Mattermost; переменные окружения демона
Сообщение в другом каналеПоле channel в теле и права интеграции
Mesh · Mattermost · broadcast

Расширяйте пул Mac — канал Mattermost остаётся единой точкой правды

Когда одного builder мало, важны согласованная очередь, один шлюз для исходящих webhook и предсказуемая ротация секретов. Откройте главную Meshmac, чтобы подобрать дополнительную ёмкость MeshMac; загляните в блог за гайдами по мультиузлу и в справку перед оформлением. На странице покупки можно оценить сценарий без входа в личный кабинет для первичного выбора тарифа.

Мультиузел Минимальные права Mattermost
Оформить аренду