Интент: связать webhook builds.sr.ht с удалённым Mac для prefetch npm, контроля package-lock.json и сводки JSON в CI. Ниже — секреты, матрица образов, Node 24, пять шагов и приёмка; см. Node 24, webhook, Git WAN, помощь, блог. Цель — сократить холодный install в основной джобе и дать сопровождению один файл фактов до merge.

Три узких места:

  1. Секреты. PAT в логах ответа curl или отсутствие deploy key для git до prefetch.
  2. Lockfile. Общий npm ci без изоляции и дрейф package-lock.json без сравнения с коммитом из payload.
  3. Ресурсы. Параллельные образы sr.ht без порога APFS и без backoff на git fetch; конфликт порта шлюза при смоук-тестах.

Секреты, переменные и заголовки перед приёмом webhook на удалённом Mac

Разведите секрет webhook, PAT sr.ht и npm token; не логируйте env. OPENCLAW_HOME и конфиг с правами 700. Одинаковый PATH для интерактивного SSH и для launchd исключает расхождение версий CLI между ручной отладкой и ночным webhook.

Переменная или объект Роль на удалённом Mac Пример или команда
SR_HT_WEBHOOK_SECRET Проверка запроса до prefetch HMAC или заголовок из KMS
SOURCEHUT_TOKEN curl к API задачи Authorization: token …
NPM_CONFIG_CACHE Изоляция tarball на NVMe /Volumes/ci-cache/npm/${COMMIT_SHA}
OPENCLAW_GATEWAY_PORT Обход конфликта порта Альтернатива 18789
GIT_HTTP_LOW_SPEED_LIMIT Обрыв зависшего fetch Вместе с циклом retry
# Порог Node 24 (мажор должен быть 24 в той же среде, что у launchd)
node -v

# Официальный путь A: скрипт установки из документации релиза (подставьте URL из upstream)
curl -fsSL "https://example.invalid/openclaw/install.sh" | bash

# Официальный путь B: глобальный пакет npm с закреплённым semver
npm install -g "openclaw@2026.5.x"
URL install.sh: подставьте адрес из официальной документации релиза; не копируйте пример с неверным хостом в прод.

Матрица: параллельные образы builds.sr.ht, повторы git и пороги диска APFS

Строки ниже сводят компромисс между пропускной способностью диска и риском гонок при нескольких образах builds.sr.ht на одном арендованном узле. Увеличивайте параллелизм только после стабильного p95 и отсутствия предупреждений дисковой подсистемы в логах macOS.

Сценарий на Mac mini M4 Параллельные задачи sr.ht Политика git fetch и диска
Лёгкий prefetch До двух образов, разные NPM_CONFIG_CACHE, lock на каталог Четыре fetch; стоп если свободно <12% APFS
Prefetch + audit + validate Один тяжёлый webhook на узел Порог свободного места 15% до npm ci
Несколько lockfile Два образа, разные корни на NVMe Отдельный shallow clone на коммит
Высокий RTT к git.sr.ht Один параллельный prefetch Три fetch, больше low speed timeout

Пять шагов: webhook builds.sr.ht, prefetch, merge сводки и ответ CI

Шаг 1. В builds.sr.ht: HTTPS endpoint, секрет в заголовке, фильтр событий, allowlist IP.

Шаг 2. Обработчик: проверка подписи, JSON payload, git fetch с retry, shallow checkout в уникальный каталог.

Шаг 3. npm ci с изолированным кешем; git diff --exit-code package-lock.json к коммиту из webhook. При ненулевом коде завершайте сразу до тяжёлых тестов и включайте дифф в сводку.

Шаг 4. Сводка: openclaw gateway status JSON, openclaw doctor, openclaw config validate, npm audit --json; merge в один объект с commit и timestamp.

Шаг 5. Публикация: артефакт summary.json или curl к API задачи; PAT без echo в stdout.

Цепочка приёмки: npm ci, gateway status, config validate и doctor

После npm ci выполните openclaw gateway status, openclaw config validate, openclaw doctor. Ошибки разносите по блокам JSON. На MacPull один демон на пользователя; при конфликте порта задайте OPENCLAW_GATEWAY_PORT или используйте только CLI. При зелёном статусе добавьте в сводку размер node_modules и хеш верхнего коммита чтобы регрессии сети отличались от регрессий зависимостей.

npm ci --prefer-offline --no-audit
openclaw gateway status --format json > /tmp/oc-status.json
openclaw config validate > /tmp/oc-validate.txt
openclaw doctor > /tmp/oc-doctor.txt
jq -n --slurpfile s /tmp/oc-status.json --arg commit "$COMMIT_SHA" \
  '{commit: $commit, gateway: $s[0]}' > summary.json

Три опорных показателя для отчёта владельцам пайплайна

Метрики: доля тёплых prefetch; p95 webhook→summary.json; инциденты порта и APFS; совпадение lock с коммитом.

FAQ: токены, TLS и порт по умолчанию

Какой токен куда?

PAT только для API и публикации; секрет webhook отдельно; git через deploy key.

Нужен ли валидный публичный TLS?

Да: полная цепь и stapling; самоподпись на edge ломает sr.ht; приватно — VPN и webhook внутри туннеля.

Порт 18789 занят?

lsof, остановить процесс или OPENCLAW_GATEWAY_PORT; для приёмки достаточно CLI к демону.

Общий npm cache между webhook?

Только с lock-файлами в корне кеша и разными префиксами извлечения.

Backoff для git fetch?

Два, четыре, восемь секунд плюс джиттер; максимум четыре попытки затем явная ошибка.

Итог и публичные шаги без URL с обязательным входом

Webhook, Node 24, два канала OpenClaw, prefetch, lockfile, merge JSON, публикация. Далее: блог, цены, аренда, помощь, главная.

Mac Mini M4 рядом с builds.sr.ht и OpenClaw

NVMe рядом с webhook-цепочкой: быстрый prefetch npm и стабильный демон шлюза на Apple Silicon.