MAATRIX / Блог / Как установить и настроить Node-RED на VPS

Как установить и настроить Node-RED на VPS

MAATRIX

Node-RED на Raspberry Pi дома — привычная история, но у неё есть слабое место: если дом обесточен, интернет упал или SD-карта посыпалась, все автоматизации встают вместе с домашним сервером. Перенос Node-RED на VPS снимает эту зависимость — поток работает 24/7 на отдельной машине с внешним IP, доступен по HTTPS из любой точки и не боится перебоев дома. Ниже — установка с нуля, автозапуск, безопасный доступ и связка с Home Assistant.

Обсудить статью, задать вопрос или начать новую тему

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

Перейти в сообщество →

Что такое Node-RED и зачем ему отдельный сервер

Node-RED — редактор потоков (flow-based programming) на Node.js: вы собираете логику из нод-блоков и соединяете их стрелками вместо написания кода. Изначально его делали в IBM для IoT, сейчас это универсальный инструмент для автоматизаций, интеграций между API и обработки данных — в связке с Home Assistant его чаще всего используют как «продвинутый движок сценариев», когда встроенных автоматизаций HA не хватает по логике (условия, задержки, циклы, кастомные HTTP-запросы).

Зачем именно VPS, а не Raspberry Pi или мини-ПК дома:

  • Доступность. Сервер не зависит от домашнего электричества и провайдера — если автоматизация дергает внешние API (погода, уведомления, вебхуки), она продолжает работать даже когда дома темно.
  • Ресурсы. Node-RED сам по себе легкий, но с десятками активных потоков и большим количеством нод (Telegram, MQTT, HTTP-запросы, парсинг) счётчик оперативной памяти и CPU растёт — на VPS проще выделить нужный объём, чем менять плату дома.
  • Публичный IP и нормальный HTTPS. Для вебхуков (Telegram-бот, GitHub, платёжные системы) нужен стабильный внешний адрес с валидным сертификатом — прокидывать порты через домашний роутер для этого неудобно и небезопасно.
  • Изоляция. Панель Node-RED крутится отдельно от Home Assistant и от «боевых» сервисов — если что-то в потоке зависнет, оно не тянет за собой остальную инфраструктуру.

Минимально хватит 1 vCPU и 1 ГБ RAM — редактор потоков не прожорлив. Если планируете держать локальную MQTT-брокер и обрабатывать большие объёмы событий, возьмите 2 ГБ с запасом.

Установка Node.js и Node-RED

Node-RED требует Node.js — ставим его из репозитория NodeSource, а не из стандартных пакетов дистрибутива: там версии обычно старые и часто ломают часть нод из палитры.

Обновите систему и поставьте зависимости:

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl build-essential git

Подключите репозиторий Node.js 20 LTS и установите его:

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
node -v
npm -v

Создайте отдельного системного пользователя для Node-RED — запускать редактор потоков от root не стоит, он потенциально исполняет произвольные JS-сниппеты внутри function-нод:

sudo useradd -m -s /bin/bash nodered
sudo su - nodered

Установите Node-RED глобально официальным скриптом (он же аккуратно обновляет существующую установку, если понадобится):

bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

Скрипт спросит про обновление Node.js (можно отказаться, раз он уже свежий) и предложит поставить набор Pi-специфичных нод — на VPS без GPIO они не нужны, отвечайте «нет». После установки бинарник появится в ~/.nodered (рабочая директория с потоками) и node-red станет доступен в PATH пользователя nodered.

Проверьте вручную, что редактор поднимается:

node-red

По умолчанию Node-RED слушает 0.0.0.0:1880. Откройте http://IP-сервера:1880 в браузере — должен появиться редактор потоков. Остановите процесс (Ctrl+C) — дальше запускать вручную не понадобится, для этого настроим systemd.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Автозапуск через systemd

Ручной запуск не переживёт перезагрузку сервера, поэтому оформляем сервис. Выйдите обратно на пользователя с sudo-правами:

exit
sudo nano /etc/systemd/system/nodered.service

Содержимое юнита:

[Unit]
Description=Node-RED
After=network.target

[Service]
Type=simple
User=nodered
Group=nodered
WorkingDirectory=/home/nodered
Environment="NODE_OPTIONS=--max-old-space-size=256"
ExecStart=/usr/bin/node-red --max-old-space-size=256
Restart=on-failure
RestartSec=10
SyslogIdentifier=node-red

[Install]
WantedBy=multi-user.target

Параметр --max-old-space-size ограничивает память под движок V8 — на VPS с 1 ГБ RAM это разумная страховка от того, что редактор со временем разрастётся и утащит своп в ноль. На сервере с 2+ ГБ можно поднять значение или убрать вовсе.

Включите и запустите сервис:

sudo systemctl daemon-reload
sudo systemctl enable --now nodered
sudo systemctl status nodered

Логи в реальном времени — если поток падает или нода не грузится, вся диагностика здесь:

journalctl -u nodered -f

Nginx как reverse proxy и HTTPS

Открывать порт 1880 наружу напрямую — плохая идея: и трафик идёт по HTTP, и сам порт становится маяком для сканеров. Правильнее завести редактор за Nginx с валидным сертификатом на своём поддомене, например node-red.ваш-домен.ru. Подробный разбор reverse proxy для Node.js-приложений есть в статье про настройку Nginx как reverse proxy на VPS — здесь конфиг с поправкой на специфику Node-RED (WebSocket для live-обновления редактора).

Установите Nginx, если его ещё нет:

sudo apt install -y nginx

Конфиг сайта:

server {
    listen 80;
    server_name node-red.example.com;

    location / {
        proxy_pass http://127.0.0.1:1880;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 3600s;
    }
}

Заголовки Upgrade/Connection "upgrade" обязательны — без них редактор в браузере будет работать урывками: WebSocket держит соединение с рантаймом Node-RED для live-обновления состояния нод и деплоя потоков без перезагрузки страницы. proxy_read_timeout увеличен, потому что соединение долгоживущее.

Проверьте конфиг и включите сайт:

sudo ln -s /etc/nginx/sites-available/node-red /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Выпустите сертификат через certbot (сравнение certbot и acme.sh — в отдельной статье про выбор инструмента для сертификатов, если хочется автоматизации без cron-костылей):

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d node-red.example.com

Certbot сам допишет блок listen 443 ssl и настроит редирект с 80 порта. После этого закройте прямой доступ к 1880 снаружи — правила firewall разобраны в статье про настройку UFW на VPS:

sudo ufw allow 'Nginx Full'
sudo ufw deny 1880

Порт 1880 остаётся открытым только на loopback, куда его и проксирует Nginx — снаружи он больше не виден.

Авторизация и безопасность редактора

По умолчанию свежая установка Node-RED открыта без пароля — с публичным IP это критично, потому что через редактор потоков можно исполнить произвольный JS прямо на сервере. Первым делом настройте adminAuth.

Сгенерируйте хеш пароля встроенной утилитой:

sudo su - nodered
node-red admin hash-pw

Утилита спросит пароль и выведет bcrypt-хеш вида $2b$08$... — скопируйте его.

Откройте файл настроек:

nano /home/nodered/.node-red/settings.js

Найдите закомментированный блок adminAuth и раскомментируйте/добавьте:

adminAuth: {
    type: "credentials",
    users: [{
        username: "admin",
        password: "$2b$08$вставьте-сюда-свой-хеш",
        permissions: "*"
    }]
},

Там же полезно ограничить доступ к самим HTTP-эндпоинтам runtime (не только к редактору), выставив httpNodeAuth, если flow-эндпоинты (/api/..., вебхуки) не должны быть публичными без токена. Для вебхуков, наоборот, часто нужен открытый доступ — тогда защищайте их на уровне ноды (проверка секретного заголовка внутри потока) вместо базовой авторизации.

Перезапустите сервис, чтобы настройки применились:

exit
sudo systemctl restart nodered

Дополнительно: держите регулярный бэкап ~/.node-red — там лежат flows.json, flows_cred.json (зашифрованные креды нод) и settings.js (общие принципы бэкапа для сервисов на VPS — в статье про бэкап Docker volume, если решите завернуть Node-RED в контейнер вместо systemd-сервиса). И раз в несколько месяцев прогоняйте установочный скрипт повторно — он обновляет Node-RED и палитру нод до версий с закрытыми уязвимостями.

Интеграция с Home Assistant и MQTT

Самый частый сценарий использования Node-RED — расширение автоматизаций Home Assistant. Если HA у вас развёрнут на том же или соседнем VPS, обзор установки есть в статье про установку Home Assistant на VPS.

Есть два пути связать Node-RED с HA. Первый — официальный аддон Node-RED для Home Assistant: если HA работает как Home Assistant OS/Supervised, аддон разворачивает Node-RED внутри той же экосистемы с автоматической авторизацией через HA — минимум настройки, но вы теряете независимость Node-RED от доступности HA-хоста, ради которой изначально переезжали на отдельный VPS. Второй — отдельный Node-RED плюс пакет node-red-contrib-home-assistant-websocket, вариант из этой статьи: Node-RED работает автономно на своём VPS и подключается к HA по WebSocket через long-lived access token.

Установка пакета интеграции:

sudo su - nodered
cd ~/.node-red
npm install node-red-contrib-home-assistant-websocket
exit
sudo systemctl restart nodered

После перезапуска в палитре нод слева появится раздел Home Assistant. Добавьте на любую ноду сервер-конфигурацию: URL вашего HA (http://ha.example.com:8123 или внутренний адрес, если оба сервера в одной приватной сети) и Long-Lived Access Token, который создаётся в профиле пользователя HA (Настройки → Профиль пользователя → Долгосрочные токены доступа). После этого доступны ноды events: state, call service, current state и другие — можно строить сложную логику (условия, задержки, ветвления, обращения к сторонним API) вокруг сущностей HA, которую неудобно или невозможно выразить встроенным движком автоматизаций.

Для сценариев с датчиками, публикующими данные напрямую по MQTT (без прохождения через HA), в палитре есть штатные ноды mqtt in/mqtt out — они подключаются к любому брокеру (Mosquitto и подобные) по адресу и порту, логика обработки собирается тем же визуальным способом.

Если оба сервера — и Node-RED, и Home Assistant — стоят на разных VPS, свяжите их через приватную сеть провайдера или WireGuard-туннель, чтобы WebSocket-соединение и токен не гуляли по публичному интернету лишний раз, даже с учётом HTTPS.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Node-RED упал после перезагрузки сервера — что проверить?

Убедитесь, что сервис включён (systemctl is-enabled nodered), посмотрите journalctl -u nodered -n 50 — чаще всего причина в нехватке памяти (--max-old-space-size выставлен слишком низко) или в ноде из палитры, которая не пережила обновление Node.js.

Сколько памяти реально нужно на боевом использовании?

Для десятка-двух простых потоков без тяжёлых нод (image processing, большие HTTP-ответы) хватает 512 МБ–1 ГБ. С MQTT-брокером на том же сервере и десятками активных потоков комфортнее на 2 ГБ — точные цифры зависят от количества нод и объёма сообщений, ориентируйтесь и проверяйте по факту через htop.

Можно ли поставить Node-RED в Docker вместо systemd?

Да, есть официальный образ nodered/node-red — вариант с Docker Compose проще для бэкапов через volume-снапшоты, но добавляет слой сети, который нужно правильно связать с Nginx и (если он тоже в контейнере) с Home Assistant.

Как перенести существующие потоки с домашнего Raspberry Pi на VPS?

Скопируйте файлы flows.json и flows_cred.json из ~/.node-red на старом устройстве в ту же директорию на VPS, затем перезапустите сервис. Если менялся credentialSecret в settings.js, креды в flows_cred.json не расшифруются — переносите оба файла настроек синхронно или пересоздайте креды нод вручную после переноса.

Нужен ли отдельный домен именно под Node-RED?

Не обязательно — можно повесить его на location /node-red/ существующего домена вместо отдельного поддомена, но тогда в settings.js нужно явно выставить httpAdminRoot и httpNodeRoot с тем же префиксом, иначе статика редактора будет запрашиваться по неверным путям.

Обсудить статью, задать вопрос или начать новую тему

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

Перейти в сообщество →