2026 OpenClaw 프론트 실전:
원격 Mac에서 Cloudflare Pages Deploy Hook으로 스모크·보안 Headers 순찰·빌드 요약 회수
대상: Cloudflare Pages에 정적·프레임워크 출력을 올리고 배포 직후 엣지 캐시·보안 헤더·Safari 서명을 한 번에 닫으려는 팀. Netlify Deploy Hook 런북(별도 글)과 달리 여기서는 CF 전용 훅 URL·캐시 무효·_headers 규칙 diff·curl 배치·OpenClaw 게이트웨이 실패 요약에 초점을 둡니다. slug: 2026-openclaw-cloudflare-pages-deploy-hook-remote-mac-howto.html. 연계: HTTP/3·QUIC 검수, Service Worker 출시, 빌드 메트릭 PR 요약, 블로그 목록.
01 배포 성공만으로는 부족한 세 가지
① Pages 빌드가 끝어도 엣지 캐시가 오래된 HTML·해시 없는 자산을 붙잡으면 스모크가 거짓 음성을 냅니다. ② _headers·Transform Rules·Workers가 섞이면 CSP·HSTS가 프리뷰와 프로덕에서 다르게 보입니다. ③ 훅 본문만으로는 실패한 단계·재시도 한도를 팀 채널에 남기기 어렵습니다.
아래 표는 Netlify 훅 글과 역할을 나누고, 같은 원격 Mac 러너에서 curl 배치로 엣지 상태를 먼저 고정합니다.
02 Netlify 훅 대비 CF Pages에 특화된 지점
| 항목 | Netlify Deploy Hook(참고) | Cloudflare Pages(이 글) |
|---|---|---|
| 훅·비밀 | 사이트·브랜치별 Build hook URL. | Pages → Settings → Deploy hooks 고유 URL, 동일하게 Ingress에서 검증. |
| 캐시 | 엣지 동작이 플랫폼별. | 배포 후 Purge 범위·cf-cache-status·age를 curl NDJSON에 기록. |
| 헤더 | _headers·플러그인. |
저장소 _headers + 대시보드 규칙을 정규화 JSON으로 맞춘 뒤 diff. |
| 검증 루프 | 워밍·스모크·링크(별도 글). | curl 병렬 배치 → 헤더 diff → Playwright webkit·chromium 스모크. |
한 줄 요약: CF에서는 캐시 무효와 헤더 기준선을 먼저 맞춘 뒤 브라우저 스모크를 돌리면 재현성이 올라갑니다.
03 재현 런북(최소 단계)
- 훅·컨텍스트:
CF_PAGES_COMMIT_SHA·프리뷰/프로덕DEPLOY_URL·OPENCLAW_RUN_ID를 셸에 export합니다. - Ingress: 공유 비밀·HMAC을 검증하고 즉시 202를 돌린 뒤 워커 큐에 Runner를 붙입니다.
- 캐시: 자산 지문이 바뀌면 URL 단위 또는 전역 Purge를 선택하고, 실패 시 한 단계 넓힙니다.
- curl 배치: 필수 경로·정적 번들 URL 목록을
xargs -P또는 작은 Node 풀로 돌려curl -fsSI로 상태·cf-cache-status를 NDJSON에 씁니다. - Headers diff:
curl -I응답 헤더를 소문자 키로 정렬해headers_observed.json으로 저장하고headers_baseline.json과 구조 비교합니다. - 스모크:
npx playwright test tests/smoke --project=webkit --project=chromium를 배포 URL 기준으로 실행합니다. - build_summary:
.openclaw/reports/build_summary.json에 단계별 ms·실패 URL·exit_code를 넣고Idempotency-Key: ${GIT_SHA}:cf-pages:${OPENCLAW_RUN_ID}:summary로 Webhook에 POST합니다.
04 OpenClaw 게이트웨이·실패 요약
게이트웨이는 단계마다 phase(purge|curl_batch|headers_diff|smoke|callback)를 붙이고, 중단 시 첫 실패 단계 한 줄·상위 세 URL·exit_code만 채팅·PR 코멘트에 보냅니다. 동일 커밋 재훅은 멱등 키로 흡수합니다.
토큰·훅 URL은 로그에 마스킹하고, 트레이스는 원격 Mac 로컬 경로 포인터만 공유합니다.
05 복붙용 근거(세 줄)
- 워밍: 필수 경로 200·
cf-cache-status기대값(예:HIT전략이면 문서화). - 헤더: CSP·
strict-transport-security·permissions-policy키가 baseline과 동일한지. - 요약 JSON:
schema: "build_summary/v1",cf_pages,failed_phase,curl_errors[].
06 FAQ
| 증상 | 점검 |
|---|---|
| 스모크만 실패·curl은 200 | 프리뷰 호스트와 프로덕 별명이 다른지, Playwright baseURL이 최신 배포인지 확인. |
| 헤더 diff가 랜덤 | Workers가 붙은 경로와 순수 Pages 자산 경로를 분리해 baseline을 둡니다. |
훅 직후에도 HTML이 옛날 버전처럼 보입니다.
Purge 범위·DEPLOY_URL·SW 캐시를 함께 봅니다. SW PR 요약 글의 캐시 키 점검과 연결하세요.
429·503이 curl 배치에서 납니다.
동시성을 낮추고 지수 백오프를 워밍 단계에만 적용합니다. 게이트웨이에 실패 단계와 샘플 URL 두 개를 남깁니다.