LB 뒤 게이트웨이 Mac 둘 이상과 Git 빌드 Mac을 가정합니다. rsync·번호 YAML·저장된 LB 북마크면 됩니다. 카나리·스킬 팩, 테넌트·Doctor, 롤링·peer와 짝지으면 조각 병합이 한 줄기로 이어집니다.
테넌트별 설정 디렉터리
모든 호스트에 /etc/openclaw/tenants/<tenant>/ 아래 gateway.d·workflows.d·doctor.d를 동일하게 둡니다. SQLite 상태는 /var/db/openclaw/workflows/<tenant>/에만 두고 조각 rsync에서 빼세요.
- 접두 병합 순서:
10-base.yaml,20-canary.yaml처럼 이름을 붙여 두 스쿼드가 병합 우선순위를 다투지 않게 합니다. - 패리티 게이트: 모든 게이트웨이에서
openclaw config hash --tenant <id>를 돌리고, 다이제스트가 어긋나면 승격을 거절합니다. - 즉시 롤백:
tenants/<tenant>.prev를 직전 정상 트리를 가리키는 심볼릭으로 두면 원자적 한 번에 되돌립니다.
시크릿은 Git 밖: /var/db/openclaw/secrets/<tenant>를 노드마다 동일한 POSIX ACL로 마운트해 조각은 코드 리뷰에서만 diff되게 합니다. 전용 게이트웨이를 더할 때는 재무 협의 전에 공개 요금제로 스펙을 맞춰 보세요.
템플릿 병합 전략
00-platform.yaml → 번호 오버레이 → 선택 99-canary.yaml(카나리 디스크만). 사전순 병합, 스칼라는 후승, 복합 블록은 확장만. openclaw config lint --tenant로 비순환을 증명하고 dry-run 결과를 티켓에 붙입니다.
MAINTENANCE=drain을 두고 진행 중 잡이 끝날 때까지 기다린 뒤 launchd를 재기동하고 플래그를 해제하세요. 시크릿 순환은 리로드에 맡기지 말고 파일을 원자적으로 바꾼 뒤 깨끗한 프로세스 경계에서 환경을 다시 읽게 합니다.리로드 vs 재시작 키를 README에 적어 두고, openclaw.lock 패리티를 병합과 같이 검증하세요.
카나리 노드 선정과 롤백
승격 창마다 카나리 게이트웨이 한 대(보통 99-canary.yaml)만 고릅니다. LB 가중치 약 5%부터, 오류·p95·준비 JSON을 두 프로브 간격 지켜 본 뒤 슬라이스를 키웁니다. 카나리는 자기 워크플로 하위에서만 dequeue합니다.
가중치·티켓·JSON 스냅샷을 남기고 월간 원클릭 롤백을 연습합니다. 헬스가 빨강이면 카나리 가중치 0, tenants/<tenant>→.prev, 재시작급 키였다면 그 노드만 bounce합니다.
Doctor·헬스 체크 병합
게이트웨이마다 단일 준비 URL을 노출하고, openclaw doctor --json·게이트웨이 자기 리스너에 대한 합성 루프백·디스크/APFS 여유를 한 JSON으로 합칩니다. LB와 사람이 같은 면을 curl합니다. Doctor가 노란데 합성 트래픽은 성공이면 HTTP 200에 "status":"degraded"로 트래픽은 유지하고 페이징만 크게 울립니다.
#!/usr/bin/env bash
set -euo pipefail
TENANT="${TENANT:-demo}"
/usr/local/bin/openclaw doctor --tenant "$TENANT" --json >/tmp/oc-doctor.json
/usr/bin/curl -fsS --max-time 2 "https://127.0.0.1:8443/healthz" -o /tmp/oc-gateway.json
/usr/bin/python3 - <<'PY'
import json
d=json.load(open("/tmp/oc-doctor.json")); g=json.load(open("/tmp/oc-gateway.json"))
print(json.dumps({"tenant":"demo","doctor_ok":d.get("ok"),"gateway":g.get("status")}))
PY
노드마다 launchd로 매분 스크립트를 돌리고, 엣지 프록시가 파일 출력을 긁거나 아주 작은 HTTP 래퍼로 감싸도 됩니다. 링크한 테넌트 가이드의 노티파이어 패턴을 쓰면 JSON에 웹훅 다이제스트 필드를 더하세요.
최소 재현 체크리스트
- 부트스트랩 패리티. 동일 macOS 빌드를 깔고 테넌트 디렉터리를 깐 뒤, 모든 clustervps 노드에서
openclaw version --json이openclaw.lock과 맞는지 확인합니다. - 템플릿만 동기화. Git에서 번호 조각만 rsync하고, 워크플로 SQLite 경로와 시크릿 마운트는 제외합니다.
- 린트·해시.
openclaw config lint --tenant <id>후 클러스터 전역에서openclaw config hash --tenant <id>를 실행합니다. - 카나리 가중치. 트래픽 5%를 옮기고 유지한 뒤, 승격하거나 저장된 밸런서 JSON으로 복구합니다.
- 병합 헬스 검증. 스테이징에서 합성 경로를 의도적으로 실패시키고, 준비 JSON이 한 번은 회귀를 드러내는지 확인합니다.
- 드릴 기록. 티켓 id, 액터, 체크섬을 승격 감사 로그에 붙여 다음 당직이 맥락을 이어받게 합니다.
체크리스트가 녹색이면 고객 영향 없이 월간 리허설 가능한 clustervps 멀티 노드 패턴이 갖춰진 것입니다. 수제 게이트웨이가 버거우면 스테이징에서 이미 검증한 스펙으로 공개 구매 흐름에서 용량을 더하고, 온보딩용으로 도움말을 콘솔 옆에 띄워 두세요. 홈과 요금은 로그인 없이 열리니 팀 정렬에 쓰기 좋습니다.