2026 OpenClaw MeshMac Zulip Incoming Webhook 다중 노드 빌드 알림·실패 요약·봇 URL 로테
협업 엔지니어링 리드는 MeshMac 풀에서 잡이 맥마다 옮겨가도 Zulip 한 스트림에 종료 진실만 남기고 싶습니다. OpenClaw 게이트웨이만 Zulip Webhook을 호출하고 노드는 필드를 정규화해 큐에 넣는 최소 재현입니다. 표·명령·캡처 자리·로테·멱등·빌드 알림 병합을 한 런북에 담았습니다.
Mattermost·Webex·Teams와 같이 단일 발신입니다. 큐 동기화·OpenClaw 허브 참고. 로그 대신 해시만 보관합니다.
이 패턴이 없애는 세 가지 통증
- 시크릿 확산. URL을 맥마다 복사하면 유출·봇 URL 로테 비용이 커집니다.
- 진실 경쟁. 큐 없이 부분 상태가 겹치면 권위 맥을 알 수 없습니다.
- 알림 피로. 프로브·429·빌드 실패가 토픽마다 흩어지면 온콜이 지칩니다.
Zulip 봇 준비
목표. POST 한 번이면 메시지가 올라가는 URL을 얻고 파일은 게이트웨이만 둡니다.
- 설정에서 Incoming Webhook을 추가하고 스트림·토픽을 고정합니다.
- UI의 샘플 curl JSON 키를 그대로 쓰고 필드명을 바꾸지 않습니다.
.../zulip/build-status.url모드0440그룹openclaw-notify— 최소 권한.
캡처: 통합 대화상자 스트림·토픽·URL(키 모자이크).
셸 프로브:
sudo -u openclaw-notify -i
export ZULIP_INCOMING_WEBHOOK_URL='https://your-org.zulipchat.com/api/v1/external/...'
curl -sS -w "\nhttp_code:%{http_code}\n" -X POST "$ZULIP_INCOMING_WEBHOOK_URL" \
-H 'Content-Type: application/json' \
--data-binary '{"content":"**OpenClaw** 프로브 — 출구 OK"}'
봇 URL 로테. 새 URL 발급 → 게이트웨이 파일 교체·리로드·프로브 → 구 통합 폐기. IM·토큰 로테와 동일 순서로 문서화합니다.
게이트웨이 출구 화이트리스트
워커는 종료 레코드만 큐에 넣고 Zulip HTTPS는 게이트웨이만 호출합니다.
- 웹훅에서 호스트를 적습니다. 클라우드
*.zulipchat.com또는 자가 호스트. - 게이트웨이 서브넷만 443 허용, 빌더 VLAN은 동일 호스트 deny.
- 기업 프록시면 신뢰 저장소를 맞추고 로그엔 호스트·상태 코드만.
캡처: GW VLAN 허용·워커 deny 규칙 한 줄.
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
메시지 템플릿
필드 고정: workflow state branch commit run_url mesh_node_id provider_run_id 실패 시 짧은 failure_excerpt.
다중 노드 요약 예:
**CI** `ios-nightly` → **failed** · `main` @ `a1b2c3d`
**노드** `meshmac-pool-3` · **런** [#1842](https://ci.example/runs/1842)
**발췌**
\`\`\`
error: no space left on device
\`\`\`
JSON은 보통 content에 마크다운. 본문 수십 KiB 이하. 타임아웃은 레이트·세션 FAQ와 정합.
캡처: 렌더된 스트림·토픽·코드 블록.
실패 재시도와 멱등 키
429·5xx는 지수 백오프·지터·상한·Retry-After·스트림당 직렬화. 큐 재시도·백프레셔 참고.
멱등. sha256(provider_run_id:state) 등으로 창 이십사에서 칠십이시간 내 성공 기록이 있으면 생략합니다.
| HTTP | 조치 |
|---|---|
400 | 스키마 수정·빡센 재시도 금지 |
401·403 | 로테·권한 |
404 | 통합 삭제·재발급 |
429 | 동시도↓·병합 |
5xx | 상한 재시도·상관 ID |
캡처: 로그에 단일 POST·이백·멱등 스킵.
병합 헬스 프로브 알림
프로브·큐·웹훅 오류가 토픽마다 울리지 않게 임계 초과 시 오에서 십오 분 쿨다운으로 **[ops]** 한 통에 전달 요약·프로브·큐잉 여부를 합칩니다. 페일오버 때 이중 POST를 막습니다.
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"
규칙: 멱등 이십사에서 칠십이시간·본문 수십 KiB·프로브 십오초·병합 오에서 십오분·시크릿 0440.
체크리스트
- curl·UI에서 이백·메시지 확인
- 워커 종료만·GW 중복 제거
- GW만
443빌더 deny - 로테 런북에 담당·프로브·폐기 순
- 전송·헬스는 쿨다운 병합