Когда платформенные команды переносят OpenClaw на удалённый Mac M4 в Канаде, типичная ошибка — копировать десктопный playbook: открыть Screen Sharing, запустить полный openclaw onboard, надеяться, что Gateway переживёт обрыв SSH. CI и batch-нагрузки требуют другого контракта — headless-путь установки через официальный install-cli.sh с --no-onboard, предзагруженную конфигурацию и health-probe launchd вместо мастера. Эта статья отвечает на один вопрос: как развернуть воспроизводимую headless OpenClaw CI на облачном Mac / Mac mini cloud build seat. Мы не пересматриваем SSH-туннель vs прямой Gateway (OpenClaw Canada M4: SSH gateway, token 18789 и launchd) и не разбираем интерактивный onboard playbook (Удалённый Mac: install, onboard и LaunchDaemon 24/7). Если на том же Mac mini hosting seat крутится GitHub Actions runner, разделите Unix-пользователей и launchd labels по self-hosted macOS runner на облачном Mac, чтобы версии Node и порт 18789 не конфликтовали.
Для headless CI зафиксируйте три идеи:
-
install-cli.sh --no-onboardпропускает мастерConfig dir и tokens из runbook — идеально для Ansible или GHA workflows.
-
Probes должны покрывать launchd, 18789 и sharp
Успешного
curlмало; важны абсолютные пути plist и native modules. -
Выделенные Canada M4 seats для 24/7
24 GB unified memory и SSD 512 GB+; Gateway work и CI jobs — в разных очередях.
1. Когда нужен headless --no-onboard вместо интерактивного onboard
Интерактивный openclaw onboard хорош на Mac с реальной GUI-сессией, где оператор одобряет TCC (Accessibility, Automation, Screen Recording). Это правильный first-run на ноутбуке разработчика. Это неверный default, когда цель — CI lane на облачном Mac, доступная только по SSH или self-hosted runner, а конфигурация уже сгенерирована внутренними шаблонами. Продолжение вызывать мастер блокирует pipelines и создаёт «snowflake» hosts, не rebuildable из Git.
Headless-контракт выглядит так:
- Pin Node LTS и global
openclawCLI semver черезinstall-cli.sh. - Передать
--no-onboardи синхронизировать config directory (часто~/.openclaw, по upstream docs) из secrets management. - Запланировать одноразовое окно Screen Sharing только если agents всё ещё нуждаются в browser automation с TCC; далее — только launchd.
В отличие от заметки «стабильность удалённого Mac», эта статья даёт версионируемый CI runbook и probe scripts — не desktop operator manual. Если команда всё ещё вводит ответы в onboard на каждом новом seat, headless maturity ещё не достигнута.
2. Headless install-cli.sh vs полный onboard: как выбрать
| Измерение |
install-cli.sh --no-onboard
CI / batch · повторяемо
|
Полный openclaw onboard
Desktop · первый TCC
|
|---|---|---|
| Лучше для | GHA, cron, однородное масштабирование fleet | Single-seat VNC setup, menu bar app |
| Источник config | Git template + CI secrets | Мастер пишет по шагам |
| Gateway 18789 | Runbook фиксирует 127.0.0.1 + bearer token | Мастер выдаёт bearer |
| launchd | Script или post-install install-daemon | Опциональный --install-daemon |
| Типичные сбои | PATH drift, sharp load, config semver skew | Missing TCC, port already bound |
| Sweet spot | Mac mini hosting 24/7 agent pools | Developer laptop sidecar debugging |
При provisioning свежего Mac mini cloud seat у провайдера сначала прогоните headless smoke pipeline. Команды, которые «onboard once by hand», часто через недели обнаруживают, что не могут disaster-recover Gateway менее чем за час.
3. Headless provisioning runbook: install-cli.sh и injection config
Примеры ниже предполагают dedicated system user openclaw-ci, изолированного от VNC admin. На Canada M4 cloud Mac pin Node на LTS (22.x — разумный baseline 2026) и отделите от nvm shims runner user — launchd jobs не загружают interactive shell profiles.
# SSH как openclaw-ci на облачном Mac export OPENCLAW_CONFIG_DIR="$HOME/.openclaw" curl -fsSL https://example.openclaw.dev/install-cli.sh | bash -s -- --no-onboard # Восстановить config из CI secrets — никогда не коммитьте tokens в Git install -d -m 700 "$OPENCLAW_CONFIG_DIR" echo "$OPENCLAW_CONFIG_JSON" > "$OPENCLAW_CONFIG_DIR/config.json" # Установить Gateway launchd service, если поддерживается openclaw gateway install-daemon openclaw doctor --non-interactive
Операционные заметки, отделяющие hobby installs от production cloud Mac lanes:
- Idempotency: workflow должен переносить re-runs. Хороший script no-op или converge version при уже установленном.
- Semver lock: записывайте
openclaw --versionи config schema version в runbook; upgrades через change window с rollback. - Disk layout: npm/pnpm caches на path, который можно wipe независимо от Derived Data, если тот же host собирает iOS artifacts.
- Checksum: pin digest install script в production; naked
curl | bashбез verification — supply-chain incident waiting to happen.
xcodebuild; openclaw-ci владеет Gateway. Никогда не делите один launchd job label или один global node_modules/.sharp tree.
4. launchd health checks: треугольник process, port и log
В headless mode «Gateway seems up» часто значит, что кто-то один раз запустил curl из SSH session с полным PATH. Production probes должны валидировать launchd state, listen address и log keywords вместе. Каждые пять минут через cron или scheduled GHA workflow:
#!/bin/bash set -euo pipefail LABEL="ai.openclaw.gateway" launchctl print "gui/$(id -u)/$LABEL" | grep -q 'state = running' lsof -nP -iTCP:18789 -sTCP:LISTEN | grep -q openclaw curl -sf -H "Authorization: Bearer $OPENCLAW_GATEWAY_TOKEN" \ http://127.0.0.1:18789/health | grep -q '"ok":true' tail -n 50 ~/Library/Logs/openclaw/gateway.log | grep -Ei 'sharp|EADDRINUSE|401' && exit 1 || true
plist должен вызывать openclaw с absolute path и задавать explicit EnvironmentVariables, включая PATH=/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin. launchd не читает interactive ~/.zprofile. Это mismatch — главная причина «работает по SSH, daemon сразу exit» на арендованном cloud Mac.
Расширяйте probes duration metrics: track p95 latency /health и alert, когда cold starts превышают workflow timeout budget. Gateway, отвечающая за четыре секунды interactively, но за тридцать под launchd, всё равно может валить CI jobs с tight retries.
5. Матрица результатов probe: green, yellow, red
| Уровень | Сигналы | Рекомендуемое действие |
|---|---|---|
| Green | launchd running + 18789 LISTEN + /health 200 | Rotate gateway.log старше 7 дней only |
| Yellow | Slow /health или intermittent 401; no sharp errors in logs | Verify token rotation; openclaw doctor; cap concurrent agent jobs |
| Red | launchd exit loop; EADDRINUSE; sharp load failure | Stop job queue; bootout + rebuild plist; см. sharp section ниже |
Yellow дольше двадцати четырёх часов — release blocker. Headless CI предполагает predictable Gateway behavior; intermittent auth или latency failures раздуваются в whole-batch agent timeouts, дорогие для debug без VNC.
6. Troubleshooting native module sharp на Apple Silicon cloud Macs
Dependency graph OpenClaw включает sharp (libvips bindings). На M4 arm64 hosts mismatched Node major versions или mixed install users дают Cannot find module '../build/Release/sharp.node' или architecture mismatch at runtime. Headless CI не должна узнавать это на first failed job — bake sharp validation в golden images или post-install hooks.
6.1 Common failure modes and fixes
- User mismatch: root installed global CLI,
openclaw-ciruns daemon — reinstall sharp или CLI as service user. - Node upgrade without rebuild: after bumping Node, run
npm rebuild sharpили reinstall openclaw CLI package. - Rosetta mix: plist и CLI оба arm64;
file $(which node)should report arm64. - Offline cache: на bandwidth-constrained Mac mini cloud hosts prefetch sharp binaries, чтобы CI jobs не hit GitHub releases every run.
- Multiple Node managers: avoid Homebrew Node for daemon while interactive shells use
nvm— pick one story и encode в plist.
node -p "process.arch + ' ' + process.version" npm ls sharp --global 2>/dev/null || true npm rebuild sharp --foreground-scripts openclaw doctor 2>&1 | tee /tmp/openclaw-doctor.log grep -i sharp /tmp/openclaw-doctor.log && exit 1 || echo "sharp OK"
If doctor still reports sharp, align Node и CLI install channels from same install-cli.sh artifact before chasing application-level bugs. Mixing Homebrew Node with npm-global CLI without plist PATH fixes — sharp edge we see most often на Mac mini hosting tickets.
7. CI에서 Gateway 18789 경계와 token 로테이션
Headless pipelines должны вызывать локальный Gateway на 127.0.0.1:18789 с bearer token — никогда не expose порт на публичный интерфейс. Храните tokens в CI secrets (например OPENCLAW_GATEWAY_TOKEN). Поток ротации: записать новый token в config, reload daemon, validate probes green, затем revoke старый secret. Loopback держит минимальную latency, когда runner и Gateway делят один облачный Mac; cross-host вызовы — в связанной SSH gateway note выше.
Workflows должны иметь explicit timeouts и limited retries. Cold start после reboot может занять десять–тридцать секунд; failed probe должен один раз trigger launchctl kickstart перед destructive reinstall. Задокументируйте это, чтобы on-call не стёр рабочий config во время transient boot storms после macOS patches.
Ротацию token привязывайте к одному change ticket для CI pipeline и Gateway, чтобы избежать split-brain, когда обновлена только одна сторона. На production облачном Mac безопаснее двухэтапный deploy: проверить новый token на staging seat, затем переключить production config. В rollback включите срок действия старого token и как читать 401 spikes в gateway.log.
8. Security baseline для headless OpenClaw на hosted Mac seats
- Dedicated user:
openclaw-ciбез admin rights и VNC login. - Secrets: config и tokens только из vault; FileVault на volume.
- Network: inbound только SSH или Tailscale; не broadcast 18789 в LAN.
- Supply chain: verify checksums install script; block unaudited pipe-to-bash в production.
- Audit: gateway.log fourteen days; ship 401 и sharp keywords в log stack.
- Blast radius: agent tools profile — least privilege; untrusted fork PRs не должны достигать production Gateway hosts.
Headless automation ускоряет delivery, но убирает паузу, где человек заметил бы подозрительный install URL. Относитесь к URL и checksum install script с той же строгостью, что и к production TLS certificates. Аудит-логи шипьте в SIEM с alert rules на 401 и sharp.
9. Подключение headless OpenClaw к GHA или internal CI
Когда Gateway probes green, открывайте OpenClaw pipelines через guarded steps:
- Export
OPENCLAW_GATEWAY_TOKENиз GitHub Environments с required reviewers для production. - Agent jobs на
runs-on: [self-hosted, macos-m4-canada, openclaw]labels, отдельно от signing или archive jobs. - Preflight той же shell probe, что и cron; fail fast до expensive LLM или browser steps.
- Capture
openclaw doctoroutput как workflow artifact при failure для async review.
Memory planning: на 24GB Mac mini cloud seat pause OpenClaw agent batches при unified memory pressure выше eighty percent, если тот же host должен finish xcodebuild archive той же ночью. Queue depth alerts не дадут blame «GitHub slow», когда host просто oversubscribed. Preflight через memory_pressure или vm_stat перед OpenClaw steps снижает collision с nightly archive на Mac mini hosting seats.
10. First-week checklist на Canada M4 dedicated seat
- Выберите plan Mac mini hosting (24GB RAM и 512GB SSD minimum для combined CI + Gateway).
- Создайте
openclaw-ciи passinstall-cli.sh --no-onboardsmoke tests. - Inject config и token; ensure
openclaw doctor --non-interactiveclean. - Install launchd и deploy green/yellow/red probes с paging.
- Prevalidate
sharp; lock Node и CLI versions в runbook. - Если GHA runner shares host, verify separate users и no port conflicts.
- Document rebuild: новый облачный Mac seat должен reach identical Gateway behavior within thirty minutes.
11. FAQ
Нужен ли VNC после --no-onboard?
Если agents требуют browser automation или TCC permissions, schedule one-time graphical session. Pure CLI или API Gateway workloads могут run без VNC indefinitely once launchd stable.
install-cli.sh vs full install.sh?
Используйте install-cli.sh, когда CI needs CLI plus Gateway only. Full installers с menu bar apps — poor fits для repeated headless runner deployments.
Probe returns 401 but process running?
Usually token rotation drift или workflows still sending old secret. Align config on disk с Authorization header; check proxies injecting stale tokens.
sharp fails under launchd but works over SSH?
Almost always PATH или user environment differences. Compare launchctl print environment blocks с interactive env side by side.
Можно ли OpenClaw Gateway в Docker на macOS?
Docker on Mac cannot replace native TCC и GUI automation requirements. Run Gateway under native launchd; containers — peripheral tools only.
Как schedule OpenClaw alongside GitHub Actions на one host?
Stagger agent batches away from archive peaks; pause agents above eighty percent memory pressure. Label и concurrency guidance в self-hosted runner article.
Hashvps Canada node — хороший fit для headless OpenClaw?
Да, когда нужны dedicated IPv4, bare-metal M4 и persistent SSH. Confirm disk tier fits npm caches и rotated gateway logs before committing.
Стандартная процедура upgrade CLI?
Maintenance window: launchctl bootout, converge version via install-cli, npm rebuild sharp, doctor, green probes, then restore traffic.
Headless OpenClaw нужен стабильный Mac mini cloud
install-cli.sh --no-onboard даёт воспроизводимые деплои; долгосрочная стабильность зависит от cloud Mac. Unified Memory M4, macOS launchd, энергоэффективный Mac mini hosting, Gatekeeper/FileVault.