HowTo · Zulip · 다중 노드

2026 OpenClaw MeshMac Zulip Incoming Webhook 다중 노드 빌드 알림·실패 요약·봇 URL 로테

2026.04.24 Meshmac R&D Team 9분 읽기

협업 엔지니어링 리드는 MeshMac 풀에서 잡이 맥마다 옮겨가도 Zulip 한 스트림에 종료 진실만 남기고 싶습니다. OpenClaw 게이트웨이Zulip Webhook을 호출하고 노드는 필드를 정규화해 큐에 넣는 최소 재현입니다. 표·명령·캡처 자리·로테·멱등·빌드 알림 병합을 한 런북에 담았습니다.

이 패턴이 없애는 세 가지 통증

  1. 시크릿 확산. URL을 맥마다 복사하면 유출·봇 URL 로테 비용이 커집니다.
  2. 진실 경쟁. 큐 없이 부분 상태가 겹치면 권위 맥을 알 수 없습니다.
  3. 알림 피로. 프로브·429·빌드 실패가 토픽마다 흩어지면 온콜이 지칩니다.

Zulip 봇 준비

목표. POST 한 번이면 메시지가 올라가는 URL을 얻고 파일은 게이트웨이만 둡니다.

  1. 설정에서 Incoming Webhook을 추가하고 스트림·토픽을 고정합니다.
  2. UI의 샘플 curl JSON 키를 그대로 쓰고 필드명을 바꾸지 않습니다.
  3. .../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는 게이트웨이만 호출합니다.

  1. 웹훅에서 호스트를 적습니다. 클라우드 *.zulipchat.com 또는 자가 호스트.
  2. 게이트웨이 서브넷만 443 허용, 빌더 VLAN은 동일 호스트 deny.
  3. 기업 프록시면 신뢰 저장소를 맞추고 로그엔 호스트·상태 코드만.

캡처: 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
  • 로테 런북에 담당·프로브·폐기 순
  • 전송·헬스는 쿨다운 병합

요약. 게이트웨이가 Zulip Webhook 단일 소유·MeshMac 노드는 동일 스키마 빌드 알림. ·블로그·도움말 로그인 불필요.

다중 노드 원격 Mac으로 Zulip 시크릿은 한 번만

노드만 늘리고 URL은 한 번. 플랜·에서 MeshMac 비교 후 SSH·VNC로 접속을 고르면 풀 알림 설계와 맞습니다.