2026 OpenClaw 租用 Mac Mini 實戰
以 GitHub API 觸發 workflow_dispatch 編排夜間批處理鏈、冪等檢查點與退避告警
在七乘二十四託管的租用 Mac Mini上跑 OpenClaw,夜間批處理常要「雲端管線可審計、觸發與祕密靠近機器」。與GitLab Scheduled Pipeline把排程放在平台內不同,本文刻意以 GitHub Actions 的 workflow_dispatch 當唯一入口:由租用機準時呼叫 GitHub REST 送 POST /repos/.../actions/workflows/{workflow_id}/dispatches,雲端跑鏈、本機管時鐘、檢查點與退避。延伸:排程與佇列矩陣、launchd 分區、cron 扇出與退避。
令牌最小權限
優先建立 Fine-grained PAT,僅綁單一儲存庫,權限收斂到能呼叫「Actions:讀寫」或官方文件允許觸發 workflow_dispatch 的最小集合;避免把組織層級管理或內容寫入一併打開。若團隊仍用 Classic,請用僅限 repo範圍、設定到期日,並把權杖放進受保護的環境檔而非寫死在 shell 歷史。檢查點:用唯讀帳呼叫同一端點應被拒絕;輪替時採雙權杖重疊一期再撤舊值,符合長跑節點變更紀律。
cron/launchd 觸發
夜間視窗建議落在租用機本地低互動時段,並以 launchd(可設 ThrottleInterval、崩潰退避)或 cron 包一層薄腳本:載入環境檔、寫結構化日誌、呼叫 curl 觸發 GitHub。重點是不在雲端再排一個「第二套時鐘」與本機打架;GitHub 只接收 dispatch,長耗時步驟仍在 Actions 或回呼 OpenClaw。檢查點:手動跑一次 plist/crontab 後,Actions Runs 出現新列且時間戳與 Mac 日誌相差在一分鐘內。
冪等檢查點
在 workflow 宣告 workflow_dispatch.inputs(例如 run_mode、batch_key),讓雲端 job 與 OpenClaw 任務契約化。Mac 端以小型狀態檔記錄「上一個成功送出的 batch_key」;重啟或重試時若鍵未變則不再次 dispatch。可再加 GitHub 端 concurrency 群組,避免同一夜兩次重疊。檢查點:人為連按兩次腳本,Runs 仍維持單一有效鏈或第二 run 立即被群組取消且日誌可解釋。
workflow 片段(示意):
on:
workflow_dispatch:
inputs:
run_mode:
required: true
type: string
batch_key:
required: true
type: string
concurrency:
group: nightly-openclaw-${{ github.ref }}
cancel-in-progress: true
jobs:
chain:
runs-on: ubuntu-latest
steps:
- name: Dispatch downstream or call OpenClaw
run: echo "${{ inputs.run_mode }} ${{ inputs.batch_key }}"
失敗 Webhook
將「觸發失敗」與「流水線失敗」分開:前者是 curl 非 2xx、逾時、或無法連 GitHub;後者由 Actions 內步驟回報。觸發層建議在腳本尾端以非零退出驅動 launchd 重試策略,並對 429/5xx做指數退避+抖動,退避窗內不重打告警通道以免噪音。可選:把摘要 POST 到既有監控(參考New Relic 夜批)或 Ops 工具,但權杖仍守最小權限。
最小 curl 檢查點
將 OWNER、REPO、WORKFLOW_FILE 換成實際值;成功應回 HTTP 204。
curl -fsS --retry 3 --retry-all-errors --retry-delay 20 \
--connect-timeout 10 --max-time 120 \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${GITHUB_DISPATCH_TOKEN}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
"https://api.github.com/repos/OWNER/REPO/actions/workflows/WORKFLOW_FILE.yml/dispatches" \
-d '{"ref":"main","inputs":{"run_mode":"nightly_chain","batch_key":"'$(date -u +%Y-%m-%d)'"}}'
排錯 FAQ
- 回傳四二二或工作流程找不到?
- 確認路徑用的是檔名(如
nightly.yml)且預設分支上確實存在;ref指向含該檔的分支。 - OpenClaw 與 Actions 誰當「主鏈」?
- 建議 Actions 管可公開的步驟與矩陣,OpenClaw 管閘道與私密資料面;邊界用受控 URL 與短期憑證銜接,必要時參考閘道升級/回滾節奏。