linger · XDG_RUNTIME_DIR · проверка демона · слойная диагностика · регион API и egress
Платформенные инженеры, SRE и операторы self-hosted агентов в 2026 на Linux VPS чаще терпят неудачу не из-за опечатки, а из-за того, что после выхода из SSH останавливается user-level systemd, XDG_RUNTIME_DIR отсутствует вне интерактивных путей, логи gateway-канал-модель читаются одной кашей, а регион API в консоли не совпадает с реальным egress VPS. Здесь пять скрытых предпродакшен-налогов, трёхсторонняя таблица bare-metal systemd против systemd-in-container против Docker-only, шестишаговый воспроизводимый runbook с командами, чеклист и три цитируемых технических факта, плюс матрица решений. Установка и gateway: чеклист установки и doctor. Compose: продакшен-база Docker Compose. Заказ: страница заказа.
OpenClaw на Linux переносит долгоживущие процессы, каталоги сокетов, логи и семантику рестартов из личной привычки в аудируемые юниты. Пять пунктов ниже приходят вместе и сводятся к одному воротам: запишите linger и XDG_RUNTIME_DIR в лист приёмки раньше споров про Docker.
Привязка к сессии: без linger завершение интерактивного SSH может остановить user systemd manager; юниты тихо умирают ночью.
Нет runtime-каталога: cron, минимальные шеллы или неверный тип сервиса оставляют XDG_RUNTIME_DIR пустым, ошибки делятся между приложением и systemd.
Пропуск слоёв: слушание gateway, токены канала, маршрутизация модели и 429 upstream сливаются в «OpenClaw сломан».
Дрейф региона и egress: консоль указывает регион A, путь VPS возвращает подсказки региона B в заголовках, похоже на рваную аутентификацию, а не стабильный 403.
Смешанные границы: Docker плюс user-юниты на одном хосте расходятся в порядке рестартов и health, откаты неясны.
Сравнивая host user units и PID 1 в контейнере, используйте следующую таблицу как слайд ревью, а не лозунг.
Сначала решите, кто владеет рестартами, ротацией логов, семантикой linger и границей сокетов против портов хоста. Универсального победителя нет.
| Модель | Типично подходит | Главный выигрыш | Главная цена |
|---|---|---|---|
| Bare-metal systemd (user) | Один VPS, тесная работа с host firewall и loopback | Согласовано с дистрибутивом, юниты и journal в линию | Обязательны linger и границы login-сессий |
| systemd-in-container | Мультипроцессный надзор внутри образа | Похоже на классический Linux service host | Острее грани привилегий и образа, отладка с двух сторон |
| Только Docker | Compose или оркестратор уже держит health и restart | Версионируемые артефакты и откаты очевидны | Семантика user linger на хосте не переносится автоматически |
Воспроизводимая приёмка — не «на ноутбуке завелось», а «юнит переживает выход из SSH, причины в journal читаемы, подсказки региона ловятся дважды одними командами».
Порядок: оставить user manager живым без присмотра, проверить runtime dir, поставить юниты, триаж по слоям, затем снимки egress. Каждый шаг сохраняет вывод команд. Базовая линия gateway — в чеклисте установки и doctor.
Зафиксировать сервисного пользователя: аккаунт и основная группа, не смешивать с root. Артефакт: id и короткий фрагмент loginctl user-status.
Включить linger: для deploy-пользователя, чтобы user@ работал без логина. Артефакт: show-user печатает linger=yes.
Проверить XDG_RUNTIME_DIR: вывести из того же профиля, что и unit, ожидать форму /run/user/<uid>.
Установить и включить: положить unit в user scope, daemon-reload и enable --now, status для Active и главного pid.
Сэмплировать по слоям: сначала listen и parse конфига gateway, затем токены канала и webhook, затем квоты модели upstream и региональные заголовки. По двести последних строк journal на слой.
Согласованность egress: резолвить тот же hostname и сохранять TLS-видимые метаданные до и после изменений; один RTT не делать выводом о производительности.
loginctl show-user "${USER}" -p Linger
sudo loginctl enable-linger "${USER}"
systemctl --user show-environment | grep XDG_RUNTIME_DIR || true
echo "${XDG_RUNTIME_DIR}"
systemctl --user daemon-reload
systemctl --user status openclaw-gateway.service --no-pager
journalctl --user -u openclaw-gateway.service -n 200 --no-pager
Заметка: замените openclaw-gateway.service на реальное имя юнита. Другой бинарник gateway всё равно сверяйте с ExecStart в unit.
Назначьте владельца и ритм ревью. Проверки региона собирают только повторяемые TLS и метаданные ответа, без выдуманных рейтингов пропускной способности.
Ворота linger: тикеты должны содержать show-user Linger=yes текстом или скриншотом.
Граница юнитов: какие порты держат user units против публикуемых контейнером, синхронизировать с firewall-докой.
Удержание логов: персист journal или пересылка описаны, чтобы отладочные логи не забили диск и не имитировали зависание.
Слойный runbook: минимум три проверки «перейти дальше» на слой gateway, channel, model.
Снимки региона: вывод резолвера и заголовки до и после релизного окна для сравнения отката.
loginctl enable-linger влияет на границу жизни user systemd manager; это не автоматически равно выбору Docker./run/user/<uid>. Вне login отсутствие ведёт сокеты в ненадёжные пути.Внимание: один удачный curl после смены CDN не доказательство. Фиксированный hostname и повторяемые команды важнее удачного тайминга.
Без версионированных linger, имён юнитов, матрицы портов и снимков региона Linux-постоянство сделано наполовину. Вторая половина — общий язык ответственности с triage gateway.
| Состояние команды | Рекомендуемый дефолт | Сигнал приёмки | Частая ловушка |
|---|---|---|---|
| Соло, быстрые итерации | База Docker Compose | Health и restart ревьюятся в compose | Игнор mem_limit и ротации логов даёт ложные зависания |
| Мультитенант на одной машине | Граница контейнера плюс изолированные имена проектов | У каждого стека свой каталог данных | Смешение с user-юнитами даёт гонки рестартов |
| Плотная связка с хостом | User systemd плюс linger | journal непрерывен после SSH | XDG_RUNTIME_DIR не проверен на неинтерактивных путях |
Интерактивный bash, nohup без linger или ручные watchdog обычно оплачиваются на ревью изменений и аудите. Без снимков egress сложно объяснять сдвиги политики региона upstream. Выделенная облачная Mac-ёмкость с выбираемым регионом и читаемыми сетевыми ступенями упрощает стабильный egress и golden images рядом с iOS-сборками или десктоп-хендовером.
Частая ловушка: думать, что Docker убирает всю семантику systemd. Если user-юниты держат gateway вне Compose, linger и runtime dir остаются жёсткими воротами.
Персональные скрипты и неверсионированные экспорты редко переживают передачу дел и комплаенс с внешним SLA. Когда OpenClaw поставляется вместе с политикой региона upstream, TLS-отпечатком и фиксированной историей egress, bash-only пути часто теряют аудируемые тикеты изменений. Для команд, которые объединяют iOS-хендовер, CI-регрессию и автоматизированных агентов в одной приёмке и хотят заказы и региональные ступени вместо самодельной лотереи egress, облачная аренда Mac Mini VpsMesh обычно лучше подходит: выделенные узлы упрощают ACL и hostname, коллаборация остаётся близко к плотным циклам, язык эксплуатации может совпадать с runbook приватной сети для билд-нод. Смесь регионов на странице цен, границы подключения — по центру помощи.
После сессии systemd --user может остановиться и унести user-юниты OpenClaw. Проверьте linger до продакшена и сверьте подключение и постоянство с центром помощи, чтобы ночные остановки не приняли за апстрим-аварию.
Зафиксируйте hostname и версию инструментов, сохраните резолвинг и TLS-видимые метаданные для того же endpoint, сравните настройку региона в консоли с переменными окружения. Health на уровне Compose: статья продакшен-база Docker Compose.
Когда рестарт, ротация, лимиты и healthcheck полностью в Compose или оркестраторе и не нужны host user sockets плюс linger, Docker-only часто проще. Завершите слойную приёмку из третьего раздела перед смешением с user-юнитами.