2026 OpenClaw Linux VPS
Продакшен без Docker Ubuntu 24.04 · systemd · Cloudflare Tunnel — без публичного порта на Gateway

OpenClaw уже стоит, но Gateway нельзя вешать на публичный интерфейс — на Ubuntu 24.04 VPS обычно упираются в выбор адреса прослушивания, предсказуемые перезапуски через systemd и схему Cloudflare Tunnel (или аналог), когда наружу уходит только loopback за контролируемым хостнеймом. Текст дополняет гайды по Docker в проде и мультиплатформенной установке трактом bare metal + systemd + туннель: базовая среда, параметры Gateway, пример unit-файла, ingress и разбор по симптомам, плюс типичная топология со стабильным удалённым Mac как исполнительным слоем.

01

Чем этот материал отличается от Docker-продакшена и мультиплатформенной установки

Мультиплатформенный гайд закрывает «как запустить». Docker-продакшен — для команд со стандартом на контейнеры и доставку через Compose/оркестратор. Здесь — bare-metal Ubuntu 24.04, минимум прослоек, systemd для восстановления после падений и автозапуска, Cloudflare Tunnel или свой reverse proxy, чтобы TLS и ACL жили вне процесса Node. Подходы не взаимоисключающие: сначала стабилизируете железо, потом при желании упаковываете в образ.

Шесть пунктов ниже — типичные ошибки модели системы из тикетов. Без них чеклисты дальше бесполезны.

  1. 01

    «curl сработал» = «безопасно в проде»: bind на 0.0.0.0 без фронт-прокси перекладывает auth и TLS на дефолты приложения; дрейф конфига открывает сканирование извне.

  2. 02

    Игнор связки Node и glibc: старые пребилды и неверный NODE_OPTIONS на 24.04 дают ложный сценарий «локально ок, под systemd не поднимается».

  3. 03

    Случайные права и /root: после апгрейда или logrotate процесс не читает конфиг — systemd уходит в плотный рестарт, журнал зашумлён.

  4. 04

    Health только по PID: без HTTP-ready и проверки доступности control plane модели балансировщик шлёт трафик, туннель отдаёт 502 — вы копаете не тот слой.

  5. 05

    Туннель жив, ingress не тот порт: расхождение cloudflared и реального listen-сокета Gateway — DNS есть, loopback не совпадает.

  6. 06

    Linux-шлюз как универсальный воркер: Xcode, симуляторы и специфика Apple Silicon на VPS выглядят как «OpenClaw падает», хотя проблема в топологии планировщика задач.

Если схема «loopback + туннель» вам подходит, переходите к базовой среде и командам ниже.

02

Сравнение схем: публичный bind, Docker, systemd + Tunnel

Смотрите не только на скорость установки: в одну строку — поверхность атаки, наблюдаемость, откат. Таблица для ревью; порты и теги образов подставьте свои.

ИзмерениеGateway на публичном интерфейсеDocker / Composesystemd + loopback + Tunnel
ЭкспозицияМаксимум; TLS и FW в приложенииЗависит от publish и сетевого режима; host-сеть опаснаПроцесс только 127.0.0.1; снаружи туннель/edge
СертификатыСвой ACME или ручная ротацияЧасто Traefik / Caddy / облачный LBTLS на edge Cloudflare (или аналог)
Рестарт и отладкаВнешние супервизоры или рукамиПолитики restart и логи проектировать отдельноsystemd + journal читаемы последовательно
Кому подходитМинимальный PoC, не продКоманды с контейнерной дисциплинойОдин VPS, скриптовая воспроизводимость

Вопрос не «доступен ли хост», а «кто и по какому пути авторизован». Сужение listen до loopback переносит политику на edge, где TLS и ACL управляются предсказуемее.

03

Среда: Node, права каталогов, базовый фаервол

На Ubuntu 24.04 LTS ориентируйтесь на текущую LTS-мажорную ветку Node.js (в начале 2026 чаще 22.x; ориентир — nodejs.org). nvm, fnm или NodeSource; в проде фиксируйте minor и фиксируйте окна обновлений. Пакетный node из дистрибутива обычно слишком старый как единственный источник.

Базовый фаервол: SSH только по ключу, ufw default deny incoming, не открывайте публично порт сервиса Gateway — снаружи только туннель. Для отладки — временный allowlist или jump host, срок отзыва в changelog.

  1. 01

    Отдельный пользователь и каталоги: например пользователь openclaw, состояние в /var/lib/openclaw, конфиг /etc/openclaw (640/750), не смешивать с root.

  2. 02

    Зафиксированный Node и lockfile: храните package-lock.json или pnpm-lock.yaml; в проде npm ci или эквивалент — без случайного major.

  3. 03

    glibc и нативные модули: чистая установка и смоук на целевой машине, чтобы исключить ошибки dlopen.

  4. 04

    Часовой пояс: timedatectl в UTC или командный стандарт — корреляция с логами туннеля и edge.

  5. 05

    ufw: ufw allow OpenSSH, затем ufw enable; сервисные порты закрыты; ss -tlnp — снаружи Gateway не слушает.

  6. 06

    Health-endpoint: до включения туннеля зафиксируйте в runbook curl -fsS http://127.0.0.1:PORT/health (путь по конфигу), согласуйте с ExecStartPost или внешним пробником.

info

Заметка: CLI и имена конфигов OpenClaw — по upstream-документации; пути и порты в unit и YAML — заглушки, подставьте свои перед enable.

04

Конфигурация Gateway, systemd и маршрутизация Cloudflare Tunnel

Listen: в проде — 127.0.0.1:PORT; при поддержке можно добавить Unix socket. Секреты: через environment file, не в world-readable конфиге; ротация: новый токен, rolling restart, удалить старый. Health: минимум PID + HTTP-ready или доступность control plane модели — иначе туннель лишь скажет «нет ответа», а не «не тот слой стека».

Пример unit systemd (замените пути и аргументы)

/etc/systemd/system/openclaw-gateway.service
[Unit]
Description=OpenClaw Gateway (loopback)
After=network-online.target
Wants=network-online.target

[Service]
User=openclaw
Group=openclaw
WorkingDirectory=/var/lib/openclaw
EnvironmentFile=-/etc/openclaw/gateway.env
# ExecStart замените на фактическую команду из документации
ExecStart=/usr/bin/node /opt/openclaw/gateway.mjs --config /etc/openclaw/gateway.yaml
Restart=on-failure
RestartSec=5
LimitNOFILE=1048576

# Логи: предпочтительно journal; для файлов — logrotate и права
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Порядок: systemctl daemon-reloadsystemctl enable --now openclaw-gatewaysystemctl status до стабильности → локальный curl health → затем cloudflared.

cloudflared: только loopback upstream (пример)

фрагмент config.yml
tunnel: <YOUR_TUNNEL_ID>
credentials-file: /etc/cloudflared/<YOUR_TUNNEL_ID>.json

ingress:
  - hostname: claw.example.com
    service: http://127.0.0.1:8787
  - service: http_status:404
warning

Внимание: JSON с учётными данными туннеля — только root или выделенный пользователь; не вшивать в слои образа и публичные логи CI. С Nginx/Caddy вместо Cloudflare сохраняйте ту же схему: TLS на edge, upstream только loopback.

Порядок просмотра логов:journalctl -u openclaw-gateway -b --no-pager (циклы рестартов, env); ② каталог логов приложения; ③ journalctl -u cloudflared; ④ curl -v локально и снаружи — процесс vs маршрутизация.

05

Симптомы и топология с удалённым Mac

Порты: при EADDRINUSEss -tlnp, исключить зомби; сменили порт — обновить ingress и внутренние пробы. Права: EACCES — owner/group конфигов и ключей; User в systemd должен читать. Туннель: 502 снаружи, curl на loopback ок — ingress, связь с Cloudflare, DNS-зона. Модели: таймауты/401 — baseline API вендора с сервера (секреты не в history), блокировка egress-IP или протухший токен.

Типичное разделение: Linux VPS — публичный Gateway, очередь, лёгкая оркестрация планировщика; удалённый Mac на Apple Silicon — сборки Xcode, симуляторы, цепочка инструментов только под macOS (включая вызовы Metal и нативного компилятора без эмуляции слоя Linux). Тяжёлые задачи уходят на Mac — политика «без публичного bind на Gateway» сохраняется, планировщик не тащит на VPS то, что требует фреймворков macOS. Связка через SSH, очередь или приватный туннель. Изолируйте отказ: падение шлюза не должно уничтожать кэш сборок на Mac; окно обслуживания Mac не должно глушить весь API-вход.

  • Listen: в проде закрепить 127.0.0.1 и один порт — меньше риска случайного bind на все интерфейсы в dual-stack.
  • systemd: Restart=on-failure и RestartSec=5 для читаемых логов; при необходимости StartLimitIntervalSec.
  • Upstream туннеля: явно http://127.0.0.1:PORT, не localhost, чтобы избежать ::1 при IPv4-only bind.

Один VPS Linux + туннель хорош для control plane и агрегации API, но iOS CI/CD, симуляторы, Metal и цепочка Xcode упираются в архитектурный потолок: либо компромиссы headless-remote, либо постоянные затраты на образы. Вынести тяжёлую работу на выделенный удалённый Mac с предсказуемыми окнами обслуживания, оставив на шлюзе привычные systemd и туннель, сужает зону поражения. Для долгоживущих агентов и пайплайнов аренда Mac mini в облаке NodeMini чаще оптимальнее: control plane остаётся на вашем VPS, исполнение — на железе и сроках аренды, выровненных под экосистему Apple.

FAQ

Часто задаваемые вопросы

В продакшене настоятельно рекомендуется только loopback; TLS и политику доступа отдаём туннелю или reverse proxy. Публичный порт — allowlist, лимиты и аудит; обычно сложнее туннеля. Другие материалы — в колонке OpenClaw.

На сервере curl к loopback; затем ingress и учётные данные туннеля; потом upstream и DNS. Перед заказом исполнительных узлов см. цены аренды по сроку и региону.

SSH, VNC и типичные сбои — в справочном центре; список постов — на главной блога.