Node-RED — визуальный конструктор потоков данных, который часто называют «автоматизацией без программирования». Это не совсем правда: простые сценарии действительно собираются мышью, но для полезных вещей нужен хотя бы базовый JavaScript. Зато порог входа низкий, а результат виден сразу — от мигания лампы до отправки показаний датчика в базу.

Как устроен Node-RED

Редактор работает в браузере, а сам сервер — это приложение на Node.js. Поток состоит из узлов: входные получают событие, обрабатывающие преобразуют данные, выходные отправляют результат. Сообщение — обычный объект с полем payload и служебным полем _msgid. Узлы соединяются проводами, а состояние хранится в JSON-файле.

  • Inject — ручной запуск или таймер.
  • MQTT in и MQTT out — обмен с брокером.
  • HTTP request — вызов внешнего API.
  • Function — произвольный код на JavaScript.
  • Dashboard — веб-панель для телефона.

Палитра расширяется пакетами из npm. Ставьте только те, что нужны задаче: каждый модуль увеличивает поверхность атаки и время запуска.

Установка на сервер

Для домашнего стенда хватит Node.js из репозитория дистрибутива и глобального пакета. Отдельный пользователь нужен, чтобы сервис не работал от root.

sudo apt install -y nodejs npm
sudo npm install -g node-red
sudo useradd -r -m -s /bin/bash nodered
sudo -u nodered node-red admin hash-pw

Юнит systemd запускает редактор от имени nodered и перезапускает его после сбоя. Ограничение памяти полезно на малине или тонком мини-ПК: без него Node.js может занять всю доступную RAM. Сохраните юнит в /etc/systemd/system/nodered.service, перечитайте конфигурацию и включите службу.

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

[Service]
Type=simple
User=nodered
WorkingDirectory=/home/nodered
Environment=NODE_ENV=production
ExecStart=/usr/local/bin/node-red --max-old-space-size=256
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now nodered

Вариант в контейнере

Docker удобен, когда не хочется ставить Node.js в систему. Данные вынесите в том, иначе обновление образа сотрёт потоки. Порт публикуйте только на localhost и ставьте перед контейнером обратный прокси с HTTPS.

docker volume create node_red_data
docker run -d --name node-red \
  --restart unless-stopped \
  -p 127.0.0.1:1880:1880 \
  -v node_red_data:/data \
  nodered/node-red:latest

Первый полезный поток

Типовой сценарий: датчик публикует температуру в MQTT, Node-RED сравнивает значение с порогом и включает обогрев. Входной узел подписывается на топик, Function проверяет тип данных и формирует команду. Такой поток занимает пять узлов и не требует отдельного сервиса.

const t = msg.payload.temperature;
if (typeof t !== "number") {
    node.warn("в сообщении нет числа");
    return null;
}
msg.topic = "home/heating/setpoint";
msg.payload = t < 20 ? "ON" : "OFF";
return msg;

Ветку с плохими данными лучше не выбрасывать, а отправлять в отладочный выход: так видно, что устройство присылает на самом деле. Не полагайтесь на payload строкой — приводите типы явно, иначе сравнение «20» и 20 даст неожиданный результат.

Пароль и настройки

По умолчанию редактор открыт всем в локальной сети. Закройте его паролем и привяжите к loopback. Хеш создаётся командой node-red admin hash-pw, а настройки лежат в settings.js рядом с потоками.

module.exports = {
    uiPort: 1880,
    uiHost: "127.0.0.1",
    adminAuth: {
        type: "credentials",
        users: [{
            username: "admin",
            password: "$2b$08$замените_на_свой_хеш",
            permissions: "*"
        }]
    },
    logging: { console: { level: "info" } }
};

Если панель нужна снаружи, поставьте Nginx или Caddy с TLS и не открывайте 1880 напрямую. Для HTTP-узлов включите httpNodeAuth, чтобы не отдавать их без пароля.

Резервные копии и проекты

Все потоки и учётные данные лежат в каталоге .node-red. Копируйте его целиком перед обновлением палитры и после удачных изменений. Встроенный режим проектов хранит потоки в git, но он требует дисциплины: коммит нужно делать до эксперимента, а не после.

sudo tar czf /var/backups/node-red-$(date +%F).tar.gz -C /home/nodered .node-red
sudo systemctl stop nodered
sudo systemctl start nodered
node-red --safe

Флаг —safe запускает редактор без потоков. Это спасает, когда ошибочный узел уронил сервис и UI не открывается: вы получаете доступ к настройкам и можете удалить проблемную ветку.

Диагностика

Сначала смотрите журнал сервиса: ошибки узлов и падения JavaScript видны именно там. Затем проверяйте, слушает ли процесс порт и отвечает ли HTTP. Если браузер показывает пустую страницу, очистите кеш и проверьте версию Node.js — старые ветки несовместимы с новыми пакетами.

sudo systemctl status nodered
sudo journalctl -u nodered -f
ss -ltnp | grep 1880
curl -I http://127.0.0.1:1880/

Частая причина «зависаний» — синхронный цикл в Function или бесконечный retry у HTTP-узла. Ставьте таймауты и ограничивайте частоту запросов, чтобы поток не забивал очередь.

Чек-лист перед запуском

  • Пароль администратора и привязка к localhost.
  • Резервная копия каталога .node-red.
  • Права на каталог .node-red принадлежат сервисному пользователю.
  • Ограничение памяти и автоперезапуск.
  • Таймауты у внешних запросов.
  • Отдельные учётные данные для устройств.

Обновления и откат

Палитру и сам Node-RED обновляйте в два шага: сначала снимите копию каталога, затем остановите сервис и установите новую версию. Если редактор перестал открываться, верните архив на место и запустите процесс с флагом —safe. Не обновляйте все узлы сразу: несовместимость одного пакета способна сломать весь поток, а откат займёт больше времени, чем проверка.

Частые ошибки

Самая частая проблема — значение приходит строкой, а сравнение идёт с числом. Вторая — несколько узлов запускают один поток каждую секунду, и очередь сообщений растёт. Третья — файл credentials остался на старой машине после переноса потоков. Проверяйте типы, интервалы и наличие flows_cred.json, прежде чем искать неисправность в датчике или сети.

Итог

Node-RED хорош как клей между сервисами: он быстро соединяет MQTT, HTTP и локальные скрипты в понятную схему. Но «без программирования» не означает «без ответственности» — проверяйте типы, закрывайте редактор паролем и храните резервные копии. Начните с одного потока и одного датчика, а панель и сложные правила добавляйте после того, как базовый сценарий отработает сутки без сбоев.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте