Три боли без шлюза
- Секреты на N Mac — утечки и больная ротация URL.
- Нет очереди — гонки частичных статусов CI.
- Разрозненные алерты — 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 |
5xx | Bounded 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 и доставки сливаются под кулдауном.
Масштабируйте пул удалённых Mac — секрет Zulip остаётся на шлюзе
Новые узлы MeshMac должны добавлять пропускную способность CI а не новые копии incoming webhook на каждой машине. Откройте тарифы без входа сравните планы с главной Meshmac прочитайте справку по SSH и VNC и оглавление блога прежде чем расширять мультиузловой контур OpenClaw и чат Zulip.