OpenClaw Staging vs Production: изоляция профиля launchd на арендованном Mac mini в 2026
Платформенные инженеры, поставляющие OpenClaw на одном арендованном Apple Silicon Mac mini, рано или поздно сталкиваются с кризисом, который звучит скучно: staging-эксперименты отравляют production-шлюзы, потому что оба мира читают один каталог состояния, делят один префикс метки LaunchAgent или занимают один localhost-порт. Этот runbook 2026 показывает, как дать хосту две проверяемые «личности»—раздельные префиксы домашних каталогов OpenClaw, непересекающиеся метки plist, явный выбор LimitLoadToSessionType и числовую матрицу приоритета переменных окружения, которую дежурный может прогрепать в инциденте. Читайте вместе с секретами и безопасностью plist, headless vs GUI-сессией и восстановлением шлюза, чтобы перезапуски не превращались в самоуничтожающиеся циклы автоматизации.
VmMac даёт узлы в Гонконге, Японии, Корее, Сингапуре и США с SSH и опциональным VNC; изоляция профиля — ваш контракт.
Два характера на одном хосте без общей амнезии
Считайте staging и production двумя флотами, случайно делящими питание и NVMe. Это значит раздельные корни конфигурации, раздельные пути логов и раздельные API-ключи—никогда «тот же ключ, другая модель». Когда команды жульничают symlink’ами staging в prod, вы воссоздаёте худшее от общих build-агентов: нестабильные очереди, необъяснимые rate limit и полуночные diff’ы без доверия. Закодируйте схему имён, переживающую усталых людей: OPENCLAW_HOME_STG и OPENCLAW_HOME_PRD экспортируются только в словарь EnvironmentVariables plist LaunchAgent, не в shell-профили, которые интерактивные SSH могут менять.
- Числовой порог: держите минимум 40 ГБ свободного NVMe, когда оба шлюза работают параллельно; локальные очереди SQLite и кэши моделей делят один дисковый бюджет.
- Числовой порог: ограничьте суммарный исходящий webhook fan-out 30 одновременными HTTP-клиентами, если не измеряли запас—burst-трафик вежливо валит prod из staging.
- Числовой порог: ротируйте staging-токены каждые 14 дней, даже если вендор не требует; устаревшие staging-creds становятся ловушками copy-paste.
Раскладка каталогов: состояние, логи и дисциплина «никогда это не синхронизировать»
Размещайте оба корня под /usr/local/var/openclaw-* или другим префиксом оператора—не Рабочий стол, не пути рядом с iCloud. Зеркалите ту же раскладку в Гонконге, Японии, Корее, Сингапуре, США, чтобы rsync-диагностика вела себя одинаково. Сочетайте раздел с структурированными логами и ротацией, чтобы staging не забивал диск и не вытеснял prod-логи в длинные выходные.
Метки LaunchAgent, ThrottleInterval и LimitLoadToSessionType
Используйте различимые обратные DNS-метки вроде com.yourorg.openclaw.gateway.stg vs com.yourorg.openclaw.gateway.prd; никогда не отличайте только регистром. Согласуйте ThrottleInterval с худшим временем перезапуска из восстановления шлюза, чтобы launchd не перезапускал битую staging-plist, пока prod ещё освобождает сокеты. Если staging нужен GUI-отладочный режим, задайте LimitLoadToSessionType с Aqua только для этой plist; production держите headless, чтобы сузить поверхность TCC.
Порты, привязки loopback и чистота StandardOutPath
Привяжите staging к 127.0.0.1:18789, production к 127.0.0.1:18790 как документированную пару по умолчанию—корректируйте, если внутренний стандарт уже занял порты, но сохраняйте разделение нечёт/чёт для дежурных. Убедитесь, что StandardOutPath и StandardErrorPath никогда не указывают на один файл для обоих агентов; перемешанные логи уничтожают причинность при расследовании дедупликации webhook.
Матрица приоритета переменных окружения (шпаргалка оператора)
| Источник | Приоритет staging | Приоритет production | Совет при инциденте |
|---|---|---|---|
plist LaunchAgent EnvironmentVariables |
Побеждает shell для демонов | Побеждает shell для демонов | Всегда печатать через launchctl print gui/$(id -u)/com...stg |
~/.zshenv для SSH |
Только для людей | Не должен перекрывать plist | Убрать секреты из shell |
.env в каталоге состояния |
Допустимы локальные умолчания | Строгий allowlist | Никогда не symlink между stg/prd |
launchctl print не доказывает, какая переменная победила, операторы угадывают—а угадывание — это как ключи prod утекают в staging Slack-боты.
Когда инженеры просят «просто переиспользовать prod-plist с другим API-ключом», отвечайте политикой сначала diff: каждая staging-plist должна отличаться от production минимум по пяти видимым ключам—порты, метки, пути логов, корни состояния и дроссели—чтобы случайный cp сразу виден в ревью.
Семишаговый дым и откат перед каждой promotion
- Выгрузить staging-plist; порт закрыт — проверить
lsof. - Экспортировать tar состояния staging для форензики—не для повторного использования в prod.
- Синтетический webhook на staging-слушатель с canary-токеном.
- Diff plist между регионами; кроме hostname ожидается нулевой diff.
- Загрузить prod-plist; health endpoint возвращает 200 за 12 секунд.
- Проиграть известную глубину prod-очереди; алерт если > базы в 3×.
- Задокументировать откат: выгрузить prd, восстановить предыдущую ревизию plist из git-тега.
Перекрёстные ссылки восстановления шлюза и известные ловушки автоматизации
Сообщества подчёркивают: перезапуск шлюза из сессии агента может завершить процесс без чистого relaunch при некоторых конфигурациях launchd—проектируйте promotion так, чтобы люди перезапускали шлюзы сначала в рабочее время. Привяжите runbook к гайду по установке и деплою, чтобы шаг «переустановить сервис» был зафиксирован версией, а не фольклором.
Проверки согласованности в пяти регионах для двойных профилей
Запускайте ту же семишаговую репетицию promotion еженедельно в каждом регионе VmMac. Расхождение обычно означает опечатки в путях или локаль-специфичное кодирование plist, не загадочное облако. Держите примеры справочного центра согласованными с реальными ключами plist в репозитории.
FAQ: staging и production OpenClaw на одном Mac mini
Можно ли делить один бинарник Node? Да—версию закрепляйте глобально; каталоги состояния никогда не делите.
Должен ли staging звать реальные vendor API? Предпочитайте песочницы; если нельзя — ограничивайте rate и явно маркируйте трафик.
Кто владеет откатом? Ваша платформенная команда; VmMac не откатывает plist’ы.
Почему Mac mini M4 всё ещё подходит для dual-gateway metal в 2026
Apple Silicon Mac mini даёт предсказуемую однотенантную пропускную способность для двух процессов-шлюзов, локальных очередей SQLite и фоновых помощников моделей без шумных соседей. Аренда по региону позволяет держать staging рядом с разработчиками, а production — ближе к выходу SaaS—без двух физических столов на инженера. SSH-first-поток VmMac позволяет прогонять изменения plist через те же git-pipelines, что и код приложения, и валидировать их одинаково в Гонконге, Японии, Корее, Сингапуре и США. Считайте изоляцию launchd качеством продукта, не сантехникой—тогда OpenClaw становится инфраструктурой, а не демо.
Сначала репетируйте двойные plist в запасном регионе
Добавьте ещё один Mac mini в регионе через цены, чтобы отрабатывать promotion без риска для основного шлюза.