« Node-red dans le LAN » : différence entre les versions
(Page créée avec « On se propose ici de créer un serveur node-red dans notre infrastructure d'autohébergèrent basée sur des Raspberry PI ») |
mAucun résumé des modifications |
||
| (3 versions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 1 : | Ligne 1 : | ||
On se propose ici de créer un serveur node-red dans notre infrastructure d'autohébergèrent basée sur des [[Raspberry PI]] | On se propose ici de créer un serveur node-red dans notre [[Infrastructure basée PI|infrastructure d'autohébergèrent]] basée sur des [[Raspberry PI]] | ||
Cette page est basée sur une page plus complète qui décrit [[RPi-NodeRed|l'installation d'un serveur node red sur raspberry pi]] de façon autonome (nodered + apache avec module RP + let's encrypt). | |||
== Installation == | |||
Sur une toute nouvelle installation ou sur un Raspberry PI qui sert déjà a autre chose (même si ce n'est pas le concept ici de faire faire trop de choses à un nœud). | |||
On commence par un simple:<syntaxhighlight lang="bash"> | |||
sudo apt update | |||
sudo apt install nodejs | |||
</syntaxhighlight>Tout se passe bien. Mais ensuite on installe le gestionnaire de packages npm. Ca semple une formalité mais....<syntaxhighlight lang="bash"> | |||
sudo apt install npm | |||
</syntaxhighlight>à chez moi pris une éternité et installé une centaine de dépendances. | |||
Mais ça a terminé et j'ai pu terminé par :<syntaxhighlight lang="text"> | |||
sudo npm install -g --unsafe-perm node-red | |||
added 312 packages in 47s | |||
63 packages are looking for funding | |||
run `npm fund` for details | |||
</syntaxhighlight>Bon, il suffit alors de lancer nodered.<syntaxhighlight lang="text"> | |||
node-red | |||
11 Feb 22:38:13 - [info] | |||
Welcome to Node-RED | |||
=================== | |||
11 Feb 22:38:13 - [info] Node-RED version: v4.0.8 | |||
11 Feb 22:38:13 - [info] Node.js version: v18.19.0 | |||
11 Feb 22:38:13 - [info] Linux 6.6.51+rpt-rpi-v8 arm64 LE | |||
</syntaxhighlight>On peut ouvrir avec un navigateur: | |||
<nowiki>http://XX.YY.ZZ.TT:1880</nowiki> | |||
Si l'adresse IP du serveur est XX.YY.ZZ.PP (1880 est le port par défaut de NodeRed) | |||
[[Fichier:Nodered.png|sans_cadre|571x571px]] | |||
Bon il y a quelques "popups" de présentation. On peut les lires la première fois! | |||
== Premier test == | |||
On va créer un petit "Hello world" avec nodered! | |||
On "drague & droppe" trois éléments : | |||
[[Fichier:Nodered-exemple-001.png|sans_cadre|500x500px]] | |||
On les relie entre eux: | |||
[[Fichier:Nodered-exemple-002.png|sans_cadre|500x500px]] | |||
On édite l'élément "function 1".<syntaxhighlight lang="nodejsrepl"> | |||
msg.payload+=" Hello World!" | |||
return msg; | |||
</syntaxhighlight>Et on clique sur "Déployer" (le bouton rouge en haut à droite) | |||
[[Fichier:Deploy-nodered.png|sans_cadre|146x146px]] | |||
On obtiens la confirmation. | |||
On sélectionne, a droite, la fenêtre debug (la petite coccinelle). | |||
[[Fichier:Nodered-debug.png|sans_cadre]] | |||
Et on clique sur le carré bleu de l'élément "horodatage". | |||
[[Fichier:Nodereddebug.png|sans_cadre|832x832px]] | |||
A chaque clic on a une ligne dans les logs de debug... On a vu que dans "function 1" on ajoute "Hello World" au "timestamp" . | |||
== Sécurisation == | |||
=== Ajout d'un contrôle d'accès === | |||
Il serait tout de même préférable d'ajouter un "login password" non? | |||
Pour cela, on va tout d'abord encoder un mot de passe. Il y a pour cela une commande : <code>node-red admin hash-pw</code><syntaxhighlight lang="text"> | |||
node-red admin hash-pw | |||
Password: <ici on tape le mot de passe sans echo> | |||
$2y$08$AK6/jMQoUMpbnSxS3TTv3eIxiQfILfTjulpMvYxzomFi.ZZaz1IFu | |||
</syntaxhighlight>On arrête le serveur nodered (ctrl + C) | |||
Et on édite le fichier : <code>/home/admin/.node-red/settings.js</code> si <code>admin</code> est l'utilisateur que fait tourner le serveur. | |||
Dans la section "security" on décommente la partie<syntaxhighlight lang="json-object"> | |||
adminAuth: { | |||
type: "credentials", | |||
users: [{ | |||
username: "admin", | |||
password: "$2y$08$AK6/jMQoUMpbnSxS3TTv3eIxiQfILfTjulpMvYxzomFi.ZZaz1IFu", | |||
permissions: "*" | |||
}] | |||
}, | |||
</syntaxhighlight>On crée un utilisateur nommé "admin" et dont le mot de passe est celui donné à <code>node-red admin hash-pw</code>. | |||
Et on relance le serveur (cette fois ci en "détaché")<syntaxhighlight lang="bash"> | |||
nohup node-red & | |||
</syntaxhighlight>Et on relance la connexion avec le navigateur: | |||
[[Fichier:Nodered-login.png|sans_cadre|365x365px]] | |||
On rentre Admin + mot de passe et on se retrouve connecté. | |||
{| class="wikitable" | |||
|+ | |||
! colspan="2" |Remarque | |||
|- | |||
|[[Fichier:Attention.png|sans_cadre|81x81px]] | |||
|Il y a quelque chose à préciser sur le ficheir<code>settings.js de</code>Node-red. | |||
La première fois que l'on lance node-red en tant qu'utilisateur il vérifie si une version de <code>settings.js</code>existe dans le répertoire:<code>/home/$USER/.node-red/settings.js</code>Si c'est le ca il l'utilise. | |||
SI ce n'est pas le cas il va le créer en utilisant la "matrice" sur: | |||
<code>/usr/local/lib/node_modules/node-red/settings.js</code>Donc, pour une modification qui sera propagée chez tous les utilisateurs il faut modifier le fichier "matrice" sinon un simple vi de celui dans le répertoire privé de l'utilisateur sera suffisant. | |||
|} | |||
=== Sécuriser en https === | |||
Ici on ne sécurise pas la connexion sur le nœud local. C'est le [[Le routeur en tête réseau PI|frontal-routeur]] qui fera le travail de reverse proxy. | |||
== Ajouter un module == | |||
Sur raspberry pi il existe un module qui permet d'utiliser le GPIO (principalement) et accessoirement le clavier et la souris branché sur ses ports USB. | |||
On se déplace dans le repertoire node-red de l'utilisateur qui lance nodered et on installe le module<syntaxhighlight lang="bash"> | |||
/home/nodered/.node-red | |||
npm i node-red-node-pi-gpio | |||
</syntaxhighlight>SI on relance nodered et qu'on se connecte on voit apparaitre : | |||
[[Fichier:Nodered-gpio.png|sans_cadre|134x134px]] | |||
= Démarrage automatique de Node-RED via systemd = | |||
C'est bien beau tout ça mais si on lance nodered en ligne de commande on a bien les logs sur la console, c'est tres pratique pour comprendre ce qu'il se passe en cas de problème mais si on sort du terminal... ca coupe. On peut lancer ça dans un "screen" mais c'est pas tres propre. D'autant plus que si ca crashe... on a les trace du crash dans le screen mais ca reste planté. | |||
On va créer un service (un demon). | |||
=== Configuration === | |||
On crée le fichier de conf du démon:<syntaxhighlight lang="bash"> | |||
sudo vi /etc/systemd/system/nodered.service | |||
</syntaxhighlight>On le remplis avec :<syntaxhighlight lang="ini"> | |||
[Unit] | |||
Description=Node-RED service | |||
After=network.target | |||
[Service] | |||
User=nodered | |||
Group=nodered | |||
ExecStart=/usr/bin/env node-red | |||
WorkingDirectory=/home/nodered | |||
Restart=always | |||
RestartSec=10 | |||
Environment="NODE_OPTIONS=--max_old_space_size=256" | |||
[Install] | |||
WantedBy=multi-user.target | |||
</syntaxhighlight> | |||
=== Activation === | |||
<syntaxhighlight lang="bash"> | |||
sudo systemctl daemon-reexec | |||
sudo systemctl daemon-reload | |||
sudo systemctl enable nodered | |||
</syntaxhighlight> | |||
=== Arrêt / relance === | |||
<syntaxhighlight lang="bash"> | |||
sudo systemctl start nodered | |||
sudo systemctl stop nodered | |||
</syntaxhighlight> | |||
=== Status / logs === | |||
<syntaxhighlight lang="bash"> | |||
sudo systemctl start nodered | |||
</syntaxhighlight>Nous donne l'état et les logs.<syntaxhighlight lang="text"> | |||
● nodered.service - Node-RED service | |||
Loaded: loaded (/etc/systemd/system/nodered.service; enabled; preset: enabled) | |||
Active: active (running) since Sun 2025-10-19 15:02:50 CEST; 1min 22s ago | |||
Main PID: 359456 (node-red) | |||
Tasks: 11 (limit: 3922) | |||
CPU: 15.621s | |||
CGroup: /system.slice/nodered.service | |||
└─359456 node-red | |||
Oct 19 15:03:00 main-host env[359456]: 19 Oct 15:03:00 - [info] [mqtt-broker:local MQTT] Connected to broker: mqtt://127.0.0.1:1883 | |||
Oct 19 15:03:00 main-host env[359456]: 19 Oct 15:03:00 - [info] [udp out:broadcast] udp re-use socket: -> 255.255.255.255:38899 | |||
Oct 19 15:03:00 main-host env[359456]: 19 Oct 15:03:00 - [info] [udp out:sdb-g wiz_37a556] udp re-use socket: -> 192.168.0.xxx:38899 | |||
Oct 19 15:03:00 main-host env[359456]: 19 Oct 15:03:00 - [info] [udp out:bureau wiz_388140] udp re-use socket: -> 192.168.0.xxx:38899 | |||
Oct 19 15:03:01 main-host env[359456]: 19 Oct 15:03:01 - [info] [hue-bridge:Hue Bridge] Connected to bridge | |||
Oct 19 15:03:01 main-host env[359456]: 19 Oct 15:03:01 - [info] [mqtt-broker:HiveMQ] Connected to broker: mqtts:/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.s1.eu.hivemq.cloud:8883 | |||
Oct 19 15:03:01 main-host env[359456]: 19 Oct 15:03:01 - [info] [hue-bridge:Hue Bridge] Processing bridge resources… | |||
Oct 19 15:03:01 main-host env[359456]: 19 Oct 15:03:01 - [info] [hue-bridge:Hue Bridge] Initial emit of resource states… | |||
Oct 19 15:03:02 main-host env[359456]: 19 Oct 15:03:02 - [info] [hue-bridge:Hue Bridge] Keeping nodes up-to-date… | |||
Oct 19 15:03:02 main-host env[359456]: 19 Oct 15:03:02 - [info] [hue-bridge:Hue Bridge] Subscribing to bridge events… | |||
</syntaxhighlight>On peut même buter node-red en plein vol:<syntaxhighlight lang="bash"> | |||
sudo killall node-red # A la brutal | |||
</syntaxhighlight>On attends 10 à 15 sec et on regarde les logs<syntaxhighlight lang="text"> | |||
● nodered.service - Node-RED service | |||
Loaded: loaded (/etc/systemd/system/nodered.service; enabled; preset: enabled) | |||
Active: active (running) since Sun 2025-10-19 15:16:05 CEST; 1min 9s ago | |||
Main PID: 359745 (node-red) | |||
Tasks: 11 (limit: 3922) | |||
CPU: 15.317s | |||
CGroup: /system.slice/nodered.service | |||
└─359745 node-red | |||
Oct 19 15:16:15 main-host env[359745]: 19 Oct 15:16:15 - [info] [udp out:broadcast] udp re-use socket: -> 255.255.255.255:38899 | |||
Oct 19 15:16:15 main-host env[359745]: 19 Oct 15:16:15 - [info] [udp out:sdb-g wiz_37a556] udp re-use socket: -> 192.168.0.xxx:38899 | |||
Oct 19 15:16:15 main-host env[359745]: 19 Oct 15:16:15 - [info] [udp out:bureau wiz_388140] udp re-use socket: -> 192.168.0.xxx:38899 | |||
Oct 19 15:16:15 main-host env[359745]: 19 Oct 15:16:15 - [info] [mqtt-broker:local MQTT] Connected to broker: mqtt://127.0.0.1:1883 | |||
Oct 19 15:16:15 main-host env[359745]: 19 Oct 15:16:15 - [info] [hue-bridge:Hue Bridge] Connected to bridge | |||
Oct 19 15:16:15 main-host env[359745]: 19 Oct 15:16:15 - [info] [mqtt-broker:HiveMQ] Connected to broker: mqtts://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.s1.eu.hivemq.cloud:8883 | |||
Oct 19 15:16:16 main-host env[359745]: 19 Oct 15:16:16 - [info] [hue-bridge:Hue Bridge] Processing bridge resources… | |||
Oct 19 15:16:16 main-host env[359745]: 19 Oct 15:16:16 - [info] [hue-bridge:Hue Bridge] Initial emit of resource states… | |||
Oct 19 15:16:16 main-host env[359745]: 19 Oct 15:16:16 - [info] [hue-bridge:Hue Bridge] Keeping nodes up-to-date… | |||
Oct 19 15:16:16 main-host env[359745]: 19 Oct 15:16:16 - [info] [hue-bridge:Hue Bridge] Subscribing to bridge events… | |||
</syntaxhighlight>'''<big>Résultat: Node-RED démarre au boot, redémarre en cas de crash</big>''' | |||
Version actuelle datée du 7 décembre 2025 à 00:08
On se propose ici de créer un serveur node-red dans notre infrastructure d'autohébergèrent basée sur des Raspberry PI
Cette page est basée sur une page plus complète qui décrit l'installation d'un serveur node red sur raspberry pi de façon autonome (nodered + apache avec module RP + let's encrypt).
Installation
Sur une toute nouvelle installation ou sur un Raspberry PI qui sert déjà a autre chose (même si ce n'est pas le concept ici de faire faire trop de choses à un nœud).
On commence par un simple:
sudo apt update
sudo apt install nodejs
Tout se passe bien. Mais ensuite on installe le gestionnaire de packages npm. Ca semple une formalité mais....
sudo apt install npm
à chez moi pris une éternité et installé une centaine de dépendances. Mais ça a terminé et j'ai pu terminé par :
sudo npm install -g --unsafe-perm node-red
added 312 packages in 47s
63 packages are looking for funding
run `npm fund` for details
Bon, il suffit alors de lancer nodered.
node-red
11 Feb 22:38:13 - [info]
Welcome to Node-RED
===================
11 Feb 22:38:13 - [info] Node-RED version: v4.0.8
11 Feb 22:38:13 - [info] Node.js version: v18.19.0
11 Feb 22:38:13 - [info] Linux 6.6.51+rpt-rpi-v8 arm64 LE
On peut ouvrir avec un navigateur:
http://XX.YY.ZZ.TT:1880
Si l'adresse IP du serveur est XX.YY.ZZ.PP (1880 est le port par défaut de NodeRed)
Bon il y a quelques "popups" de présentation. On peut les lires la première fois!
Premier test
On va créer un petit "Hello world" avec nodered!
On "drague & droppe" trois éléments :
On les relie entre eux:
On édite l'élément "function 1".
msg.payload+=" Hello World!"
return msg;
Et on clique sur "Déployer" (le bouton rouge en haut à droite)
On obtiens la confirmation.
On sélectionne, a droite, la fenêtre debug (la petite coccinelle).
Et on clique sur le carré bleu de l'élément "horodatage".
A chaque clic on a une ligne dans les logs de debug... On a vu que dans "function 1" on ajoute "Hello World" au "timestamp" .
Sécurisation
Ajout d'un contrôle d'accès
Il serait tout de même préférable d'ajouter un "login password" non?
Pour cela, on va tout d'abord encoder un mot de passe. Il y a pour cela une commande : node-red admin hash-pw
node-red admin hash-pw
Password: <ici on tape le mot de passe sans echo>
$2y$08$AK6/jMQoUMpbnSxS3TTv3eIxiQfILfTjulpMvYxzomFi.ZZaz1IFu
On arrête le serveur nodered (ctrl + C)
Et on édite le fichier : /home/admin/.node-red/settings.js si admin est l'utilisateur que fait tourner le serveur.
Dans la section "security" on décommente la partie
adminAuth: {
type: "credentials",
users: [{
username: "admin",
password: "$2y$08$AK6/jMQoUMpbnSxS3TTv3eIxiQfILfTjulpMvYxzomFi.ZZaz1IFu",
permissions: "*"
}]
},
On crée un utilisateur nommé "admin" et dont le mot de passe est celui donné à node-red admin hash-pw.
Et on relance le serveur (cette fois ci en "détaché")
nohup node-red &
Et on relance la connexion avec le navigateur:
On rentre Admin + mot de passe et on se retrouve connecté.
Sécuriser en https
Ici on ne sécurise pas la connexion sur le nœud local. C'est le frontal-routeur qui fera le travail de reverse proxy.
Ajouter un module
Sur raspberry pi il existe un module qui permet d'utiliser le GPIO (principalement) et accessoirement le clavier et la souris branché sur ses ports USB.
On se déplace dans le repertoire node-red de l'utilisateur qui lance nodered et on installe le module
/home/nodered/.node-red
npm i node-red-node-pi-gpio
SI on relance nodered et qu'on se connecte on voit apparaitre :
Démarrage automatique de Node-RED via systemd
C'est bien beau tout ça mais si on lance nodered en ligne de commande on a bien les logs sur la console, c'est tres pratique pour comprendre ce qu'il se passe en cas de problème mais si on sort du terminal... ca coupe. On peut lancer ça dans un "screen" mais c'est pas tres propre. D'autant plus que si ca crashe... on a les trace du crash dans le screen mais ca reste planté.
On va créer un service (un demon).
Configuration
On crée le fichier de conf du démon:
sudo vi /etc/systemd/system/nodered.service
On le remplis avec :
[Unit]
Description=Node-RED service
After=network.target
[Service]
User=nodered
Group=nodered
ExecStart=/usr/bin/env node-red
WorkingDirectory=/home/nodered
Restart=always
RestartSec=10
Environment="NODE_OPTIONS=--max_old_space_size=256"
[Install]
WantedBy=multi-user.target
Activation
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable nodered
Arrêt / relance
sudo systemctl start nodered
sudo systemctl stop nodered
Status / logs
sudo systemctl start nodered
Nous donne l'état et les logs.
● nodered.service - Node-RED service
Loaded: loaded (/etc/systemd/system/nodered.service; enabled; preset: enabled)
Active: active (running) since Sun 2025-10-19 15:02:50 CEST; 1min 22s ago
Main PID: 359456 (node-red)
Tasks: 11 (limit: 3922)
CPU: 15.621s
CGroup: /system.slice/nodered.service
└─359456 node-red
Oct 19 15:03:00 main-host env[359456]: 19 Oct 15:03:00 - [info] [mqtt-broker:local MQTT] Connected to broker: mqtt://127.0.0.1:1883
Oct 19 15:03:00 main-host env[359456]: 19 Oct 15:03:00 - [info] [udp out:broadcast] udp re-use socket: -> 255.255.255.255:38899
Oct 19 15:03:00 main-host env[359456]: 19 Oct 15:03:00 - [info] [udp out:sdb-g wiz_37a556] udp re-use socket: -> 192.168.0.xxx:38899
Oct 19 15:03:00 main-host env[359456]: 19 Oct 15:03:00 - [info] [udp out:bureau wiz_388140] udp re-use socket: -> 192.168.0.xxx:38899
Oct 19 15:03:01 main-host env[359456]: 19 Oct 15:03:01 - [info] [hue-bridge:Hue Bridge] Connected to bridge
Oct 19 15:03:01 main-host env[359456]: 19 Oct 15:03:01 - [info] [mqtt-broker:HiveMQ] Connected to broker: mqtts:/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.s1.eu.hivemq.cloud:8883
Oct 19 15:03:01 main-host env[359456]: 19 Oct 15:03:01 - [info] [hue-bridge:Hue Bridge] Processing bridge resources…
Oct 19 15:03:01 main-host env[359456]: 19 Oct 15:03:01 - [info] [hue-bridge:Hue Bridge] Initial emit of resource states…
Oct 19 15:03:02 main-host env[359456]: 19 Oct 15:03:02 - [info] [hue-bridge:Hue Bridge] Keeping nodes up-to-date…
Oct 19 15:03:02 main-host env[359456]: 19 Oct 15:03:02 - [info] [hue-bridge:Hue Bridge] Subscribing to bridge events…
On peut même buter node-red en plein vol:
sudo killall node-red # A la brutal
On attends 10 à 15 sec et on regarde les logs
● nodered.service - Node-RED service
Loaded: loaded (/etc/systemd/system/nodered.service; enabled; preset: enabled)
Active: active (running) since Sun 2025-10-19 15:16:05 CEST; 1min 9s ago
Main PID: 359745 (node-red)
Tasks: 11 (limit: 3922)
CPU: 15.317s
CGroup: /system.slice/nodered.service
└─359745 node-red
Oct 19 15:16:15 main-host env[359745]: 19 Oct 15:16:15 - [info] [udp out:broadcast] udp re-use socket: -> 255.255.255.255:38899
Oct 19 15:16:15 main-host env[359745]: 19 Oct 15:16:15 - [info] [udp out:sdb-g wiz_37a556] udp re-use socket: -> 192.168.0.xxx:38899
Oct 19 15:16:15 main-host env[359745]: 19 Oct 15:16:15 - [info] [udp out:bureau wiz_388140] udp re-use socket: -> 192.168.0.xxx:38899
Oct 19 15:16:15 main-host env[359745]: 19 Oct 15:16:15 - [info] [mqtt-broker:local MQTT] Connected to broker: mqtt://127.0.0.1:1883
Oct 19 15:16:15 main-host env[359745]: 19 Oct 15:16:15 - [info] [hue-bridge:Hue Bridge] Connected to bridge
Oct 19 15:16:15 main-host env[359745]: 19 Oct 15:16:15 - [info] [mqtt-broker:HiveMQ] Connected to broker: mqtts://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.s1.eu.hivemq.cloud:8883
Oct 19 15:16:16 main-host env[359745]: 19 Oct 15:16:16 - [info] [hue-bridge:Hue Bridge] Processing bridge resources…
Oct 19 15:16:16 main-host env[359745]: 19 Oct 15:16:16 - [info] [hue-bridge:Hue Bridge] Initial emit of resource states…
Oct 19 15:16:16 main-host env[359745]: 19 Oct 15:16:16 - [info] [hue-bridge:Hue Bridge] Keeping nodes up-to-date…
Oct 19 15:16:16 main-host env[359745]: 19 Oct 15:16:16 - [info] [hue-bridge:Hue Bridge] Subscribing to bridge events…
Résultat: Node-RED démarre au boot, redémarre en cas de crash