HowTo · Zulip · OpenClaw · мультиузел

2026 OpenClaw MeshMac на практике: Zulip Incoming Webhook — broadcast статуса сборки с нескольких узлов, краткая сводка ошибок и ротация URL бота как смена токена

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

Для пула MeshMac нужен один канал Zulip с честным терминальным статусом и mesh_node_id без гонок постов. Ниже — шаги: шлюз OpenClaw единственный HTTPS клиент к Zulip, узлы шлют события в очередь, белый список исходящего трафика, markdown шаблон, идемпотентность и слитые ops алерты. Смежно: Mattermost, Webex, хаб OpenClaw, мультиузел MeshMac.

Три боли без шлюза

  1. Секреты на N Mac — утечки и больная ротация URL.
  2. Нет очереди — гонки частичных статусов CI.
  3. Разрозненные алерты — probe очередь и HTTP в разных темах.

Матрица отправителя

Решите до прода кто держит TLS к Zulip.

Вариант Плюсы Минусы
Шлюз OpenClawОдин URL один белый список аудитНужна очередь к шлюзу
POST с каждого MacМеньше сервисовN секретов сложный firewall

Подготовка бота Zulip

Цель: один HTTPS incoming webhook URL как bearer только на шлюзе OpenClaw не на Mac сборщиках.

Zulip: интеграция incoming webhook stream builds topic meshmac скопировать URL один раз сохранить образец curl из UI как эталон JSON.

Секрет: файл /etc/openclaw/secrets.d/zulip/build-status.url режим 0440 группа openclaw-notify см. минимальные права. Ротация как токен: новый URL в Zulip замена файла перезапуск проба отзыв старого runbook рядом с ротацией токенов.

Проверка с шлюза под сервисным пользователем в тестовой теме:

sudo -u openclaw-notify -i
export ZULIP_INCOMING_WEBHOOK_URL='https://your-org.zulipchat.com/api/v1/external/your_integration?api_key=REDACTED'
curl -sS -w "\nhttp_code:%{http_code}\n" -X POST "$ZULIP_INCOMING_WEBHOOK_URL" \
  -H 'Content-Type: application/json' \
  --data-binary '{"content":"**OpenClaw probe** — исходящий канал с шлюза OK"}'

Место для скриншота: диалог интеграции Zulip с выбранным stream topic и сгенерированным URL ключ в опубликованной документации размыть.

Белый список исходящего трафика шлюза

Только шлюз POSTит Zulip узлы шлют build_finished в очередь см. синхронизацию очереди.

Firewall: TCP443 к hostname из URL например *.zulipchat.com только с подсети шлюза deny с VLAN сборщиков. TLS inspection — те же CA что у OpenClaw логировать хост и код не полный URL.

DNS и SNI:

dig +short your-org.zulipchat.com
openssl s_client -connect your-org.zulipchat.com:443 -servername your-org.zulipchat.com </dev/null | head -n 5

Таймауты клиента — лимиты шлюза.

Место для скриншота: строка правила firewall VLAN шлюза разрешение к хосту Zulip порт 443 и запрет с VLAN сборщиков.

Шаблон сообщения

Воркер отдаёт workflow state branch commit run_url mesh_node_id provider_run_id и короткий failure_excerpt без секретов.

Markdown мультиузла одно сообщение на терминальный переход:

**CI** `ios-nightly` → **failed** · `main` @ `a1b2c3d`
**Node** `meshmac-pool-3` · **Run** [#1842](https://ci.example/runs/1842)
**Excerpt**
\`\`\`
error: no space left on device
\`\`\`

Обычно поле content размер тела умеренный иначе 400.

Место для скриншота: сообщение в веб-клиенте Zulip с потоком темой и свёрнутым блоком кода.

Повторы при сбоях и ключи идемпотентности

На 429 и 5xx — backoff с джиттером Retry-After см. повторы очереди и backpressure.

Идемпотентность: ключ из provider_run_id плюс терминальный state окно дедупа сутки семьдесят два часа против дублей после сети или рестарта.

HTTP Действие
400Шаблон без tight retry
401 / 403Ротация URL файл секрета проба
404Новый URL конфиг
429Меньше параллелизма backoff merge ops
5xxBounded retry одна карточка

Цифры для runbook: markdown порядка один два KiB таймаут клиента десять двадцать секунд дедуп окно двадцать четыре семьдесят два часа на инциденте один исходящий поток на stream.

Место для скриншота: хвост журнала шлюза с одним POST кодом двести и записью о cache hit идемпотентности пропускающей дубликат.

Слияние health-проб и алертов доставки

Probe очередь и ошибки HTTP не спамят отдельными темами: одно merged ops сообщение при пересечении порогов плюс последние коды доставки и жив ли enqueue.

Префикс **[ops]** stream incidents кулдаун пять пятнадцать минут см. backpressure. Failover — права и failover без двойного POST.

Минимальный cron probe под тем же пользователем сервиса логируйте код выхода а не URL:

TS=$(date -u +%Y-%m-%dT%H:%M:%SZ)
BODY=$(printf '%s' "{\"content\":\"**[ops probe]** ${TS}\"}")
/usr/bin/curl -fsS -m 15 -X POST "$ZULIP_INCOMING_WEBHOOK_URL" \
  -H 'Content-Type: application/json' \
  --data-binary "$BODY" \
  || logger -t openclaw-zulip-probe "probe_failed"

Краткий чеклист перед продом

  • С шлюза curl к webhook возвращает двести и в Zulip видно тестовое сообщение.
  • Воркеры публикуют только терминальные переходы дедупликация на шлюзе включена.
  • Firewall разрешает Zulip только с шлюза сборщики без прямого egress.
  • Runbook ротации содержит владельца команду пробы и шаг отзыва старого URL.
  • Сбои health и доставки сливаются под кулдауном.
MeshMac · мультиузел · Zulip

Масштабируйте пул удалённых Mac — секрет Zulip остаётся на шлюзе

Новые узлы MeshMac должны добавлять пропускную способность CI а не новые копии incoming webhook на каждой машине. Откройте тарифы без входа сравните планы с главной Meshmac прочитайте справку по SSH и VNC и оглавление блога прежде чем расширять мультиузловой контур OpenClaw и чат Zulip.

Один шлюз Белый список TLS Zulip
Аренда мультиузла