2026 OpenClaw 대여 Mac Mini 실전
GitHub repository_dispatch API로 야간 이벤트 체인·침묵 창·백오프 알림
자동화 엔지니어가 맥 미니 대여 호스트에서 칠곱이십사 OpenClaw를 돌릴 때, GitHub 쪽 제어 평면을 “워크플로 파일 하나”에 묶지 않으려면 GitHub API의 POST /repos/{owner}/{repo}/dispatches와 repository_dispatch가 적합합니다. event_type 문자열과 client_payload JSON이 계약이고, YAML의 on.repository_dispatch.types가 구독합니다. 본문은 workflow_dispatch 야간 배치 글과 축을 나눕니다. 그쪽은 파일 경로·inputs 중심이고, 여기서는 야간 작업을 이벤트 체인으로 잇습니다. 연계: 크론·웹훅 백오프·스케줄 매트릭스·하트비트·자가 복구·OpenClaw 모아보기.
트리거: OpenClaw 또는 launchd가 배치마다 한 번 첫 event_type을 보냅니다. 체인: 세그먼트 A 워크플로가 payload를 검증한 뒤 성공하면 동일 correlation_id로 세그먼트 B event_type을 다시 dispatches합니다(맥 PAT 또는 잡의 GITHUB_TOKEN 권한 설계는 팀 정책에 맞추세요). 요약: OpenClaw는 실행 URL·HTTP 코드·잘린 응답을 모아 배치당 한 번의 digest로 올려 사람에게 노이즈를 줄입니다.
workflow_dispatch가 “이 YAML 파일을 지금 돌려라”에 가깝다면, repository_dispatch는 “이 저장소에 야간 작업용 이벤트가 찍혔다”는 신호를 여러 워크플로가 나눠 듣는 형태에 가깝습니다. 그래서 외부 스케줄러·게이트웨이·렌탈 Mac Mini가 동일한 GitHub API 패턴으로 밀어 넣기 좋고, 이벤트 이름만 바꿔 세그먼트를 늘리면 체인을 확장할 수 있습니다. digest 본문에는 repository·event_type·마지막 세그먼트·Actions run URL·재시도 횟수 정도만 넣고, 비밀·전체 로그는 제외하는 것이 운영 상식입니다.
PAT 최소 권한
Fine-grained PAT를 자동화 저장소 하나에만 묶고 메타데이터 읽기와 콘텐츠 읽기·쓰기를 켜면 POST https://api.github.com/repos/OWNER/REPO/dispatches 계약을 만족하는 경우가 많습니다. workflow_dispatch 전용 글에서 필요했던 Actions 쓰기를 맥 래퍼에 꼭 실지 말고, 잡 안에서만 Actions API가 필요하면 GITHUB_TOKEN으로 분리하세요. 조직 정책이 허용하면 월 단위 회전은 GitHub App 설치 토큰으로 옮기고, 비상 롤백은 게이트웨이 업그레이드·롤백 티켓과 같은 번호 체계로 묶으면 감사가 쉽습니다. 토큰이 패키지 배포·조직 관리까지 겹치면 즉시 쪼개세요.
체인의 두 번째 dispatches를 Actions 잡에서 호출할 때는 저장소 설정의 기본 권한을 “읽기 및 쓰기”로 두었는지, 혹은 permissions: 블록으로 contents: write를 명시했는지 확인하세요. 최소 권한 원칙은 “맥에 싣는 비밀”과 “잡이 잠깐 쓰는 토큰”을 나누는 데서 완성됩니다.
client_payload 약정
client_payload는 팀이 합의한 버전 있는 계약입니다. 첫 잡에서 jq로 필수 키를 검증하고, 큰 산출물은 아티팩트나 객체 스토리지에 두고 payload에는 참조만 넣으면 GitHub 본문 한도에 걸리지 않습니다.
| 필드 | 역할 |
|---|---|
| batch_id | 맥 쪽 멱등·쿨다운 키 |
| segment | 로그·OpenClaw digest 라벨 |
| correlation_id | 맥 로그·Actions·웹훅 공통 ID |
| issuer | openclaw_gateway | launchd | manual |
| artifact_ref | 무거운 JSON 대신 포인터·해시 |
on:
repository_dispatch:
types: [openclaw_night_a, openclaw_night_b]
체인 작업 상태 머신
배치를 작은 명시 상태로 둡니다: QUEUED(맥이 일정 수락) → SEGMENT_A(첫 dispatch 전달) → SEGMENT_B → COMPLETED 또는 FAILED. 마지막 성공 batch_id·세그먼트는 서비스 홈이나 /var/db 밑 JSON에 남겨 재부팅 후 중복 부작용을 막습니다. 시계 소유자는 하나로 정하세요: 잡 끝에서 curl로 다음 이벤트를 보내거나 재사용 워크플로에서 gh api, 혹은 맥이 Checks를 보고 다음을 쏘는 방식 중 한 가지입니다. 넓은 그림은 다중 시나리오 오케스트레이션 글과 맞춰 보세요.
openclaw_night_a에next_event_type힌트를 넣되, 검증 전에는 자동 트리거하지 않습니다.- 검증 실패 시 FAILED로 전이하고 알림 경로는 한 번만 탑니다.
- 성공 시 동일
correlation_id로openclaw_night_b를 POST합니다.
침묵 창
APFS 부하가 큰 구간은 호스트 현지 01:00–05:00 같은 침묵 창에 두고, launchd plist가 그 안에서만 래퍼를 호출하게 합니다. 창 밖이면 GitHub를 부르지 않고 종료 코드 0으로 빠져나가면 Actions 대기열이 불필요하게 돌지 않습니다. 사람이 수동 dispatch할 때를 대비해 워크플로 첫 단계에서 payload의 TZ·window를 검사해 즉시 noop 해도 됩니다. OpenClaw는 건너뛴 호출을 큐 파일에 쌓았다가 창이 열릴 때 digest 한 번으로 합치면 launchd 헬스·웹훅 패턴과도 잘 맞습니다.
실패 알림
429·5xx에는 지수 백오프와 Retry-After를 따르고, 총 시도 상한(예: 다섯 번)을 넘기면 에스컬레이션합니다. 본문은 HMAC-SHA256으로 서명한 짧은 JSON으로, batch_id·마지막 HTTP·잘린 응답·저장소 이름만 넣고 PAT는 절대 포함하지 마세요. OpenClaw가 수집기 웹훅을 구독해 맥 로그 꼬리를 붙이면, 일시적 GitHub 장애로 야간 작업 전체가 호출되는 일을 줄일 수 있습니다.
curl·gh 재현 예시
GITHUB_TOKEN에 Fine-grained PAT를 넣거나 gh auth login 후 GH_TOKEN을 사용하세요. 맥에서는 --connect-timeout·--max-time을 고정하세요.
curl -sS -X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${GITHUB_TOKEN}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/OWNER/REPO/dispatches \
-d '{"event_type":"openclaw_night_a","client_payload":{"batch_id":"20260424","segment":"a","correlation_id":"'"$(uuidgen)"'","issuer":"launchd"}}'
gh api -X POST repos/OWNER/REPO/dispatches --input - <<'JSON'
{
"event_type": "openclaw_night_b",
"client_payload": {
"batch_id": "20260424",
"segment": "b",
"correlation_id": "REPLACE_WITH_UUID",
"issuer": "openclaw_gateway"
}
}
JSON
노트북에서 한 번 말려 보고 Actions 탭에 워크플로가 뜨는지 확인한 뒤, 동일 명령을 대여 맥의 root 소유 launchd 래퍼로 옮기면 재현이 끝납니다.
HowTo 요약
- 저장소에 위 types를 가진
repository_dispatch워크플로를 기본 브랜치에 병합합니다. - 좁은 PAT로 수동
curl한 번, 실행 URL을 메모합니다. - 맥에 로그 디렉터리·쿨다운 JSON 경로를 만들고 침묵 창에만 도는 plist를 로드합니다.
- 세그먼트 A 성공 시 B 이벤트를 POST하는 스텝을 추가합니다.
- 의도적으로 429를 한 번 내 백오프·로그가 기대대로인지 확인합니다.
- 백오프 소진 시에만 스테이징 수집기로 서명 웹훅을 검증한 뒤 운영에 켭니다.
FAQ
- 204인데 Actions에 안 보여요
types철자·기본 브랜치 YAML·비활성 워크플로를 확인하세요. private 포크 규칙도 점검합니다.- feature 브랜치에서 테스트하려면요
repository_dispatch는 기본 브랜치 워크플로가 받는 전제가 강합니다. 실험 저장소를 따로 두는 편이 덜 아픕니다.- OpenClaw가 GitHub를 직접 소유하지 않게 하려면
- 맥·게이트웨이는 첫 dispatch와 체크포인트·digest만 맡기고, 체인 중간 POST는 Actions 잡에 두면 경계가 선명합니다.
- 잡 안에서 다음 dispatch가 403이에요
GITHUB_TOKEN은 동일 저장소에는 쓸 수 있지만 다른 포크·다른 저장소로 넘기면 막힙니다. 크로스 저장소 체인이면 별도 PAT나 OIDC 연동 설계가 필요합니다.