Этот сценарий дополняет multi-AZ шлюзы и webhook-дайджесты; для доставки артефактов между узлами см. матрицу rsync и блокировок. Оглавление блога — список статей.
Соглашение о каталогах
Каркас путей должен совпадать на каждом узле. Редактируемые куски лежат в /usr/local/openclaw/tenants/<tenant>/fragments/*.yaml, результат merge — в /var/lib/openclaw/merged вместе с файлом SHA256, а /var/log/openclaw принимает JSONL со следами ретраев и отпечатками ошибок. Слияние всегда пишет во временный файл и завершает атомарным mv, чтобы launchd не увидел «обрезанный» YAML.
Установка: один тенант на песочнице, затем копирование скелета на остальные Mac.Оркестрация: выбор групп узлов по меткам, запрет прямого редактирования merged вручную.Разбор: сверка хеша, хвост логов; синтаксическая ошибка — немедленный отказ merge и блокировка reload до фикса.
Фиксация версий (versions.lock)
В корне репозитория держите versions.lock с digest бинарей OpenClaw, тегами sidecar и SHA скрипта merge — CI должен падать при расхождении. Продвижение релиза: канареечный Mac → openclaw doctor и составная проба → короткое наблюдение метрик → остальная сетка. Даже правка URL партнёра фиксируется коммитом, чтобы не ловить «устную» дрейфующую конфигурацию. Заранее сверьте ёмкость кластера с тарифами Mac, чтобы канарейка и notifier не упирались в диск.
Объединение health-проб и doctor
Наружу выставляйте только /healthz/composite: внутри последовательно проверяются диск, launchd, очередь, исходящий TLS к партнёру и сводка openclaw doctor. Ответ — один JSON с полями tenant, az, статусами подсистем; балансировщик не должен знать о десятке разрозненных curl. Шлюзы пишут подробности локально, а notifier за пятиминутное окно шлёт одну агрегированную запись по сбоям webhook; длительная деградация помечается как degraded, но сервис остаётся наблюдаемым.
#!/usr/bin/env bash
set -euo pipefail
/usr/bin/openclaw doctor --tenant "${TENANT}" --json >"/tmp/d.json"
/usr/bin/curl -fsS --max-time 4 "${WEBHOOK_PING_URL}" >/dev/null
/usr/bin/printf '{"tenant":"%s","doctor_ok":true,"webhook_ok":true,"queue_depth":0}\n' "${TENANT}"
Единые пути упрощают повторное использование SSH-скриптов; сверьтесь с публичной справкой по доступам и jump-хостам.
Ротация токенов и секретов
Разведите bearer для webhook и клиентские сертификаты mTLS. Во фрагментах YAML храните только пути к секретам, сами значения подставляйте из секрет-хранилища при merge — итоговый файл лишь ссылается на объект в Keychain/vault. Новый секрет сначала монтируется на канарейку; после двух успешных циклов внешнего трафика и прохождения notifier-дайджеста промотируйте тег на все узлы. Обновление делайте через короткоживущий файл и атомарный rename, держите перекрытие ~12 часов, фиксируйте отзыв старого ключа и тикет в аудите. Публичные интеграции планово крутите ежемесячно; при подозрении на утечку — немедленный обход всех тенантов и grep по merged на следы старого токена.
Пошаговый чек-лист
- Три Mac (два шлюза и отдельный notifier или рабочая станция): зафиксируйте роли A/B/N в runbook.
- Фрагменты → merge в
merged/openclaw.yaml+.sha256; перед продом гоняйтеopenclaw validate. versions.lockв CI; первый узел — doctor и ping исходящего webhook.- Составную пробу повесьте на один путь LB, временно отключите DNS и убедитесь, что JSON отражает tenant/AZ.
- Notifier: смоделируйте 4xx/5xx, проверьте одно сообщение за пятиминутное окно с tenant и correlation id.
- Shadow-токен на всех узлах, отзыв старого ключа и поиск по merged.
- Runbook для SSH jump и отката merge. Бюджет и закупка — страница покупки и главная без входа в консоль.
FAQ: коротко
Конфликт ключей во фрагментах — немедленный fail merge.doctor по таймауту переводит наружный статус в degraded, не скрывая детали в JSONL.Сводка webhook содержит счётчики и репрезентативный URL; полный след остаётся в логах для расследования.
Согласуйте следующий шаг до открытия консоли
Тарифы, справочный центр, покупка и главная доступны публично — команда может выровнять архитектуру и бюджет без логина.