1. Разбор
(1) Расхождение путей — ложный «reload не сработал». (2) Node 22 — договор команды; расхождение minor CI/ноутбук ломает нативные аддоны. (3) Обновление без снимка тома даёт полумиграцию. (4) Наблюдаемость и права: смесь sudo-глобалов с пользовательским prefix или launchd-пользователь ≠ владелец state-каталогов даёт «процесс жив, а записать нельзя» — в runbook фиксируем пользователя, cwd, umask.
2. Матрица
| Ось | npm global | Docker | pnpm source |
|---|---|---|---|
| Скорость | Быстрый тест | Средне | Медленно, аудит |
| Изоляция | Слабая | Сильная | Средняя |
| Данные | Документировать home | Тома обязательны | от способа запуска |
| Обновление | npm i -g | тег+pull | git+pnpm+build |
| Откат | фикс версии | тег+снимок | git tag |
3. Пять шагов
- Заморозить рантайм: Node 22+ или LTS из README везде, явно описать неподдерживаемые диапазоны. Docker: имя compose-файла, ссылка на образ (тег vs digest), кто может поднимать базовые образы.
- Карта четырёх классов: конфиг, секреты, состояние сессий/скиллов, логи — в compose комментировать хостовые bind-пути, чтобы дежурный не гонялся только за путями внутри контейнера.
- Золотой путь: onboard → минимальный smoke каналов → foreground Gateway → launchd/демон; в runbook — ожидаемые строки логов и критерии «зелёно».
- SOP обновления: тикет → бэкап тома/каталога или снапшот СХД → апгрейд → doctor → channels probe; без бэкапа — стоп по чек-листу.
- SOP отката: пакет/образ и данные вместе; затем status/doctor из лестницы диагностики до объявления восстановления.
4. Цифры
- Две формы >14 дней без доки ≈ 2–4 ч/нед на «какой шлюз боевой».
- В проде — хотя бы один восстанавливаемый снимок.
- launchd WorkingDirectory = умолчание CLI.
5. Удалённый Mac
| Сигнал | Действие |
|---|---|
| Нужен 7×24, ноутбук спит | VPS или Mac+launchd |
| Расхождение DNS/NTP | Одна топология |
| Apple-стек в одном SLA | Удалённый Apple Silicon |
Дисциплина изменений: в тикете/CMDB свяжите «форма установки + ID тома + владелец дежурства». Без триады разбор превращается в «где-то что-то крутилось». На удалённом Mac разведите алерты bastion / демонстрации экрана / здоровья шлюза. Раз в квартал — учение «восстановление из снапшота + smoke каналов»; дешевле ночного аврала при реальном регрессе.
6. FAQ
Глобальный CLI к контейнерному Gateway — одна таблица URL, токенов, путей, иначе «CLI смотрит в A, демон в B». Rootless: UID и явный user в compose.
pnpm в CI: pnpm i --frozen-lockfile, тестовый Gateway изолировать от прод-томов. Тишина каналов после апгрейда: сначала doctor/pairing, не три переустановки — диагностика.
Healthcheck в compose? Да — минимальный liveness, restart с потолком backoff, иначе полузапущенный контейнер уйдёт в петлю рестартов. Для нагрузок с тяжёлыми I/O помните: SSD/NVMe и очередь диска влияют на стабильность логов и чекпоинтов состояния не хуже CPU.
7. Углубление
В 2026 чаще не хватает единого источника правды, а не функций. npm global даёт скорость, Docker покупает изоляцию ценой дисциплины томов, pnpm source — аудит ценой владения сборкой и цепочкой поставки.
Для Docker заведите ops-страницу: политика тегов (latest только для песочницы; прод — неизменяемый тег/digest), окна бэкапа по тихим часам каналов, имена compose-проектов для аудита правок. Для pnpm включите в ревью corepack, .npmrc, зеркала приватного registry — иначе ночные сборки «плывут» по дереву зависимостей.
Предсказуемый откат и воспроизводимая среда важнее гонки за последним минором: провал без снимка тома часто измеряется днями простоя — в SLA это дороже месячной аренды выделенного удалённого Mac. Радиус эксплуатации растёт, когда документирован один путь установки и одна топология сети host↔container (DNS/NTP), иначе каждый инцидент превращается в квест по двум мирам файловых путей.
Долгоживущий Gateway и плотные вызовы инструментов переносят на выделенный удалённый Mac; ноутбук остаётся лёгким CLI — меньше борьбы за унифицированную память с Xcode/Final Cut, меньше троттлинга при одновременном Metal/видеоконвейере и фоновом агенте. Это не отказ от Docker/npm, а разделение интерактивной и серверной машины. Типично: прод на фиксированной топологии (чистый launchd или один compose-стек), ноутбук для pairing/отладки скиллов — крышка закрыта, автоматизация жива.
Чек-лист перед продом: для npm global проверьте which -a openclaw и порядок PATH — дубли бинарей дают классический «отвечает не та версия». Для Compose согласуйте .env, хранилище секретов и права на тома; прод-токены не должны лежать в каталогах, которые синхронизируются на ноутбуки. Для pnpm source CI и прод-хост обязаны делить политику registry/store, иначе lockfile совпадает, а дерево зависимостей расходится. Для команд с тяжёлым Metal-конвейером полезно заранее заложить бюджет на аренду узла вместо ночных сессий из-за теплового троттлинга при параллельном рендере и Gateway.
Зафиксируйте сетевые политики отдельно для каждой топологии: исходящие webhooks, mTLS к внутренним API, split-horizon DNS. Контейнерный Gateway с другим резолвером, чем хост, может показывать «зелёные» healthcheck’и при джиттере внешних каналов — это не баг OpenClaw, а инфраструктурный долг, который живёт в том же runbook, что и карта томов.
Аудит и совместная работа: заведите RACI — кто меняет теги образов, кто повышает глобальный npm-пакет, кто мержит pnpm-lock. Без границ «пятничные хотфиксы» ломают понедельничный CI. Для томов с логами переписок пропишите сроки хранения и ответственных в соответствии с локальными требованиями к данным; технический откат не отменяет юридического удаления. Распределённым командам полезно дублировать эскалации по часовым поясам, чтобы инцидент Gateway не завис в одном мессенджер-канале, пока другая география офлайн.
Наконец, помните про планировщик ОС: на macOS launchd не эквивалентен произвольному cron внутри контейнера — разные таймеры, разные переменные окружения, разные лимиты файловых дескрипторов. Смешивая bare-metal launchd и контейнерный cron без документации, вы получаете гонки при ротации логов и двойные heartbeat’ы к одному и тому же каналу — ещё один источник «немых» инцидентов, который лечится единым расписанием, а не перезагрузками.
Для сравнения «стоит ли выносить Gateway» полезно смотреть на хвосты задержек (p95/p99) при одновременном рендере и работающем агенте на ноутбуке: тепловой троттлинг раздувает хвост сильнее, чем добавляет сотни мегагерц в спецификации. Выделенный арендованный Mac под постоянный Gateway часто сжимает распределение задержек заметнее, чем точечный апгрейд CPU. Добавьте на дашборд корреляцию задержек каналов с температурой SoC — график часто быстрее любой политической дискуссии о выборе npm против Docker. Учитывайте также долю повторных попыток и ошибок сети.
8. MACGPU
(1) Ограничения путей: глобал бодается с системным Node, правами, EDR/MDM; Docker требует гигиены томов/образов — дрейф DNS/NTP хост↔контейнер раздувает время расследования; source без lockfile/CI даёт «собралось, но Gateway шатается». Смешение без документации множит дрейф конфигов.
(2) Удалённый Mac: Apple Silicon, unified memory, нативный creative/automation-стек для 24/7; launchd вне GUI-сессии снижает джиттер каналов и модальные всплывашки, граница эксплуатации чище.
(3) MACGPU: низкий порог для проверки «один путь + launchd» на арендованном узле до крупного CAPEX — CTA ведёт к публичным планам без логина.