Шлюз OpenClaw на Linux под пользовательским systemd

2026 OpenClaw на Linux systemd после обновления: дрейф HOME, пустая конфигурация, doctor

После апгрейда дистрибутива или глобальной перестановки пакета службы systemd --user могут оставаться «зелёными», пока шлюз читает скелетную openclaw.json из иного сочетания HOME и базовых каталогов XDG, чем ваша интерактивная SSH-сессия. Сначала рассматривайте кейс как уход среды и контролируемое слияние JSON; обвинять сеть или поставщиков моделей уместно только после выравнивания путей. Материал ориентирован на физический Linux или ВМ с пользовательским unit-слоем, где фон не наследует по умолчанию те же переменные окружения, что ваша административная оболочка, и не затрагивает установки без ~/.config/systemd/user.

1. Три слоя симптомов: процесс жив, RPC расходится, интерфейс «пустеет»

Слой процесса: systemctl --user показывает active, но демон открывает урезанную openclaw.json, потому что юнит не наследует те же переменные, что ваша интерактивная оболочка.

Слой RPC: openclaw gateway status сообщает сборку или корень конфигурации, не совпадающие с CLI; прежде чем удалять каталоги, откройте руководству по split brain.

Слой UI: статика интерфейса грузится, WebSocket может отвалиться, если секреты и каналы живут под другими путями. Лестница расследования сперва требует подтверждения транспортного уровня, а не простого обновления страницы.

  1. После контролируемого перезапуска снимите не менее двухсот строк журнала юзер-юнита и найдите ENOENT, упоминания HOME и строковые пути к конфигу.
  2. Сравните три среды: логин-шелл, не-login ветку (su или сервисный аккаунт) и вывод systemctl --user show … нужного юнита.
  3. Обязательно архивируйте ~/.openclaw и ~/.config/openclaw до структурного merge или gateway install --force.

Запись в ss -lntp лишь фиксирует прослушивание порта, а не совпадение файла правки пользователя со стартующим процессом. Частый сценарий — глобальная установка под привилегированным аккаунтом и эксплуатация под деплой-пользователем: два HOME приводят к «чужому» дереву конфигурации.

XDG задаёт порядок ~/.config/openclaw, ~/.local/state и исторического ~/.openclaw; патч апстрима иногда переупорядочивает приоритет. Если XDG_CONFIG_HOME/XDG_STATE_HOME есть в вашем шелле, но отсутствует в службе — получается немая рассинхронизация. В тикетах фиксируйте только абсолютные каталоги.

Пропажа расширений в UI при неизменных файлах намекает на второй экземпляр из cron или root-сервис. Сводите списки systemctl --user list-units 'openclaw*' и pgrep -af openclaw.

Не удаляйте скелет сразу: можно потерять авто-мигрированные ключи типа meta.lastTouchedVersion, нужные для интерпретации руководству по split brain и для отчётов о версии схемы и миграций.

2. Последовательность: systemd перед обвинениями апстрима

Системный порядок — статус, команды управления шлюзом, journalctl --user, затем openclaw doctor. Смена модели без выравнивания HOME лишь умножает шум измерений.

systemd --user не читает ~/.bashrc и zsh-профиль. Экспорты графической PAM-сессии, узкий SSH AcceptEnv и блоки systemd складываются; отсутствие HOME уводит рантайм в каталог установки со «свежим» JSON пока файл продакшна лежит в домашнем SSH.

Правду диктует systemctl --user show UNIT -p Environment -p WorkingDirectory -p FragmentPath -p User, а не впечатление от консоли. Сконтрастируйте с printenv HOME XDG_CONFIG_HOME XDG_STATE_HOME в login, не-login shell и любых CI-агентах того же узла.

WorkingDirectory задаёт базу для относительных путей из ExecStart. Устаревший путь после переноса npm global может подгружать дефолтные плагины и визуально «обнулять» активность оператора.

Без loginctl enable-linger пользовательский менеджер исчезает с последней сессией; это даёт мигающее «опустело» между SSH-сессиями. Сопоставляйте журнал загрузки -b с временем обновления пакетов.

Расход SemVer между CLI и демоном требует сначала split-brain playbook: даже точный HOME оставляет полуинициализированные каналы, если версии не собраны.

Секреты переносите последним блоком во избежание блокировок OAuth-провайдер при полу-rendered интерфейсе. Держите два tar-архива — до merge и после успешного doctor — с суффиксом UTC-хостнейма.

Для флотов замораживайте golden-image до минорной версии, меняющей поиск конфигов; сохраните SHA256 drop-in и строку версии RPM/DEB единым change-id. Принуждённый gateway install --force в окне SLA с откатом unit файлов в SCM.

В Docker/Kubernetes переменные задаются манифестом Compose/Helm; не смешивайте без пометки тикета bare-metal советы для контейнера с фиксированным HOME=/root.

Операторам macOS полезно сопоставление с launchd-гайдами (launchctl против loginctl).

Запланируйте ≥15 минут после merge для зондов каждого канала и синтетического сообщения. Если сбои — сохраните HTTP-код и код закрытия WebSocket перед эскалацией к внешнему саппорту.

Инвестируйте в версионность unit-fragment в инфраструктурном репозитории и зеркально указывайте хэш тикете.

Высокошумные каналы наблюдаемости в syslog стоит временно понизить до информационного уровня при активной отладке merge: иначе лавина сообщений от расширений скрывает релевантные строки ENOENT.

В интерактивной среде полезно воспроизвести окружение unit через env -i HOME=… bash --noprofile --norc с последующим экспортом переменных, извлечённых из systemctl show, прежде чем запускать CLI для повторения ошибки обычным операторским аккаунтом.

Если несколько systemd-шаблонных unit-ов конкурируют за один и тот же lock-файл ресурсов, явно пометьте в тикете, какой drop-in новее и кто автор миграции, чтобы поддержка не приняла ситуацию за аппаратный сбой.

Для JSON используйте тот же валидатор, что CI; дополнительно проверьте UNIX-права: демон чаще non-root.

Цепочки EnvironmentFile=- суммируют приоритеты — опишите итоговую эффективную цепь в RCA.

3. Матрица: перезапуск, merge или навязанная установка

Применяйте строки матрицы внутри утверждённых окон простоя и фиксируйте суммы образов/lockfile перед массовой раскаткой. Если сразу после daemon-reload журнал «расшумевается», пересмотрите выбор: синтаксически верный fragment всё же может экспортировать неверный путь. Следите за интервалом между перезапуском демона и первым сообщением приложения — при больших паузах ищите взаимоблокировки lock-файла.

Узнаваемый признак Первое действие Риск
Не задано HOME, записи уходят в дерево пакета Drop-in с явным HOME и WorkingDirectory, наблюдаемый рестарт Низкий
Старый конфиг полон, новый — скелет Посекционное слияние и фиксация метаданных Средний
Разные версии CLI/демона, doctor требует переустановки gateway install или --force в окне простоя Высокий

Метки риска относительны: ошибка последовательности reload может отключить оркестрацию даже «низкая» строка триггерирующая маленький drop-in.

Включите в changelog ссылки на патч апстока меняющий разрешение путей, чтобы платформенники не тратили недели на диагностику «сети».

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

В рядах с обязательной ротацией секретов зарезервируйте отдельный шаг playbook для обновления связанных EnvironmentFile, когда секрет-хранилище выдаёт новый токен; иначе демон увидит устаревшую символьную ссылку переменной.

Для наблюдаемости качества временно суммируйте число перезапусков unit за сутки; превышение порога намекает на нестабильный ExecStart, хотя systemd маскирует проблему политикой автоперезапуска.

До начала объединения записывают свободное место: переполненный том иногда воспроизводит «мертвую» конфигурацию через отказ записи без явной ошибки в редакторе оператора.

Группы с смешённым трактом firewall проверят, что DNAT всё ещё не отправляет клиентский трафик в старый systemd-user инстанс, создающий ложноположительный healthy.

Для отладочных веток отделяйте тестовый override каталога .service.d на отдельной машине: не смешивайте экспериментальные параметры памяти Node с боевым drop-in случайными копированиями Ansible без совпадающего хэша содержимого.

4. Семь контролируемых шагов merge конфигурации

systemctl --user show openclaw-gateway.service -p Environment -p WorkingDirectory -p FragmentPath
echo "$HOME" "$XDG_CONFIG_HOME" "$XDG_STATE_HOME"
tar czf ~/openclaw-premerge-$(date +%Y%m%d%H%M).tgz ~/.openclaw ~/.config/openclaw 2>/dev/null
  1. Приморозьте конкурирующие правки: остановите CI, которое переустановит CLI, и предупредите людей против параллельного редактирования JSON того же узла.
  2. Сохраните три текстовых дампа среды (root при необходимости, интерактив login, параметры unit) чтобы не восстанавливать команды память под давлением пейджера.
  3. Опирайтесь на пути из openclaw gateway status живого процесса, даже если они конфликтуют интуицией оператора DevOps.
  4. Перенесите блоки последовательно: каналы, расширения, затем токены, подтверждая JSON-парсером каждый кусок.
  5. После изменений выполните openclaw doctor, сохраните stdout/stderr, повторите openclaw gateway status немедленно для пары доказательств.
  6. На голых серверах проверьте loginctl show-user "$USER" -p Linger, если SSH может завершиться в любой момент.
  7. Зафиксируйте в тикете SemVer строки клиента и службы, хэши fragment rollback tar и временную метку UTC рестарта включая результат systemctl --user show -p MainPID для связи с дампами процессов.

Даже при успешном outcome короткая внутренная ретроспектива отделяет раннее «плавающее HOME» от остаточного расхождения версий помогает тренировать junior дежурных.

Используйте промежуточный файл JSON с отдельной валидацией перед финальной записью если IDE склонно зависнуть посредине большой вставки.

5. Полевой чеклист с порогами

Возьмите таблицу в поездке настройки шлюза; ужесточайте столбцы ожиданий когда данные конфиденциальны юридически.

Проверка Команда Ожидание
Совпадает ли HOME службы и аккаунта?systemctl --user showКаталог владельца совпадает с логической учёткой
Жив ли user manager без сеансов?loginctl show-userlinger позволяет шлюзу пережить выход SSH
Чист журнал ENOENT конфигурации?journalctl --user -uНет бесконечных циклов открытий
Не пуст ли snapshot?ls -lh ~/openclaw-premerge-*.tgzАртефакт >0 перед разрушительными действиями
Лимит принудительной установкиПлан простояНе больше одной force-попытки на хост в окне

Храните срезы журналов хотя бы семь календарных дней после успешного merge — они пригодятся при следующем апгрейде ядра или пакета.

Для tar до и после операции сохраняйте краткий unified-дифф ключевых JSON блоков чтобы при конфликтах можно было понять, какие поля добавлены вне автоматической миграции.

Для критической инфраструктуры оформите политики окон патчирования когда незапланированный перезапуск узла запрещён без синхронизации с сеткой шлюзовых операций чтобы не смешать причину дважды сломанного systemd.

Перед инцидентом синхронизируйте часы: дрейф NTP трактует «первым» ошибочным событием рестарт, который случился уже после апдейта конфигурации.

6. Где заканчивается Linux playbook

Сценарии split-brain охватывают meta.lastTouchedVersion и глубину gateway status если версии конфликтуют уже после дорисовки HOME; открывают их когда doctor не отпускает warning SemVer при корректных путях.

Тексты про Docker сосредоточены на переменной OPENCLAW_GATEWAY_TOKEN и WebSocket-связках внутри сетки контейнера — не портируйте drop-in синтаксис прямым копированием в compose.

Сторис macOS описывает перезапуск plist и Node prefix; хотя симптомы кажутся идентичными, нужны иные утилиты.

Не смешивайте в одном RCA категории: linger Linux, plist macOS и env файл оркестратора.

Для смешанной среды systemd и временных контейнеров иногда полезно назначить уникальный префикс каталогов состояния чтобы автоматический скрипт восстановления не перепутал артефакты разных платформ внутри общей NFS точки монтирования.

SELinux/AppArmor иногда режут читабельность файлов без явного сообщения приложению: изучите отказы AVC прежде чем обвинять JSON merge.

В гибридных кластерах, где шлюз сосуществует с брокером очередей, убедитесь, что повторное упорядочивание сообщений после merge не отправляет клиентские SDK на устаревшие endpoint-указатели, закэшированные в памяти воркера.

Для узлов без постоянного исходящего доступа заранее приложите локальное зеркало пакетов и эталонный лог успешного doctor другой машины к заявке на изменение, чтобы временные отказы канала связи не маскировались симптомами ухода HOME.

Раз в квартал сверяйте хэши unit фрагмента на узле эталонными значениями репозитория инфраструктуры read-only задачами чтобы случайное локальное редактирование обнаружилось без инцидента продакшн.

Включите в регламент дежурных короткий чек несоответствия UID владельца файла конфигурации и аккаунта unit потому что смены образа иногда сохраняют числовые идентификаторы с другим логическим именем давая впечатление корректного владения.

7. Ответы в лоб

В Можно стереть скелет и скопировать старое содержимое? О Остановите службу и снимите tar; живой процесс может испортить JSON при одновременной записи лучше сегментно сливать с валидацией.

В Две копии root и пользователь? О Коллизия портов гарантирована выберите одну persona пропишите User= отключите лишнее unit.

В Нужны ли недельные minor в прод без автоматизации? О Только если готовите снимки канарисов инакше дрейф перегружает поддержку человеческим ресурсом.

8. Вывод и роль управляемого удалённого Mac

Здоровый зелёный индикатор systemd не означает чтение нужного JSON — требуются согласование HOME/XDG с фактом unit затем упорядоченные RPC-доказательства вместо бесконечных рестартов.

Самохостится Linux сохраняет долг drop-ins и тщательных merge когда upstream ускоряется; документируйте SLA патчирования окружения Node для критической цепочки иначе задержки смешивают SemVer-дрейф с организационным долгом и портят учёт затрат инцидентов.

Если хотите траекторию Apple Silicon без еженощных столкновений user slice Linux, сравните операционные затраты с планами управляемого удалённого Mac от SFTPMAC: baseline шлюза, оформленные окна изменений и понятная доставка артефактов через SFTP и rsync. В мультитенантных контурах узел становится мостом между Linux CI и операторами при необходимости выделенного периметра ИИ без бесконечной ручной синхронизации JSON над плавающими домашними каталогами.