onboard·doctor·게이트웨이 설명을 참고하세요. GitOps 연동: 클러스터의 operationState만으로는 부족할 때, 동일 리비전에서 dry-run 성격의 프리플라이트와 이미지 다이제스트가 알림 노이즈를 줄입니다. 내장 링크: 게이트웨이 보안, 실패 복구·재시도, 컨테이너 레지스트리 풀 매트릭스.
operationState를 주지만, kubeconform·다이제스트 검사는 잘못된 YAML을 페이징 전에 걸러줍니다.launchd 프로브를 두면 운영이 단순해집니다.의사결정: GitOps 신호 vs Mac 측 핸들러
| 신호 | Argo CD 출처 | Mac 측 최소 패턴 |
|---|---|---|
| 동기 실패 | on-sync-failed, application.status.operationState |
Webhook JSON 파싱 → REST로 Application 조회 → message + 리비전 캡처 |
| 헬스 저하 | on-health-degraded, desired vs live |
선택: resources 요약용 추가 호출, 페이로드 상한 |
| 프리플라이트 게이트 | Argo와 동일 Git 리비전 | kustomize build / helm template, kubeconform, 선택 crane manifest |
사전 조건 (Node, 토큰, 아웃바운드)
Node.js 22 LTS를 설치한 뒤 온보딩 문서에 따라 openclaw onboard를 실행합니다. 데몬이 필요하면 openclaw onboard --install-daemon(macOS는 docs.openclaw.ai/cli/onboard에 맞게)으로 launchd에 고정합니다. openclaw doctor는 docs.openclaw.ai/cli/doctor에 설명된 대로 설정 정규화·게이트웨이 런타임 점검에 쓰이며, 경고를 무시한 채 웹훅 부하를 받으면 같은 문제가 재발합니다.
~/.openclaw/openclaw.json에서 게이트웨이 바인드 포트를 확인합니다(예: 18789). 스크립트에 넣기 전에 openclaw gateway status가 있으면 우선 실행하고, 없으면 문서의 /health 경로를 launchd와 동일 사용자로 curl합니다.
ARGOCD_SERVER는 UI와 동일 호스트명으로 두고, 읽기 전용 ARGOCD_TOKEN(argocd account generate-token 또는 SSO)을 발급해 chmod 600 파일에 저장합니다. 아웃바운드는 Argo CD HTTPS, 이미지 레지스트리, 요약을 받을 관측 URL만 허용 목록에 두세요. 토큰 순환은 Argo RBAC 검토와 같은 Runbook에 적습니다.
node -v
openclaw onboard
openclaw doctor
# 바인드 주소·포트 확인(버전에 따라 경로 상이)
test -f "$HOME/.openclaw/openclaw.json" && head -n 40 "$HOME/.openclaw/openclaw.json"
Webhook과 게이트웨이 연결 단계 체크리스트
Caddy 또는 nginx에서 TLS를 종료하고 127.0.0.1의 OpenClaw로 전달합니다. 원시 본문과 Authorization을 유지해 JSON.parse 전에 Bearer·HMAC을 검증합니다. 엣지에서 클라이언트 인증서를 쓰더라도 Argo 페이로드는 별도로 검증해야 재전송이 우회하지 못합니다.
service.webhook에 on-sync-failed / on-health-degraded 등 랜덤 HTTPS 경로를 등록합니다.{{.app.metadata.name}}, operationState.message, sync.revision)를 JSON 스키마에 매핑합니다.GET /api/v1/applications/{name} → operationState(필요 시 resources).phase, revision, preflightExit, 발췌)을 아웃바운드 POST합니다.curl --data-binary @notify.json -H "Authorization: Bearer $INGEST_SECRET" "$WEBHOOK_URL"curl -fsS --max-time 20 \
-H "Authorization: Bearer ${ARGOCD_TOKEN}" \
"${ARGOCD_SERVER}/api/v1/applications/${APP_NAME}" \
| jq '{sync:.status.sync.status,health:.status.health.status,phase:.status.operationState.phase,msg:.status.operationState.message}'
프리플라이트 스크립트와 헬스 프로브 매개변수
Argo가 동기하는 동일 리비전을 mktemp에 clone합니다. kustomize build / helm template 후 kubeconform으로 검증하고, 필요 시 crane manifest로 이미지를 확인합니다. 비대화형 clone을 위해 GIT_TERMINAL_PROMPT=0을 쓰고, 이벤트마다 워크스페이스를 삭제해 디스크에 비밀이 남지 않게 합니다.
GitOps와의 연결: 프리플라이트는 Argo를 대체하지 않습니다. 통과했는데도 OutOfSync면 라이브 클러스터와 diff하고, 실패하면 요약 JSON을 티켓에 붙이면 원인 추적이 빨라집니다.
기본값 예시(SLO에 맞게 조정):
- 프로브 간격:
launchd에서 게이트웨이curl헬스를 15초마다. - 프로브 타임아웃: 요청당 3초, 연속 3회 실패 시 비정상 처리.
- 요약 POST:
curl --max-time 25, 시도 사이 2·4·8초 대기.
openclaw doctor
OC_PORT=$(jq -r '.gateway.port // 18789' "$HOME/.openclaw/openclaw.json")
curl -fsS --max-time 3 "http://127.0.0.1:${OC_PORT}/health" || exit 1
read -r -d '' SUMMARY <<'JSON'
{"schema":"macpull.argocd.sync.v1","app":"payments","revision":"abc123","phase":"Failed","preflightExit":0,"excerpt":"truncated operator message..."}
JSON
for s in 2 4 8; do
curl -fsS --max-time 25 -H "Content-Type: application/json" \
--data-binary "$SUMMARY" "$OBSERVABILITY_URL" && break
sleep "$s"
done
FAQ (인증 실패, 타임아웃, 재시도)
ARGOCD_TOKEN을 갱신하고, nginx가 Authorization을 유지하는지 확인합니다. 수신 비밀은 개행 trim 후 상수 시간 비교합니다.
API 조회에만 curl --max-time을 늘리고 웹훅은 짧게 유지합니다. grpc-web 설정을 CLI 로그인과 맞추고, 프록시 뒤에서는 HTTPS_PROXY를 일관되게 둡니다.
POST는 최대 세 번, 키는 앱+리비전+uid, 409 Conflict면 중복으로 중단합니다.
요약. Node 22+, 깨끗한 openclaw doctor, TLS 웹훅, 읽기 전용 Argo 토큰, 일회용 프리플라이트 디렉터리, 2·4·8초 요약 재시도가 최소 세트입니다. 리스너와 launchd 로그를 위해 상시 원격 Mac이 노트북보다 유리합니다.
구매·지원: 로그인 없이 요금, 구매, 고객 지원, 기술 블로그를 이용할 수 있습니다.
MacPull은 Apple Silicon Mac Mini 호스팅으로 OpenClaw 게이트웨이·TLS 인그레스·Argo CD 웹훅 옆의 GitOps 프리플라이트를 한 Runbook에 묶기 쉽게 합니다.