OpenClaw MeshMac 실전: 다중 노드 게이트웨이 fail-closed 프록시·패치 화이트리스트·validate JSON으로 드리프트를 끊기
MeshMac 풀에서 OpenClaw 게이트웨이를 여러 대 두면 한 노드만 프록시 런타임 핫 리로드를 넓히고 동료 노드는 엄격한 채로 남는 전형이 반복됩니다. 2026.4.x는 모호한 런타임 변경을 fail-closed로 두고 패치·상향 화이트리스트와 doctor·validate JSON으로만 완화하라는 방향입니다. Node LTS·동일 설치·스냅샷·JSON·jq diff·롤백을 한 런북에 묶어 설정 드리프트를 줄입니다. 풀 전체 동기는 클러스터 설치·설정 동기화와 같이 보세요.
왜 다중 노드에서 정책이 갈라지나
- 단일 진실 부재. 한 호스트만
gateway.proxy.yaml을 고치고 풀 전체에 승격하지 않습니다. - Git 밖 덮어쓰기. LaunchAgent·셸 프로파일이 리뷰 밖 프록시를 주입합니다.
- 조용한 부분 실패. 검증 실패 노드가 트래픽을 받으면 403·502가 상향 장애처럼 보입니다.
프록시 런타임 자세 결정표
| 접근 | 맞는 때 | MeshMac 공유 풀 리스크 |
|---|---|---|
| fail-open 리로드 | 단일 랩 | 오타가 풀 전체 출구를 넓힙니다. |
| fail-closed + 패치 화이트리스트 | 프로덕션 메시·CI·콜백 | 승격·JSON 점검은 필요, 폭발 반경은 작음. |
| 파일만·런타임 미결합 | 문서용 | 프로세스는 옛 메모리 프록시를 씁니다. |
재현 절차·명령
1) Node 핀. 각 호스트에서 node -v를 기록하고 22.x 또는 20.x LTS 한 줄로 통일합니다. 메이저 혼합은 TLS·OTel 기본값 차이로 드리프트처럼 보입니다.
2) 동일 빌드. 내부 채널·tarball 다이제스트를 고정하고 openclaw version을 티켓에 남깁니다.
3) 체크포인트 A(편집 전).
mkdir -p .meshmac-checkpoints/2026-04-25-gateway
cp gateway.proxy.yaml .meshmac-checkpoints/2026-04-25-gateway/
cp com.openclaw.gateway.plist .meshmac-checkpoints/2026-04-25-gateway/ 2>/dev/null || true
4) fail-closed 블록. proxy.runtime.fail_closed: true와 allowed_patch_channels·allowed_upstream_hosts만 허용하고 와일드카드 리로드 URI는 끕니다. 미지의 키·파싱 오류는 시작 거부입니다. 토큰·포트는 IM·토큰 로테와 맞춥니다.
5) doctor → strict validate.
openclaw gateway doctor --json | tee /tmp/gw-doctor.json
openclaw gateway validate --config ./gateway.proxy.yaml --strict --json | tee /tmp/gw-validate.json
6) 포트·토큰. 관리 인트로스펙션은 127.0.0.1, 웹훅은 ACL 뒤 별 포트. 베어러는 키체인·시크릿 핸들만, YAML 평문 금지.
기대 JSON·노드 diff
ok: true는 게이트 전부 통과 시에만. 예시:
{
"ok": true,
"mesh_node_id": "meshmac-pool-7",
"policy_revision": "gateway-proxy@2026-04-25.3",
"fail_closed": true,
"allowed_upstream_hosts": ["api.meshmac.internal", "hooks.slack.com"],
"deny_reason": null
}
다중 노드는 jq로 정렬한 뒤 diff합니다.
for id in gw-a gw-b gw-c; do
ssh "$id" 'openclaw gateway validate --config /etc/openclaw/gateway.proxy.yaml --strict --json'
done | jq -s 'sort_by(.mesh_node_id)' > /tmp/all-gw.json
jq -c '.[] | {mesh_node_id, policy_revision, fail_closed}' /tmp/all-gw.json
롤백 체크포인트
체크포인트 B: 카나리 validate 직후 YAML을 .ok로 한 벌 더 복사합니다. 이상 시 롤백: A 복원 → 유닛 리로드 → 전 노드 validate --strict --json로 ok → 인바운드는 LB·페일오버 순서로. 티켓·실행자를 로그에 남깁니다.
런북에 붙일 상수
- 검증 JSON에
mesh_node_id·policy_revision·fail_closed를 필수로 둡니다. - Node LTS 불일치는 OpenSSL·암호 스위트 차이로 MITM 진단을 흔들게 합니다.
- 패치 아티팩트는 semver·다이제스트 핀,
latest금지.
더 읽기: 플러그인 fail-closed, 속도·세션 FAQ.
다음 단계·CTA
도움말·홈·플랜(로그인 불필요). 클러스터 팀은 설치·동기화·OpenClaw 허브로 정책 리비전을 맞추세요.
드리프트를 끊은 뒤에도 메시를 한 줄로 유지하세요
JSON 검증·jq diff·체크포인트를 런북에 박고, 플랜·도움말·홈에서 노드와 액세스 방식을 이어갑니다.