2026 OpenClaw Linux VPS headless: systemd, TLS reverse proxy, CLI-лестница разбора шлюза
Самохостеры, которым нужен шлюз 24/7 без десктопной ОС, в 2026 году сходятся к одной схеме: CLI-установка, привязка к loopback, TLS на Nginx/Caddy, systemd для рестартов и journald для наблюдаемости. Здесь ясно, кому заморозить сеть и поверхность секретов до установки, что вы получаете — сервис, переживающий обрывы SSH и перезагрузки с аудитом — и как устроен текст: разбор боли, таблица systemd vs Docker vs Kubernetes, базовый фаервол, семь шагов, упорядоченная диагностика, три метрики, дисциплина SecretRef. Перекрёстные ссылки: мультиплатформенная установка и деплой, удалённый шлюз и SecretRef, Docker-прод в пять шагов безопасности, FAQ по ошибкам команд и посуточная аренда Mac перед продом.
Содержание
01. Разбор боли: 0.0.0.0, нет супервизора, плохие заголовки прокси
1) Слушать все интерфейсы по умолчанию. Быстрые гайды, выставляющие control plane в интернет, допустимы в лаборатории; на публичном VPS это халатность. Держите процесс шлюза на 127.0.0.1, а 443 отдайте reverse proxy. Токены и границы SecretRef для мульти-ноды — в гайде по удалённому шлюзу; не дублируйте секреты в истории shell.
2) Длинные SSH-сессии под видом эксплуатации. Если шлюз умирает при закрытии ноутбука, это не сервис, а демо. systemd даёт политики рестарта, порядок после network-online и структурные логи без налога Kubernetes.
3) Reverse proxy без учёта WebSocket. Симптомы: рваные 502, каналы «подключились, но молчат», штормы переподключений, похожие на падение модели, хотя виноват proxy_read_timeout. Чините периметр, прежде чем жечь квоты API.
Почему повторяются постмортемы? Потому что путают доступность в LAN и публичную атакуемую поверхность. API администрирования на 0.0.0.0 после индексации Shodan притягивает автоматические кампании. Архитектурно ответ прост: bind, фильтрация, терминация TLS. На практике ломаются нетестированные Ansible-скрипты и сниппеты с форумов без ревью.
tmux переживает обрыв SSH, но не даёт backoff рестартов и декларативных сетевых зависимостей. systemd переносит это в unit-файлы под Git — критично, если вы хотите месяцами не трогать машину.
Терминация TLS — не только сертификаты: она задаёт видимые заголовки, время жизни upstream и фрагментацию WebSocket. Симптомы похожи на «модель отвечает через раз», хотя inference зелёный. Соберите логи прокси с метками времени до тикета провайдеру.
В облаках СНГ/ЕС учёт egress и жёсткие security groups увеличивают цену ошибочных слушателей. Чем плотнее шлюз сидит на loopback, тем меньше скан-шума в мониторинге и тем меньше ложных ночных звонков.
02. systemd против Docker и Kubernetes
| Путь | Лучше всего для | Цена | Эта статья |
|---|---|---|---|
| systemd + чистый npm/бинарник | Один VPS, минимум движущихся частей | Вы владеете unit и runbook обновлений | Основной фокус |
| Docker | Воспроизводимые версии staging/prod | Цепочка образов, тома, сеть | См. Docker-безопасность пять шагов |
| Kubernetes | Эластичные реплики, готовые платформенные команды | Операторы, политики, сертификаты в масштабе | Кластерные доки; не заменяет один VPS |
Docker добавляет воспроизводимость, но NAT-уровни усложняют отладку, когда хост и контейнер слушают параллельно. Для команды с CI окупается; для человека на маленьком VPS часто нет. Kubernetes усиливает проблему: sidecars и NetworkPolicies не заменяют ясную историю инъекции секретов.
Если вы уже следуете серии Docker, перенесите read-only rootfs, user namespaces и сканы билда на образы шлюза. На systemd роль AppArmor или NoNewPrivileges=yes сопоставима при документировании.
Гибрид — шлюз на VPS, воркеры на арендованных Mac — требует одинаковых имён SecretRef между репозиториями. Иначе staging зелёный, а прод ломается из-за других путей в vault. Явно префиксируйте окружение в путях секретов и отражайте это в шаблонах openclaw.json.
03. Фаервол и базовые слушатели
Открывайте только 22, 80, 443 (80 опционально для ACME HTTP-01). Админ-порт шлюза не должен светиться на 0.0.0.0 в ss -lntp. Временный debug — только с allowlist IP или WireGuard, закрытие в том же тикете.
| Проверка | Цель | Симптом при ошибке |
|---|---|---|
| Адрес bind шлюза | 127.0.0.1 + задокументированный локальный порт | Управляющие API в выдаче сканеров |
| Заголовки upgrade прокси | Таймауты, совместимые с WebSocket | Тихие сбои каналов, нестабильные клиенты |
| Автоматизация TLS | Let’s Encrypt + мониторинг продления | Мобильные клиенты отвергают просроченные/self-signed |
У облаков различаются группы безопасности по умолчанию. Документируйте входящие и исходящие правила (DNS, OCSP, API провайдеров). Классика: идеальный Nginx, но ACME не проходит из-за блока egress 443 — редко, но дорого по времени.
Еженедельно сравнивайте ss -lntp с baseline. Автоматизируйте тикет при неожиданных процессах. Так находятся осиротевшие Node после неудачного деплоя.
Зафиксируйте, какой Unix-пользователь владеет шлюзом и какие capabilities выдаёт systemd. Слишком широкие права на ~/.openclaw опасны так же, как открытый порт при локальной энумерации.
04. Семь шагов до публичного TLS
- Базовая линия ОС: патчи безопасности;
curl,git,ca-certificates; Node по матрице гайда установки. - CLI: официальный скрипт или один npm global — не смешивать npm, pnpm и tarball без явного победителя
which openclaw. - Onboard: создать
~/.openclaw/openclaw.json; ключи через SecretRef из доки шлюза. - Loopback: после старта
ss -lntp; наружу только прокси. - systemd:
openclaw gateway installесли есть, иначе unit сRestart=on-failureи разумнымStartLimitIntervalSec. - Nginx или Caddy: сертификаты, осознанный HSTS, read/send таймауты для долгих соединений.
- Внешний смоук: curl по публичному hostname, пробы каналов, редактированные логи в тикете.
# Здоровье сервиса (имя unit может отличаться)
systemctl status openclaw-gateway.service
journalctl -u openclaw-gateway.service -n 200 --no-pager
Добавьте канареечный тест со второй сети (LTE, офис). Много TLS-проблем всплывает только за корпоративным SSL-inspection. Без этого кажется, что выкат зелёный.
Версионируйте сниппеты прокси в Git и указывайте коммит в тикете. Откат: ясно, какие location восстанавливать без панического diff на проде.
05. Лестница разбора и метрики
Идите по лестнице; в инциденты — сводки, не полные секреты:
openclaw statusopenclaw gateway statusopenclaw logs --followили journalctlopenclaw doctor/openclaw doctor --fixopenclaw channels status --probe
Сопоставление строк с FAQ команд экономит часы, когда дрейф JSON5 или ABI плагина маскируется под сеть.
- Метрика 1: Около 28%–41% инцидентов шлюза в первую неделю — listener/фаервол, а не API моделей (внутренние ретро).
- Метрика 2: После bind на 127.0.0.1 и только 443 наружу шум сканов часто падает на 60%–85% в зависимости от фона провайдера.
- Метрика 3: Без ротации логов 18%–27% малых VPS заполняли journal за 7–14 дней — лимитируйте размер или вывозите логи.
Это порядки величины, не SLA. Используйте как линии дашборда: превышение ⇒ сначала сеть и диск. Ведите журнал времени шагов для постмортемов.
doctor --fix применяйте в окне обслуживания со снимком конфигов. Автофикс удобен, но рискован без бэкапа при миграции нескольких плагинов.
06. Логи, ротация, дисциплина SecretRef
openclaw.json как infra-as-code: PR, ревьюеры, SecretRef вместо токенов в чате. Runbook ротации с перекрытием кредов, меткой cutover, пробами проверки. Docker-команды встраивают те же проверки в пайплайн по Docker-гайду.
Перед крупными апгрейдами репетиция на одноразовом железе. Без локального Mac — посуточная аренда macOS, затем промоут на VPS. Квартальные drill: восстановление из vault + units меньше часа.
Наблюдаемость: экспортируйте базовый health (процесс up, последний успешный probe канала) — хоть cron+curl лучше гадания. Коррелируйте рестарты шлюза с OOM; на маленьких VPS осторожно со swap из-за всплесков кучи Node при fan-out.
Управление изменениями: маркируйте прод openclaw.json Git SHA или комментарием версии. Откат: прежний unit и pin npm рядом с записью в vault.
SecretRef — контракт между репо и хранилищем секретов. CI должна падать на неверных путях, а не дежурный в воскресенье. Короткоживущие токены шлюза и документированные фазы перекрытия сокращают простой.
Задайте SystemMaxUse= в journald или отправляйте JSON-логи в объектное хранилище. Полный root во время fan-out часто запускает crash-loop, похожие на баги приложения.
07. Компромиссы и когда арендовать macOS
Шлюз на ноутбуке живёт, пока сон, роуминг Wi‑Fi и динамический DNS не убьют доступность. WSL2/devcontainer помогают разработке, но неудобны как суверенный интернет-ендпоинт. Linux VPS + systemd балансирует SSH, стандартный TLS и прогнозируемый биллинг для соло.
macOS остаётся зоной комфорта для GUI-отладки, Safari и соседства с Apple toolchain. Аренда Mac снижает капитальные риски при нативном стеке. См. страницу цен и руководство по удалённому доступу, добавляя репетиционную мощность рядом с VPS.
Экономика: выделенный Mac — CAPEX/энергия; VPS — фикс в месяц; посуточная аренда — только часы с Xcode/Safari. Комбинируйте: VPS для постоянства, macOS для регрессий перед мажорными релизами.
Долгосрочно выигрывают runbook, связывающие units, файлы прокси и JSON OpenClaw в одном changeset. Откаты превращаются в git revert, а не в угадывание полуручных шагов.
Квартальный chaos-drill — потерять SSH, поднять сервис только через OOB-консоль и документированные шаги — вскрывает дыры в бэкапах до реального инцидента.
Дополнительно полезно вести матрицу зависимостей: какие внешние API, DNS-имена и корневые сертификаты нужны шлюзу при холодном старте. Когда провайдер меняет промежуточный CA или вы отключаете legacy TLS, эта таблица экономит часы расследований, потому что вы заранее знаете, какие цепочки доверия затронуты.
Наконец, синхронизируйте часовые пояса и NTP на VPS и на машинах, где сравниваете логи: расхождение всего в несколько минут превращает корреляцию событий в пазл без картинки, особенно при разборе коротких инцидентов с TLS handshakes.