Три узких места:
- Секреты. PAT в логах ответа
curlили отсутствие deploy key дляgitдо prefetch. - Lockfile. Общий
npm ciбез изоляции и дрейфpackage-lock.jsonбез сравнения с коммитом из payload. - Ресурсы. Параллельные образы 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"
Матрица: параллельные образы 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
Три опорных показателя для отчёта владельцам пайплайна
summary.json; инциденты порта и APFS; совпадение lock с коммитом.
FAQ: токены, TLS и порт по умолчанию
PAT только для API и публикации; секрет webhook отдельно; git через deploy key.
Да: полная цепь и stapling; самоподпись на edge ломает sr.ht; приватно — VPN и webhook внутри туннеля.
lsof, остановить процесс или OPENCLAW_GATEWAY_PORT; для приёмки достаточно CLI к демону.
Только с lock-файлами в корне кеша и разными префиксами извлечения.
Два, четыре, восемь секунд плюс джиттер; максимум четыре попытки затем явная ошибка.
Итог и публичные шаги без URL с обязательным входом
Webhook, Node 24, два канала OpenClaw, prefetch, lockfile, merge JSON, публикация. Далее: блог, цены, аренда, помощь, главная.
Mac Mini M4 рядом с builds.sr.ht и OpenClaw
NVMe рядом с webhook-цепочкой: быстрый prefetch npm и стабильный демон шлюза на Apple Silicon.