2026 Переменные окружения OpenClaw MCP: почему шлюзы launchd на Mac mini ProxyMac теряют API-ключи, которые ваша SSH-сессия всё ещё видит
После «зелёных» диска и 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.
Девять шагов аудита для случая «MCP не видит мои ключи»
- Воспроизведите под launchd: прекратите ручные запуски по SSH; провоцируйте сбой только через реальный шлюз.
- Снимите env launchd: используйте
launchctl print gui/$(id -u)/com.example.openclaw(домен скорректируйте) и прочитайте блок EnvironmentVariables. - Сравните PATH: если исчезли бинарники Homebrew, исправьте абсолютными путями или ключами PATH — см. отдельную статью про PATH.
- Проверьте режимы оболочки: выполните
ssh host 'env'противssh -t host zsh -lic env, чтобы выявить разницу login vs non-login. - Проверьте конфиги MCP: одни серверы читают
API_KEY, другие ждутOPENAI_API_KEY; сверяйте имена с апстрим-документацией. - Исследуйте буферизацию stdio: тихие зависания могут быть буферизацией, а не авторизацией — подтвердите по гайду stdio.
- Просмотрите JSONL: сопоставьте сбои инструментов со структурированными логами; редактируйте токены перед внешним обменом.
- Проверьте ulimits: большие пакеты агентов могут исчерпать дескрипторы файлов независимо от env — см. статью про ulimit.
- Зафиксируйте исправление: коммитьте diff plist с ID тикетов; раскатывайте через практики версионирования конфигурации.
Граница секретов: 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