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

2026: токены шлюза OpenClaw под launchd на арендованном ProxyMac Mac mini — SSH показывает успешную аутентификацию, а демон снова и снова выдаёт token_missing_config

Инженерная команда ProxyMac 11 мая 2026 г. около 13 мин чтения

Команды, разворачивающие OpenClaw на хостах Apple Silicon Mac mini в Гонконге, Японии, Корее, Сингапуре или США, часто вставляют bearer-токен в терминал, видят зелёный openclaw gateway status, перезагружаются — и получают от launchd перезапуск шлюза с логами token_missing_config или «аутентификация настроена, но токена нет». Причина редко в криптографии: три разных контекста по-разному понимают, где лежат учётные данные: ваша интерактивная оболочка, дерево JSON под ~/.openclaw/ и очищенный блок окружения, который наследует launchd. В статье — (1) ясная модель этого расхождения, (2) матрица согласования из четырёх строк, (3) проверки файловой системы до вызова дежурного, (4) усиленные шаблоны plist, (5) операционный runbook из девяти шагов и ссылки на launchd и SSH, секреты Keychain, восстановление шлюза и диагностику JSONL.

  • Сводка симптомов: перезапуски с кодом вроде 78 каждые 45–90 секунд, пока ручные проверки CLI проходят.
  • Скрытая ловушка: шлюз работает от пользователя runner, а JSON лежит в /Users/admin/ — классический дрейф между учётными записями.
  • Якорь телеметрии: сопоставляйте строки JSONL с auth и вывод launchctl print gui/$(id -u) после правки метки.

Почему шлюз «забывает» токены после того, как вы их экспортировали

OpenClaw сначала разрешает аутентификацию шлюза из файлов конфигурации, затем применяет необязательные переопределения окружения. SSH-сессия загружает ~/.zprofile, наследует экспорты онбординга и читает файлы интерактивного UID. LaunchAgent стартует из launchd, наследует только явные ключи EnvironmentVariables и урезанный PATH, а ~ разрешается относительно сервисной учётной записи — даже если другой администратор правил JSON. Пока эти факты не совпадут, демон будет циклиться независимо от региона облака.

Практическое правило: если sudo -u svcaccount printenv OPENCLAW_GATEWAY_TOKEN пуст, а в терминале значение есть — доказано расхождение окружения, а не плохой токен.

Тройная матрица: интерактивная оболочка, JSON на диске, окружение LaunchAgent

Источник Читает ~/.openclaw/openclaw.json Видит экспорты оболочки Рекомендуется для автономного шлюза
SSH login shell Да — UID должен совпадать с сервисным пользователем Да — после dotfiles Только отладка
ssh host command без входа Возможно — зависит от режима оболочки Часто нет Канареечные тесты
plist LaunchAgent Да — домашний каталог учётной записи, запускающей задачу Только ключи plist Продакшен-базовая линия
Обёртка, запускаемая plist Да — если скрипт корректно снижает привилегии Что экспортировано до exec Продвинутая инъекция секретов

Проверьте расположение JSON, владельца и права POSIX прежде чем винить API

Выполните ls -le ~/.openclaw/openclaw.json от того же UID, который закодирован в LaunchAgent. Ожидайте права 600 и владельца этого UID — не root, если только вы намеренно не используете системный демон (на арендованных mini редко). После нескольких правок через sudo tee фрагменты ACL могут запретить пользователю шлюза, оставляя чтение администратору в интерактиве. Сверьте с launchctl print gui/$UID (при необходимости выберите домен gui или user), чтобы подтвердить метку plist, которая действительно надзирает за OpenClaw.

Если вы перенесли корень конфигурации из-за давления на диск — см. ротацию диска — убедитесь, что относительные пути в JSON по-прежнему разрешаются из рабочего каталога демона.

Шаблоны plist: EnvironmentVariables против exec обёртки

Короткие не-секретные флаги вроде OPENCLAW_LOG_LEVEL=debug объявляйте прямо в EnvironmentVariables. Для bearer-токенов предпочтительнее ссылки на файлы или небольшие обёртки с загрузкой через Keychain по руководству по секретам, а не многокилобайтные строки в XML. Обёртки держите в /usr/local/libexec/openclaw/ или закрытом ~/svc/bin с ежеквартальным аудитом владельцев.

Осторожно при ротации: после смены токена выполните launchctl kickstart -k gui/$(id -u)/your.label ровно один раз — частые повторы наслаивают транзакции задач и размывают временную шкалу JSONL из структурированного логирования.

Девять шагов, чтобы остановить циклы токена на mini HK / JP / KR / SG / US

  1. Заморозьте хуки CI, автоматически перезапускающие шлюз, пока люди не зафиксируют один чистый цикл загрузки.
  2. Запишите UID/GID из id в сессии LaunchAgent (launchctl print user/$(id -u)).
  3. Сравните конфиги: diff ~/.openclaw/openclaw.json с резервной копией из Git по версионированию конфигурации.
  4. Синтаксис JSON: python3 -m json.tool или jq . для поиска хвостовых запятых после аварийных правок.
  5. Сравните окружение: env | sort по SSH против блока EnvironmentVariables из launchctl print.
  6. Выровняйте PATH: чтобы openclaw находился через абсолютные пути в ProgramArguments согласно руководству по PATH.
  7. Чистый перезапуск: следуйте порядку восстановления — kickstart, а не хаотичные bootout.
  8. Tail JSONL: подтвердите эквиваленты authenticated=true до возврата входящего трафика.
  9. Задокументируйте: в тикет — маскированные выдержки и контрольную сумму plist.

FAQ

Стоит ли арендаторам делить один токен между регионами? Лучше разные учётные данные на регион, если консоль позволяет — меньше радиус поражения при ротации mini.

Ломает ли переезд на новую mini токены? Файлы переносятся; сессии на стороне эмитента могут оставаться валидными — планируйте явную ротацию при смене идентичности хоста.

Куда помещать входящие webhooks? После стабилизации аутентификации подключайте точки входа по шаблонам HTTP-шлюза, чтобы повторы не усиливали частичные настройки.

Почему детерминированные домашние каталоги помогают арендаторам ProxyMac

Арендованная ёмкость Mac mini M4 в HK / JP / KR / SG / US даёт долгоживущие пути для деревьев конфигурации, предсказуемые UID для сервисных учётных записей и эффективность Apple Silicon для постоянных шлюзов — без закупки железа в каждом регионе. Сравните регионы на странице цен, отработайте процедуры в справочном центре, а сценарии с GUI и Keychain прогоните через VNC, когда без интерфейса нельзя.

Привяжите токены один раз — держите шлюзы неделями

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