2026: токены шлюза OpenClaw под launchd на арендованном ProxyMac Mac mini — SSH показывает успешную аутентификацию, а демон снова и снова выдаёт token_missing_config
Команды, разворачивающие 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
- Заморозьте хуки CI, автоматически перезапускающие шлюз, пока люди не зафиксируют один чистый цикл загрузки.
- Запишите UID/GID из
idв сессии LaunchAgent (launchctl print user/$(id -u)). - Сравните конфиги:
diff ~/.openclaw/openclaw.jsonс резервной копией из Git по версионированию конфигурации. - Синтаксис JSON:
python3 -m json.toolилиjq .для поиска хвостовых запятых после аварийных правок. - Сравните окружение:
env | sortпо SSH против блока EnvironmentVariables изlaunchctl print. - Выровняйте PATH: чтобы
openclawнаходился через абсолютные пути вProgramArgumentsсогласно руководству по PATH. - Чистый перезапуск: следуйте порядку восстановления — kickstart, а не хаотичные bootout.
- Tail JSONL: подтвердите эквиваленты
authenticated=trueдо возврата входящего трафика. - Задокументируйте: в тикет — маскированные выдержки и контрольную сумму 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