2026: изоляция OpenClaw dev, staging и prod на одном арендованном Mac mini (LaunchAgent, порты, секреты)
Команды разворачивают автоматизацию OpenClaw на арендованных хостах Mac mini M4 в Гонконге, Японии, Корее, Сингапуре и США, чтобы сохранить тот же macOS, что на ноутбуках—but промпт staging, переписывающий прод-скиллы MCP, быстрее всего разрушает доверие. Здесь (1) зачем даже одному mini нужны три жёсткие стены, (2) матрица blast-radius, (3) контракт папок и портов, удобный для grep, (4) повторяемый паттерн LaunchAgent под launchd, (5) как делить секреты и JSONL без дублирования GPU, (6) preflight перед merge. Ссылки: параллельные агенты, секреты и связка ключей, JSONL-диагностика.
Почему три среды на одном Apple Silicon mini лучше «одной папки YOLO»
Финансы видят среды как строки счёта; платформа — как области отказа. Один LaunchAgent с доступом и к Slack-webhook, и к Terraform prod — в одном merge от катастрофы. Делить dev / staging / prod на одной машине дёшево: запас CPU на M4 большой—дорого обходится беспечный общий доступ к файлам. Изоляция даёт независимые откаты, реалистичные soak-тесты без клиентских webhook и аудит, отделяющий «Сара пробует skill» от «сработал биллинг-бот».
По мере роста команды держите RACI рядом с таблицей—права не должны выводиться из имён папок. Нарушение строки: заморозить деплой и откатиться по playbook апгрейда прежде чем отлаживать код.
- Числовой порог: минимум 20 ГБ свободного APFS на корень среды, чтобы JSONL-пики при нагрузочных тестах не стопорили других агентов.
- Человеческий порог: не используйте один канал Slack для staging-алертов и прод-инцидентов—шум учит игнорировать оба.
- Порог автоматизации: держите staging-
maxConcurrentTasksна половине prod, пока квоты API не стабилизируются неделю.
Матрица blast-radius: что каждая среда может трогать
| Среда | Разрешённые побочные эффекты | Запрещено без тикета | Типичный охват API-ключа |
|---|---|---|---|
| Dev | Локальные ветки git, песочные SaaS-проекты | Экспорт PII клиентов | Зеркала только чтение или короткоживущие PAT |
| Staging | Полный граф скиллов на клонированных данных | Изменения DNS prod | Отдельный Stripe testmode + непрод AWS-роль |
| Prod | Клиентские workflow, биллинг-webhook | Экспериментальные компиляторы | Роли least-privilege с квартальной ротацией |
Вышлите матрицу рядом с архитектурной диаграммой, чтобы новички не выводили IAM из названий каталогов.
Контракт папок и портов из мышечной памяти
Создайте три соседних каталога вроде ~/openclaw-dev, ~/openclaw-staging, ~/openclaw-prod—staging не вкладывайте в prod. Внутри зеркалируйте config, skills, logs, tmp, чтобы саппорт-скрипты совпадали. Привязывайте шлюзы к 127.0.0.1 на разнесённых портах: пример dev 18789, staging 18799, prod 18809—промежутки впитывают временные порты при парном дебаге.
Зафиксируйте в wiki пять колонок: имя среды, абсолютный путь, TCP-порт, label LaunchAgent, Unix-владелец. Ответ «какой plist завис?» — один grep.
Паттерн LaunchAgent: один plist на среду, не один гигантский plist
Три файла вроде com.yourorg.openclaw.dev.plist, ...staging.plist, ...prod.plist. В каждом задайте WorkingDirectory, EnvironmentVariables для нестандартного PATH, StandardOutPath/StandardErrorPath в дерево logs этой среды. На старте держите ThrottleInterval 10 секунд, чтобы циклы падений не долбили провайдеров.
Скелет (укоротите пути установки):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>Label</key><string>com.example.openclaw.staging</string>
<key>WorkingDirectory</key><string>/Users/automation/openclaw-staging</string>
<key>ProgramArguments</key><array>
<string>/opt/homebrew/bin/openclaw</string>
<string>gateway</string>
<string>--port</string><string>18799</string>
</array>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
</dict></plist>
127.0.0.1, удалённый доступ через SSH port-forward или проверенный edge-proxy — не светите сырые порты шлюза в интернет.
Секреты, логи и ротация без перекрёстного загрязнения
Ключи API — в отдельных записях связки или файлах .env с правами 0400, по одному на среду. Когда ротируете prod-ключи, staging не должен читать тот же путь «временно» — этот shortcut становится постоянным. В JSONL префиксуйте события env=staging и разводите имена файлов, чтобы ротация не отрезала историю prod из‑за шума dev.
Health на http://127.0.0.1:<port>/healthz по шаблонам из health probe. Пороги разные: dev может мигать ~5 % во время экспериментов; prod пейджит после двух подряд провалов.
Preflight перед промоушеном скиллов в prod
- Diff конфигов: staging-
openclaw.jsonсовпадает с prod кроме явно перечисленных ключей. - Сухой replay: последние 50 прод-подобных событий через staging с анонимизированными полезными нагрузками.
- Порты:
lsof -nP -iTCP -sTCP:LISTENпоказывает только задуманные loopback-слушатели. - Диск:
df -h— минимум 20 ГБ на томе APFS с prod-логами. - MCP-серверы: манифест инструментов указывает на разные рабочие каталоги.
- Репетиция rollback:
launchctl unload/load для prod-plist в окне обслуживания. - Подпись: инициалы ревьюера в тикете — автоматизация заслуживает ту же дисциплину, что и приложение.
FAQ
Prod под root? Нет — выделенные сервисные учётки с ACL файлов всегда лучше; root усложняет TCC и аудит.
Один Node runtime? Версии могут совпадать, но NODE_OPTIONS и глобальные npm-префиксы — по средам, иначе те же ловушки PATH, что в статье про Homebrew.
GitOps? Зеркалить ветки (main, staging, dev) и по возможности read-only клоны — см. версионирование конфигов.
Почему аренда Mac mini ProxyMac всё ещё подходит мульти-средовому OpenClaw
После изоляции одна Mac mini M4 даёт unified memory для параллельных шлюзов, нативное macOS как на ноутбуках и прогнозируемые платежи в HK / JP / KR / SG / US без скачков CapEx. Это важно, когда staging собирает Swift-пакеты, а prod отвечает на webhook. Сравните уровни на странице цен, читайте справочный центр про удалённый доступ и держите VNC, если launchctl молчит в текстовых логах.
Изолируйте агентов, потом масштабируйте параллелизм
OpenClaw на Apple Silicon M4 · HK / JP / KR / SG / US