ИИ / автоматизация 22 апреля 2026

OpenClaw Staging vs Production: изоляция профиля launchd на арендованном Mac mini в 2026

Команда инженеров VmMac 22 апреля 2026 ~21 мин чтения

Платформенные инженеры, поставляющие 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-логи в длинные выходные.

Гигиена диска: если staging JSONL растёт больше чем на 2 ГБ в день без задачи ретенции, блокируйте любое продвижение конфигурации, пока ротация не исправлена—тихая потеря логов хуже громких потерь очереди.

Метки 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

  1. Выгрузить staging-plist; порт закрыт — проверить lsof.
  2. Экспортировать tar состояния staging для форензики—не для повторного использования в prod.
  3. Синтетический webhook на staging-слушатель с canary-токеном.
  4. Diff plist между регионами; кроме hostname ожидается нулевой diff.
  5. Загрузить prod-plist; health endpoint возвращает 200 за 12 секунд.
  6. Проиграть известную глубину prod-очереди; алерт если > базы в .
  7. Задокументировать откат: выгрузить 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 без риска для основного шлюза.