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 и локальные скрипты в понятную схему. Но «без программирования» не означает «без ответственности» — проверяйте типы, закрывайте редактор паролем и храните резервные копии. Начните с одного потока и одного датчика, а панель и сложные правила добавляйте после того, как базовый сценарий отработает сутки без сбоев.