« Node-red dans le LAN » : différence entre les versions

De knowledge
Aller à la navigation Aller à la recherche
mAucun résumé des modifications
mAucun résumé des modifications
 
(2 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 basée PI|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)

Nodered.png

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 :

Nodered-exemple-001.png

On les relie entre eux:

Nodered-exemple-002.png

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)

Deploy-nodered.png

On obtiens la confirmation.

On sélectionne, a droite, la fenêtre debug (la petite coccinelle).

Nodered-debug.png

Et on clique sur le carré bleu de l'élément "horodatage".

Nodereddebug.png

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:

Nodered-login.png

On rentre Admin + mot de passe et on se retrouve connecté.

Remarque
Attention.png Il y a quelque chose à préciser sur le ficheirsettings.js deNode-red.

La première fois que l'on lance node-red en tant qu'utilisateur il vérifie si une version de settings.jsexiste dans le répertoire:/home/$USER/.node-red/settings.jsSi c'est le ca il l'utilise.

SI ce n'est pas le cas il va le créer en utilisant la "matrice" sur: /usr/local/lib/node_modules/node-red/settings.jsDonc, 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 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 :

Nodered-gpio.png

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