Установка, шлюз и идея onboarding (Node 22+)
Зафиксируйте Node 22.16+ или 24 LTS и глобальный пакет openclaw. Команда openclaw doctor должна завершаться без критичных замечаний. После первичного мастера выполните openclaw onboard --install-daemon, чтобы обработчик webhook жил в LaunchAgent и переживал перезагрузку без ручного входа в графическую сессию.
В launchd plist явно пропишите PATH, при необходимости NODE_BINARY и NODE_EXTRA_CA_CERTS — так среда демона совпадёт с вашей SSH-сессией и не «поедет» версия npm при префлайте. Токен панели OpenClaw, общий секрет для webhook и отдельный токен TeamCity REST храните в разных файлах с правами 600; в репозиторий их не коммитьте.
Приём HTTP для автоматизации привяжите к 127.0.0.1; наружу опубликуйте только узкий путь через TLS-терминацию (Caddy, nginx) или SSH reverse tunnel с того же хоста, где крутится агент TeamCity, если политика безопасности это допускает. Health-проба: периодический curl к маршруту здоровья шлюза из того же plist или отдельного LaunchAgent.
Матрица: шлюз × webhook × рабочая копия
| Аспект | Рекомендуется | Избегать |
|---|---|---|
| Слушатель | 127.0.0.1 + обратный прокси только на путь webhook |
Панель и handler на 0.0.0.0 без сегментации |
| Токены | REST только на запись комментария к сборке нужного проекта | Персональный полный токен администратора в скрипте |
| События TeamCity | Успешные сборки целевой ветки и один buildTypeId | Все статусы и все конфигурации в один endpoint |
| Файловая изоляция | Отдельный каталог или git worktree на доставку |
Общий клон с артефактами параллельных job |
TeamCity: webhook, проверка тела и идемпотентность
В разделе Webhooks (глобально, в проекте или шаблоне) создайте запись на событие завершения сборки. URL укажите на ваш публичный HTTPS. В теле JSON или в форме используйте параметры сборки, например %teamcity.build.id%, %build.vcs.number%, %teamcity.build.branch% — так обработчик однозначно свяжет префлайт с записью в TeamCity.
Проверка: передайте секрет в пользовательском заголовке (например X-Webhook-Secret) и сравните его после чтения сырого тела, константным временем, до разбора JSON — иначе прокси с перекодированием или лишний пробел в консоли TeamCity сломают доверие. Для повторных доставок TeamCity сохраните идемпотентный ключ (build id + тип события) в памяти или лёгком хранилище TTL, чтобы не запускать второй полный префлайт.
Чеклист шагов
- Проверьте
curlс тестовым JSON на handler и ответ2xxна/healthшлюза. - Создайте webhook только для нужной конфигурации и ветки; сохраните секрет и проверьте одну тестовую сборку.
- В коде: валидация заголовка → короткий
200→ фоновая очередь префлайта. - Shallow clone в
WORK_DIR/build-<id>; префлайт;git diffпо lockfile или сухойnpm ci. - Сводка: TeamCity REST или второй HTTP; при ошибке сети и
5xx— паузы 2 / 4 / 8 с, не более трёх попыток, с лимитом времениcurl.
Префлайт, lockfile и пример макросов
После извлечения ревизии из JSON выполните git fetch --depth=1 и checkout. Для Node — npm ci --dry-run или pnpm install --frozen-lockfile --dry-run; для PHP — composer validate и при необходимости composer install --dry-run. Результат lockfile оформите как краткий текст: изменился ли файл, длина diff, ненулевой код выхода инструмента.
# Плейсхолдеры TeamCity в теле webhook (пример)
{
"buildId": "%teamcity.build.id%",
"revision": "%build.vcs.number%",
"buildTypeId": "%system.teamcity.buildType.id%",
"branch": "%teamcity.build.branch%"
}
Обратная сводка: компактный JSON или одна строка в комментарий к сборке через REST. Не вкладывайте в сводку секреты и полные логи — только build id, статус префлайта и ссылку на артефакт при необходимости.
Частые ошибки и FAQ
Постоянный 401 при правильном «на бумаге» секрете
Сверьте имя заголовка без опечаток; удалите невидимые символы при вставке в TeamCity; убедитесь, что edge-прокси не режет пользовательские заголовки.
Таймаут webhook и лавина повторов
Укоротите синхронный путь до валидации и постановки в очередь; клон и установки — только асинхронно. Смотрите вкладку доставок webhook в TeamCity.
403 от REST TeamCity
Сузьте роль пользователя токена до проекта; проверьте, что токен не истёк и не заблокирован политикой SSO.
Разный Node у демона и в терминале
Абсолютный путь в NODE_BINARY в plist; расширенный разбор — в материале блога «OpenClaw: установка и типовые ошибки на удалённом Mac» (поиск по заголовку в каталоге блога).
Где смотреть логи
log stream с фильтром по подписи процесса; StandardOutPath в plist; на стороне TeamCity — статус исходящего запроса. В приложении логируйте build id и correlation id, не секреты.
Зачем выносить префлайт на удалённый Mac и как купить узел
Стабильный Apple Silicon с предсказуемым диском и сетью снижает шум от очередей общего пула агентов: префлайт отлавливает конфликты версий и дрейф lockfile до дорогих шагов на Windows/Linux-раннерах. Тот же Mac может hostить и агент TeamCity, и шлюз OpenClaw, если разделить корни кеша и рабочие каталоги.
MacPull даёт аренду удалённого Mac с SSH; страницы центра помощи, покупки и выбора конфигурации и главная доступны без обязательного входа — можно заранее оценить сценарий и оформить узел под префлайт.
Итог: связка TeamCity Webhook → OpenClaw на loopback с минимальными токенами, изолированным клоном и ограниченными повторами сводки даёт воспроизводимый префлайт без лишней attack surface. Другие сценарии OpenClaw и CI — в коллекции статей блога (кнопка ниже).
Префлайт TeamCity на удалённом Mac с OpenClaw
Помощь и SSH, покупка узла, главная и подборка OpenClaw в блоге — без обязательной авторизации.