ИИ / Автоматизация 7 мая 2026 г.

2026 Переменные окружения OpenClaw MCP: почему шлюзы launchd на Mac mini ProxyMac теряют API-ключи, которые ваша SSH-сессия всё ещё видит

Инженерная команда ProxyMac 7 мая 2026 г. ~12 мин чтения

После «зелёных» диска и PATH дополните этот разбор чек-листом первого SSH-запуска (2026-05-13). Команды, которые выкатывают OpenClaw на арендованных хостах Mac mini M4 в Гонконге, Японии, Корее, Сингапуре и США, регулярно видят, как серверы инструментов MCP падают с ошибками «missing API key» — даже когда тот же бинарник безупречно работает в интерактивной SSH-сессии. Расхождение почти никогда не означает «OpenClaw забыл криптографию»; речь о двух разных деревьях процессов, наследующих два разных блока окружения. Этот playbook объясняет (1), как LaunchAgents от launchd «чистят» переменные, (2) почему неинтерактивные оболочки пропускают ваши аккуратные строки export в .zshrc, (3) трёхслойную сравнительную таблицу Terminal, SSH и launchd, (4) укреплённые шаблоны plist плюс опциональные обёртки, (5) девять шагов аудита, убирающих гадание, и (6), как согласовать это с гигиеной секретов без вывода токенов в логи. Перекрёстные ссылки: PATH и Homebrew, связка ключей и секреты, диагностика JSONL и изоляция dev/staging/prod для полной картины цепочки.

Разные деревья процессов — разная «ДНК» окружения

Когда вы подключаетесь по SSH к mini и запускаете openclaw вручную, оболочка обычно работает как интерактивная или login-сессия, подхватывая ~/.zprofile или ~/.zshrc и наследуя все строки export FOO=bar. LaunchAgent, стартующий при загрузке, наследует только то, что вливает launchd — часто усечённый PATH без /opt/homebrew/bin и ноль знаний о токенах, добавленных «в прошлый вторник». Дочерние процессы MCP, форкнутые от шлюза, копируют это скудное окружение, поэтому инструменты, вызываемые моделью, не видят переменные, существующие лишь в эмуляторе терминала.

  • Измеренный разрыв: в эскалациях поддержки примерно 35% отчётов «в SSH работает, в демоне нет» решаются чистым переносом экспортов в EnvironmentVariables или обёртку.
  • Путаница с таймаутами: пропавшие ключи иногда проявляются как 30–45 с зависаний инструментов, пока SDK повторяет DNS или конечные точки авторизации — легко принять за потерю сети на пути HK → US.
  • Поворот с параллелизмом: когда несколько агентов работают по гайду параллелизма, безопасная загрузка окружения без гонок важнее ещё сильнее.

Трёхсторонняя матрица: GUI Terminal против SSH против launchd

ИсточникТипичный PATHЧитает .zshrc?Видит помощники Keychain?Рекомендуется для MCP в проде
Terminal.app, login shellПолный HomebrewДаЧасто через пользовательскую сессиюНет — дрейф конфигурации
ssh user@host commandЗависит от режима оболочкиИногдаПо-разномуТолько для отладки
LaunchAgentЗадан в plistНетТолько если явно закодированоДа — явное окружение

Шаблоны plist: EnvironmentVariables, ProgramArguments и компактные обёртки

Apple документирует словари EnvironmentVariables внутри plist LaunchAgent — используйте их для не-секретных флагов вроде NODE_ENV=production или PYTHONNOUSERSITE=1. Для секретов либо указывайте файл, читаемый только пользователем сервиса (chmod 600), либо вызывайте обёртку, которая через security find-generic-password подтягивает учётные данные перед exec Node. Держите обёртки под /usr/local/libexec или в выделенном ~svc/bin с неизменяемым владельцем.

Сочетайте раздел с восстановлением после перезапуска шлюза, чтобы каждое редактирование plist проходило через проверенную процедуру launchctl kickstart -k.

Совет: логируйте эффективное окружение через однострочный отладочный клон LaunchAgent, который пишет отсортированные переменные в защищённый файл — удалите через 24 часа, чтобы избежать утечек.

Девять шагов аудита для случая «MCP не видит мои ключи»

  1. Воспроизведите под launchd: прекратите ручные запуски по SSH; провоцируйте сбой только через реальный шлюз.
  2. Снимите env launchd: используйте launchctl print gui/$(id -u)/com.example.openclaw (домен скорректируйте) и прочитайте блок EnvironmentVariables.
  3. Сравните PATH: если исчезли бинарники Homebrew, исправьте абсолютными путями или ключами PATH — см. отдельную статью про PATH.
  4. Проверьте режимы оболочки: выполните ssh host 'env' против ssh -t host zsh -lic env, чтобы выявить разницу login vs non-login.
  5. Проверьте конфиги MCP: одни серверы читают API_KEY, другие ждут OPENAI_API_KEY; сверяйте имена с апстрим-документацией.
  6. Исследуйте буферизацию stdio: тихие зависания могут быть буферизацией, а не авторизацией — подтвердите по гайду stdio.
  7. Просмотрите JSONL: сопоставьте сбои инструментов со структурированными логами; редактируйте токены перед внешним обменом.
  8. Проверьте ulimits: большие пакеты агентов могут исчерпать дескрипторы файлов независимо от env — см. статью про ulimit.
  9. Зафиксируйте исправление: коммитьте diff plist с ID тикетов; раскатывайте через практики версионирования конфигурации.
Никогда не вставляйте прод-секреты в Slack, чтобы «доказать», что MCP работает — используйте одноразовые замаскированные хэши или ссылки на хранилище.

Граница секретов: Keychain, файлы и ротация

Доступ к связке ключей macOS из LaunchAgents требует корректных ACL; интерактивный Terminal часто показывает визуальные запросы, тогда как безголовые демоны падают в безопасный отказ. Согласуйте с гигиеной секретов: разделяйте связки для автоматизации, ротируйте ключи каждые 90 дней для регулируемых нагрузок и обеспечьте общую политику для реплик HK / JP / KR / SG / US — не дублируйте ad hoc .env.

Когда несколько арендаторов делят один mini (не рекомендуется, но встречается в лабораториях), изолируйте переменные окружения по гайду изоляции, чтобы staging не читал прод-токены через случайное наследование.

FAQ

Починит ли контейнеризация OpenClaw проблемы env? Контейнеры помогают воспроизводимости, но всё равно требуют явных флагов -e или томов секретов — бесплатного обеда нет.

Можно ли source .env внутри ProgramArguments? Только через оболочку-обёртку; сам launchd не парсит dotenv-файлы.

Помогает ли sudo -E? Сохраняет окружение вызывающего при повышении UID — полезно для тестов, опасно как постоянная стратегия MCP из-за расширения поверхности атаки.

Почему Mac mini ProxyMac — правильное место, чтобы укрепить окружение MCP

Выделенный Mac mini M4 в HK / JP / KR / SG / US даёт долгоживущих супервизоров launchd, предсказуемые пути к обёрткам и энергоэффективность Apple Silicon для постоянно включённых шлюзов — без покупки железа в каждом регионе. Когда блоки окружения совпадают между CI, staging и prod, агенты OpenClaw перестают «дребезжать», когда оператор выходит из SSH. Изучите цены для выбора колокации, опирайтесь на справочный центр для моделей доступа и при необходимости интерактивно проверяйте запросы связки ключей через VNC.

Доставляйте OpenClaw с детерминированным окружением

MCP · launchd · HK / JP / KR / SG / US