« RPi-NodeRed » : différence entre les versions
(Page créée avec « NodeRed est un produit fabuleux. Installons le sur un Raspbery PI. Ici un Raspberry PI 4 de base (4Go) ») |
|||
| (12 versions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 1 : | Ligne 1 : | ||
NodeRed est un produit fabuleux. Installons le sur un Raspbery PI. | NodeRed est un produit fabuleux. Installons le sur un Raspbery PI. | ||
Ici un Raspberry PI 4 de base (4Go) | Ici un Raspberry PI 4 de base (4Go) | ||
== Installation == | |||
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 === | |||
Il y a des méthodes pour implémenter https directement dans node-red mais je préfère confier cette tâche à un "reverse proxy" placé entre internet et l'application. | |||
On va donc utiliser un serveur apache pour assurer le rôle de gestion des certificats et du déchiffrage/enchiffrage https tout en renvoyant le trafic vers node-red. | |||
La méthode classique, pour utiliser Apache en reverse proxy (RP) est d'en installer les modules :<syntaxhighlight lang="bash"> | |||
sudo a2enmod proxy | |||
sudo a2enmod proxy_http | |||
systemctl restart apache2 | |||
</syntaxhighlight>Puis de configurer un "virtual-host" afin de le rediriger vers notre instance node-red. | |||
Le virtual host https doit ressembler à celà:<syntaxhighlight lang="apache"> | |||
<IfModule mod_ssl.c> | |||
<VirtualHost *:443> | |||
# The ServerName directive sets the request scheme, hostname and port that | |||
# the server uses to identify itself. This is used when creating | |||
# redirection URLs. In the context of virtual hosts, the ServerName | |||
# specifies what hostname must appear in the request's Host: header to | |||
# match this virtual host. For the default virtual host (this file) this | |||
# value is not decisive as it is used as a last resort host regardless. | |||
# However, you must set it for any further virtual host explicitly. | |||
ServerName secure.modomaine.com | |||
ServerAlias www.secure.mondomaine.com | |||
ServerAdmin webmaster@mondomaine.com | |||
DocumentRoot /var/www/html/secured | |||
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn, | |||
# error, crit, alert, emerg. | |||
# It is also possible to configure the loglevel for particular | |||
# modules, e.g. | |||
#LogLevel info ssl:warn | |||
ErrorLog ${APACHE_LOG_DIR}/error-secure.log | |||
CustomLog ${APACHE_LOG_DIR}/access-secure.log combined | |||
# For most configuration files from conf-available/, which are | |||
# enabled or disabled at a global level, it is possible to | |||
# include a line for only one particular virtual host. For example the | |||
# following line enables the CGI configuration for this host only | |||
# after it has been globally disabled with "a2disconf". | |||
#Include conf-available/serve-cgi-bin.conf | |||
Include /etc/letsencrypt/options-ssl-apache.conf | |||
SSLCertificateFile /etc/letsencrypt/live/secure.pinon-hebert.fr/fullchain.pem | |||
SSLCertificateKeyFile /etc/letsencrypt/live/secure.pinon-hebert.fr/privkey.pem | |||
</VirtualHost> | |||
</IfModule> | |||
</syntaxhighlight>On ajoute les lignes :<syntaxhighlight lang="apache"> | |||
ProxyPass "/nodered" "http://XX.YY.ZZ.TT:1880/" | |||
ProxyPassReverse "/nodered" "http://XX.YY.ZZ.TT:1880/" | |||
</syntaxhighlight>avant le dernier "Include" et, normalement, ça devrait marcher si on entre l'URL https://secure.modomaine.com/node | |||
Et bien on a bien l'impression que ça marche mais.. non on a un e page blanche! | |||
SI on regarde le détail des requêtes on a bien un GET sur /node qui renvoie un 200 OK mais apres, tout ce qui est référencé dans cette page nous "claque en 404". | |||
Par exemple:<syntaxhighlight lang="text"> | |||
equest URL: https://secure.mondomaine.com/vendor/jquery/css/base/jquery-ui.min.css?v=38425ccf4997 | |||
Request Method: GET | |||
Status Code: 404 Not Found | |||
Remote Address: XX.YY.ZZ.TT:443 | |||
Referrer Policy: strict-origin-when-cross-origin | |||
</syntaxhighlight>Le reverse proxy à loupé une réécriture! il manque un /nodered/ entre le domaine et /vendor/... | |||
Comment corriger cela? | |||
Il faut "aider" le RP et réécrire certaines URL (les web sockets si j'ai tout bien compris)! | |||
Le fichier de conf du localhost sera alors:<syntaxhighlight lang="apacheconf"> | |||
<IfModule> | |||
<VirtualHost> | |||
......................... | |||
Define NodeRedURL "/nodered/" | |||
<Location ${NodeRedURL}> | |||
RewriteEngine on | |||
RewriteCond %{HTTP:Upgrade} ^WebSocket$ [NC] | |||
RewriteCond %{HTTP:Connection} Upgrade$ [NC] | |||
RewriteRule .*/(.*) "ws://localhost:1880/$1" [P,L] | |||
ProxyPreserveHost On | |||
ProxyPass http://localhost:1880/ | |||
ProxyPassReverse http://localhost:1880/ | |||
</Location> | |||
</VirtualHost> | |||
</IfModule> | |||
</syntaxhighlight>On relance le serveur apache et on teste<syntaxhighlight lang="bash"> | |||
sudo systemctl reload apache2.service | |||
</syntaxhighlight>Avec un navigateur on utilise l'URL <code><nowiki>https://secure.mondomaine.com/nodered/</nowiki></code> | |||
et tout marche très bien! | |||
[[Fichier:Attention.png|sans_cadre|37x37px]]Attention cependant à le pas oublier le "/" terminal. <code><nowiki>https://secure.mondomaine.com/nodered</nowiki></code> (sans le <code>/</code> à la fin) nous amènera irrémédiablement à un 404. | |||
== 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 5 décembre 2025 à 00:02
NodeRed est un produit fabuleux. Installons le sur un Raspbery PI. Ici un Raspberry PI 4 de base (4Go)
Installation
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
Il y a des méthodes pour implémenter https directement dans node-red mais je préfère confier cette tâche à un "reverse proxy" placé entre internet et l'application.
On va donc utiliser un serveur apache pour assurer le rôle de gestion des certificats et du déchiffrage/enchiffrage https tout en renvoyant le trafic vers node-red.
La méthode classique, pour utiliser Apache en reverse proxy (RP) est d'en installer les modules :
sudo a2enmod proxy
sudo a2enmod proxy_http
systemctl restart apache2
Puis de configurer un "virtual-host" afin de le rediriger vers notre instance node-red. Le virtual host https doit ressembler à celà:
<IfModule mod_ssl.c>
<VirtualHost *:443>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
ServerName secure.modomaine.com
ServerAlias www.secure.mondomaine.com
ServerAdmin webmaster@mondomaine.com
DocumentRoot /var/www/html/secured
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error-secure.log
CustomLog ${APACHE_LOG_DIR}/access-secure.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/secure.pinon-hebert.fr/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/secure.pinon-hebert.fr/privkey.pem
</VirtualHost>
</IfModule>
On ajoute les lignes :
ProxyPass "/nodered" "http://XX.YY.ZZ.TT:1880/"
ProxyPassReverse "/nodered" "http://XX.YY.ZZ.TT:1880/"
avant le dernier "Include" et, normalement, ça devrait marcher si on entre l'URL https://secure.modomaine.com/node
Et bien on a bien l'impression que ça marche mais.. non on a un e page blanche!
SI on regarde le détail des requêtes on a bien un GET sur /node qui renvoie un 200 OK mais apres, tout ce qui est référencé dans cette page nous "claque en 404".
Par exemple:
equest URL: https://secure.mondomaine.com/vendor/jquery/css/base/jquery-ui.min.css?v=38425ccf4997
Request Method: GET
Status Code: 404 Not Found
Remote Address: XX.YY.ZZ.TT:443
Referrer Policy: strict-origin-when-cross-origin
Le reverse proxy à loupé une réécriture! il manque un /nodered/ entre le domaine et /vendor/...
Comment corriger cela?
Il faut "aider" le RP et réécrire certaines URL (les web sockets si j'ai tout bien compris)!
Le fichier de conf du localhost sera alors:
<IfModule>
<VirtualHost>
.........................
Define NodeRedURL "/nodered/"
<Location ${NodeRedURL}>
RewriteEngine on
RewriteCond %{HTTP:Upgrade} ^WebSocket$ [NC]
RewriteCond %{HTTP:Connection} Upgrade$ [NC]
RewriteRule .*/(.*) "ws://localhost:1880/$1" [P,L]
ProxyPreserveHost On
ProxyPass http://localhost:1880/
ProxyPassReverse http://localhost:1880/
</Location>
</VirtualHost>
</IfModule>
On relance le serveur apache et on teste
sudo systemctl reload apache2.service
Avec un navigateur on utilise l'URL https://secure.mondomaine.com/nodered/
et tout marche très bien!
Attention cependant à le pas oublier le "/" terminal. https://secure.mondomaine.com/nodered (sans le / à la fin) nous amènera irrémédiablement à un 404.
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