AI Frontier

Профили рабочего пространства OpenClaw на macOS в 2026: шлюзы staging и продакшен, изоляция LaunchAgent и дымовые тесты doctor на облачном Mac mini

MacHTML Lab2026.05.13около 34 мин чтения

В 2026 году команды, внедряющие OpenClaw, часто хотят держать staging-шлюз рядом с продакшен-шлюзом на одном физическом Mac mini, чтобы ускорить закупку—а затем видят, как оба профиля перезаписывают один кэш токенов, борются за TCP 8787 или наследуют чужой PATH, потому что launchd переиспользовал один шаблон plist. Здесь — операторский расклад: отдельные корни конфигурации, непересекающиеся порты, разные метки LaunchAgent, отдельные логи и сценарий smoke сначала через doctor, согласованный с разбором EADDRINUSE, первым запуском PATH/Node и диагностикой doctor.

Вы получите матрицу портов, чеклист для тикетов и цифры: ориентир аренды около 16,9 $/день, пары портов 8787/8788, права каталогов 700 и пятиминутное окно дыма до приёма трафика.

Зачем два профиля на одном Mac

Узлы Mac mini на Apple Silicon тихо держат два шлюза, дают нативную семантику launchd и подходят для CapEx-лёгких пилотов. Аренда через MacHTML — порядка 16,9 $/день на публичных страницах — дешевле, чем отправить в прод не тот профиль из-за общего файла API-ключа. Разделение профилей изолирует экспериментальные allowlist-и инструментов от клиентской автоматизации и позволяет сравнивать plist на железе, а не только в Linux CI без связки с Keychain.

Профили — это границы изоляции, а не флаги функций: у каждого свой корень конфигурации, логи, порт, Label LaunchAgent и календарь ротации секретов.

Каталоги и секреты

Создайте ~/.openclaw-staging и ~/.openclaw-prod с chmod 700, чтобы другие консольные пользователи на общем mini не читали кэши. Храните токены провайдера, sqlite и скачанные skills в каждом корне — не делайте symlink staging→prod «ради диска». Диск дешевле инцидента: даже 512 ГБ mini стоят меньше одной ошибочно смаршрутированной прод-диалога.

Зафиксируйте владельца автоматизационного пользователя для каждого дерева. Если оба агента под одним пользователем macOS, изоляция держится только на каталогах и аргументах plist — при миграции на разных пользователей сохраняйте имена каталогов.

Метки, логи, блоки окружения

Используйте разные Label вроде com.example.openclaw.gateway.staging и com.example.openclaw.gateway.prod; дубликаты заставляют launchctl kickstart -k перезапускать не тот мир. Направьте StandardOutPath и StandardErrorPath в разные файлы под ~/Library/Logs/OpenClaw/.

В LaunchEnvironmentVariables укажите абсолютный Node из which node, укороченный PATH со shim Homebrew/volta перед системными путями и переменную вроде OPENCLAW_PROFILE_DIR. Сначала прогоните plist вручную, затем launchctl bootstrap gui/$(id -u).

В циклах падений держите ThrottleInterval не ниже 10 секунд, чтобы не заливать логи одинаковыми стеками.

Матрица портов

ИзмерениеStagingПродакшен
Порт87878788
Корень~/.openclaw-staging~/.openclaw-prod
Label…gateway.staging…gateway.prod
Ротация ключейеженедельно при активной разработкеежемесячно или по окну
doctorперед каждым merge-previewпосле каждого релизного тега

Мониторинг, дрейф и снимки launchctl

Еженедельно сохраняйте вывод launchctl print gui/$(id -u) для каждого профиля и сравнивайте SHA-256 экспортированных plist с репозиторием конфигурации. Если отличается только пробел или BOM, помечайте коммит как рискованный: некоторые редакторы вставляют символы, которые launchd молча игнорирует или парсит неверно.

Для метрик держите компактные гистограммы по профилю: число активных вызовов инструментов, медианная задержка до API модели, доля ответов 429 и число успешных прогонов doctor в сутки. Не раздувайте кардинальность — не каждый пользовательский идентификатор как лейбл; не более 12 бакетов на гистограмму, чтобы Prometheus или VictoriaMetrics на mini не раздували память.

Резервное копирование и восстановление включайте в тот же календарь, что и ротацию секретов: раз в квартал полностью удаляйте staging и восстанавливайте из последнего tarball, а для продакшена проводите только сухой прогон скриптов без живого трафика. Фиксируйте время — цель менее 30 минут до снова зелёного health-check.

Обратный прокси, loopback и операторские ловушки

Большинство команд завершают TLS на nginx или Caddy и проксируют на loopback. Оба шлюза должны слушать только 127.0.0.1, если нет явных правил файрвола — привязка 0.0.0.0 на общем mini случайно выставляет автоматизацию в сегмент LAN. При HTTP/2 учитывайте ответы 100 Continue и idle-timeout: staging должен отражать продакшен с точностью ±5%, иначе воспроизводимые баги прячутся за искусственно короткими idle-окнами.

Связка через связку ключей тихая: если оба профиля импортируют одну и ту же identity для подписи или клиентский сертификат API, macOS кэширует разблокировки на сессию пользователя. Выполняйте security find-identity -v -p codesigning для каждого профиля и прикладывайте скриншоты к тикету, чтобы аудит видел, какая identity обслуживает какой plist.

Для инцидентов держите одностраничный runbook переключения профиля: какой Label первым bootout, какой порт освободить, какой резервный tarball ~/.openclaw-prod восстанавливать и какие флаги doctor давали последний зелёный билд. Без этого команды приходят к killall node, что игнорирует политику перезапуска launchd и гарантирует третий «сюрприз»-процесс.

Память, бюджет RAM и мягкая деградация

Два Node-шлюза плюс обратный прокси на 16 ГБ mini легко занимают 6–8 ГБ резидентной памяти, когда буферизуются выводы инструментов. Задайте жёсткие лимиты параллельных вызовов инструментов на профиль — например не более четырёх воркеров в staging и восьми в продакшене — и занесите цифры в capacity review. Если staging стабильно превышает продакшен, профиль завышен по оптимизму.

CPU на Apple Silicon редко узкое место, но термодросселирование после длинных сборок может менять поведение JIT. Планируйте ночные задания так, чтобы они не пересекались с ежедневным окном doctor; желательно 45 минут буфера после крупных npm-установок, прежде чем health снова обязан быть зелёным.

Если профиль всё же упирается в OOM, выгружайте только его Label, не оба: второй шлюз остаётся эталоном онлайн, пока вы снимаете heap dump. В постмортеме ссылайтесь на статьи про коды выхода, а не на общую формулировку «Node упал».

Чеклист воспроизводимого раската

  1. Создать оба каталога с chmod 700 и проверить владельца через ls -le.
  2. Зарезервировать порты lsof -nP -iTCP:8787 -sTCP:LISTEN и для 8788; освободить зомби до bind.
  3. Скопировать шаблоны plist и сделать diff — отличаться должны только Label, пути, порты и блоки окружения.
  4. Запустить openclaw doctor (или вашу точку входа) из каждого корня с экспортированным целевым окружением.
  5. Сначала поднять staging; выполнить синтетический health на 127.0.0.1:8787 (путь подстройте под ваш шлюз) — три попытки с интервалом две секунды и ответами 200.
  6. Затем bootstrap продакшена и повторить пробу на 8788.
  7. Архивировать SHA-256 plist в тикете, чтобы ревью дрейфа сравнивало хэши, а не глазами.
  8. Задокументировать откат: launchctl bootout для prod-label, откат plist, при необходимости заново bootstrap только staging.

Если пробы падают при зелёном doctor, проверьте интерфейс привязки: смесь 127.0.0.1 и 0.0.0.0 между профилями заставляет health врать — URL пробы должен совпадать с адресом bind из ProgramArguments plist.

FAQ

Можно ли двум шлюзам делить один каталог конфигурации?

Нет — кэши токенов, блокировки sqlite и skills будут гоняться; всегда разделяйте деревья.

Только один публичный hostname?

Завершайте TLS на reverse proxy и маршрутизируйте по SNI или пути на два loopback-порта; сами шлюзы держите локально.

Как доказать изоляцию security-команде?

Покажите разные Label plist, разные пути логов, независимые API-ключи и выводы doctor с метками времени по каждому профилю.

Почему не оба в Docker на Linux?

Потеряете macOS launchd, Keychain и пути Apple Silicon GPU, на которые многие цепочки OpenClaw рассчитывают в десктопной автоматизации.

Аренда Mac mini на Apple Silicon сочетает низкое энергопотребление в простое — часто меньше 12 Вт на столе — с запасом для двух Node-шлюзов, Safari-smoke и хвостов log stream. Облачные mini MacHTML дают SSH и опциональный VNC, чтобы вдвоём разбирать plist XML без пересылки ноутбуков через границы. Когда пилот закончен, остановите инстанс: платите календарные дни репетиций, а не трёхлетнюю амортизацию.

Эта эластичность важна для OpenClaw, потому что профили по природе временные: staging должен меняться еженедельно, а продакшен оставаться скучным. Аренда держит оба мира на одном тихом столе без закупки второго «железного ящика», который простаивает после релиза фичи.

Репетируйте два профиля OpenClaw на настоящем macOS

Арендуйте облачный Mac mini, чтобы проверить изоляцию plist, раздельные порты и прогоны doctor до слияния автоматизации в продакшен.

Два профиля OpenClaw на Mac
от ~16,9 $/день