Installer Node-RED sur Linux Debian
Comment connecter votre « Internet of Things » (IoT) avec Node-RED sous Linux Debian
Introduction
Node-RED est un panneau de commandes pour l’ « Internet of Things »,
un outil visuel qui vous aide à connecter vos applications, sites web, et matériels ensembles pour faire des choses nouvelles et utiles.
Le plus souvent comparé à IFTTT ou au récent Yahoo Pipes, Node-RED possède une interface beaucoup plus puissante et flexible, et une large communauté Open Source qui créée des nodes pour interagir avec une grande variété d’apps et de services.
Dans ce tutoriel, nous installerons Node.js et Node-RED, optiendrons un certificat SSL de Let’s Encrypt, et utiliserons Nginx pour gérer des connexions sécurisées pour Node-RED.
Prérequis
Pour suivre ce tutoriel, vous aurez besoin de:
Un serveur Linux Debian avec un utilisateur non-root et une configuration firewall de base suivant ce Ubuntu 16.04 sever setup tutorial. Pour cette installation, nous utiliserons un utilisateur nommé « nodered », mais bien sûr vous pouvez choisir le nom qui vous fait plaisir à la place.
- Le serveur Web Nginx installé, avec le firewall paramétré pour autoriser le trafic sur les ports 80 et 443 (Nginx Full), comme expliqué dans How To Install Nginx on Ubuntu 16.04
- Un nom de domaine pointant sur votre serveur. . Ce tutoriel utilisera
node-red.activpart.com
. - Let’s Encrypt instéllé, et un certificat généré pour le domaine configuré ci-dessus. Le tutoriel How To Secure Nginx with Let’s Encrypt on Ubuntu 16.04 vous guidera dans les étapes nécessaires. Vous pouvez ignorer les étapes concernant la configuration Nginx (steps 3–5), car elles sont couvertes ici. Assurez-vous simplement que vous avez un certificat valide, et paramétrez un job cron pour gérer les renouvellements automatiques.
Etape 1 – Installation de Node.js et npm
Lancez la commande:
sudo apt-get install nodejs-legacy
Cette commande installe Node.js v4.2.x LTS (long term support), ce qui signifie que la Node.js Foundation va continuer à supporter cette version pour 30 mois à partir de sa dat de sortie du 12 octobre 2015.
Note: Il est important d’installer la version -legacy
du package car le script de démarrage de Node-RED attend que votre binaire Node.js binary soit noté node
, mais le package standard utilise nodejs
à la place. Ceci est du à un conflit de nom avec un package pré-existant.
Vérifiez que l’installation est réussie en vérifiant la version. Node.js vous affichera sa version. Exemple:
nodered@srv1:~$ node -v v0.10.29 nodered@srv1:~$
Node Package Manager (npm
) vous aide à installer les packages logiciels Node.js, et nous allons l’utiliser pour installer Node-RED. Installez npm
avec apt-get:
sudo apt-get install npm
Pour vérifier que l’installation est réussie, demandez à npm
d’afficher sa version:
nodered@srv1:~$ npm -v 1.4.21 nodered@srv1:~$
Si la version s’affiche sans erreur, nous pouvons continuer vers l’étape suivante, où nous utiliserons npm
pour installer Node-RED proprement dit.
Etape 2 – Installer Node-RED
Utilisez npm
pour installer node-red
et un utilitaire d’assistance nommé node-red-admin
.
sudo npm install -g --unsafe-perm node-red node-red-admin
npm
installe normalement ses packages dans votre répertoire courant. Ici nous allons utiliser la flag -g
pour installer les packages ‘globalement’ de manière à ce qu’ils soient placés dans des dossiers tels que /usr/local/bin
. Le flag --unsafe-perm
nous aide à éviter certaines erreurs qui peuvent surgir quand npm essaye de compiler les modules natifs (modules écrits dans un langage compilé tel que C ou C++, par opposition à JavaScript).
Après un peu de téléchargement et d’arrangements de fichiers, vous allez revenir au prompt de ligne de commande. Testons notre installation:
D’abord nous devons ouvrir un port sur notre firewall. Node-RED par défaut utilise le port 1880
, alors autorisons cela.
sudo ufw allow 1880
Et maintenant lançons Node-RED lui-même. Pas besoin de sudo, étant donné que le port 1880 est suffisamment haut pour ne pas requérir de privilèges root.
node-red
Quelques message du type « Welcome to Node-RED » vont s’afficher sur le terminal. Sur votre ordinateur, faites pointer un navigateur WEB sur le port 1880 du serveur. Dand notre exemple, c’est http://node-red.example.com:1880
.
L’interface d’administration principale de Node-RED va se charger:
Si cela a fonctionné vous pouvez taper CRTL+C dans votre terminal pour fermer Node-RED et retourner à l’invite de commande. Vous avez installé avec succès Node-RED et vous l’avez testé, alors maintenant nous allons le configurer pour se lancer en même temps que le système.
Etape 3 – Faire démarrer Node-RED au démarrage du système
Afin de démarrer Node-RED automatiquement au boot, vous devez installer un fichier de service node-red.service
au lieu du traditionnel script traditionnel. C’est parce que Ubuntu 16.04 est le première release LTS qui utilise systemd pour son sysème init
. Vous pouvez trouver un article à ce sujet d’autres changements de Ubuntu 16.04 dans What’s New in Ubuntu 16.04. Ouvrez un nouveau fichier vide qui s’appelera node-red.service
.
sudo nano /etc/systemd/system/node-red.service
Copiez et collez le contenu suivant, et sauvegardez le fichier à cet endroit: /etc/systemd/system/node-red.service
[Unit]
Description=Node-RED
After=syslog.target network.target
[Service]
ExecStart=/usr/local/bin/node-red-pi --max-old-space-size=128 -v
Restart=on-failure
KillSignal=SIGINT
# log output to syslog as 'node-red'
SyslogIdentifier=node-red
StandardOutput=syslog
# non-root user to run as
WorkingDirectory=/home/sammy/
User=sammy
Group=sammy
[Install]
WantedBy=multi-user.target
Une explication complète des fichiers de service systemd est hors du sujet de ce tutoriel, mais vous pouvez en apprendre plus en lisant : Systemd Essentials: Working with Services, Units, and the Journal.
Ceci dit, éclaircissons certaines des sections de notre fichier de service /etc/systemd/system/node-red.service
[Unit]
Description=Node-RED
After=syslog.target network.target
Ceci décrit notre service et indique qu’il devrait être démarré après que le réseau et syslog soient en fonctionnement.
[Service]
ExecStart=/usr/local/bin/node-red-pi --max-old-space-size=128 -v
Restart=on-failure
KillSignal=SIGINT
ExecStart
est la commande nécessaire pour démarrer notre service. Nous appelons node-red-pi
au lieu du node-red complet ainsi nous pouvons passer des options d'économie de mémoire à
Node.js. Ceci est censé lui permettre de tourner correctement sur n’importe quel serveur de taille raisonnable, en fonction bien sûr du nombre de flows que vous créez dans Node-RED et de leur complexité. Restart=on-failure
signifie que systemd va essayer de redémarrer Node-RED s’il se plante, et KillSignal
indique à systemd la meilleure façon de quitter Node-RED pour arrêter ou redémarrer le processus.
# log output to syslog as 'node-red' SyslogIdentifier=node-red StandardOutput=syslog
Ceci définit le label utilisé dans le log, et envoie toutes les sorties vers le service syslog.
# non-root user to run as WorkingDirectory=/home/sammy/ User=sammy Group=sammy
Nous souhaitons lancer Node-RED sous un utilisateur non-root. Les lignes ci-dessus demandent à systemd de lancer Node-RED en utilisant notre utilisateur et notre groupe, et depuis notre répertoire home.
[Install] WantedBy=multi-user.target
WantedBy
indique les cibles sous lesquelles notre service doit tourner. Dans ce cas, quand Ubuntu boote en mode multi-user, il saura qu’il doit aussi lancer notre service Node-RED service. Le mode Muti-user est la cible de démarrage par défaut.
Maintenant que notre service est installé et compris, nous avons besoin de l’activer.Ceci lui permettra de s’éxecuter au démarrage.
- sudo systemctl enable node-red
Démarrons maintenant le service manuellent pour vérifier s’il fonctionne toujours:
- sudo systemctl start node-red
Faites de nouveau pointer un navigateur sur le port 1880 du serveur et vérifiez que Node-RED est de retour. Si c’est le cas, arrêtez-le de nouveau en attendant que nous ayons sécurisé l’installation à la prochaine étape.
- sudo systemctl stop node-red
Etape 4 – Paramétrer Nginx
Nous allons utiliser Nginx comme proxy pour le service Node-RED. Cela signifie que Nginx va prendre en charge toutes les connexions SSL sur le port 443 (en utilisant les certificats Let’s Encrypt que vous avez précédement paramétrés, puis passer le trafic à Node-RED.
Ouvrez une nouvelle configuration Nginx pour le site:
- sudo nano /etc/nginx/sites-enabled/node-red.example.com
Copiez et collez les lignes suivantes, en adaptant le nom du serveur et les chemins des certificats:
/etc/nginx/sites-enabled/node-red.example.com
server {
listen 80;
listen 443 ssl http2;
server_name node-red.example.com;
ssl_certificate /etc/letsencrypt/live/node-red.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/node-red.example.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers On;
ssl_session_cache shared:SSL:128m;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8;
location / {
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
proxy_pass http://localhost:1880;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location '/.well-known/acme-challenge' {
root /var/www/html;
}
}
Enregistrez et fermez le fichier. Voyons en détail ce que fait ce fichier:
Les 3 premières lignes indiquent à Nginx quels ports écouter, et à quel nom de domaine répondre. Les lignes ssl_certificate
et ssl_certificate_key
pointent sur le certificat que nous avons récupéré de Let’s Encrypt. Les lignes restantes ssl_
choisissent des protocoles, ciphers, et options plus sécurisées que celles par défaut.
location /
débute le bloc où nous définissons actuellement notre proxy Node-RED.
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
Ce bloc correspond à toutes les connexions HTTP non sécurisées en clair, et les redirige vers la version HTTPS du site.
/etc/nginx/sites-enabled/node-red.example.com
proxy_pass http://localhost:1880;
We point to our Node-RED service here. It is available on localhost
, at port 1880
, so we pass connections to it there. The remainder of this block of configuration sets some headers that are important for proper proxy functioning. The Upgrade
and Connection
headers are especially important for handling Node-RED’s websocket connections.
Finally, we have a block to make sure the Let’s Encrypt challenge responses continue to be fetched from Nginx’s default web root:
location '/.well-known/acme-challenge' {
root /var/www/html;
}
Reload Nginx to pick up the new configuration.
- sudo systemctl reload nginx
Finally, start Node-RED again.
- sudo systemctl start node-red
Once again, navigate to your server: http://node-red.example.com
. You should be redirected to https://node-red.example.com
(note the https
) and see the Node-RED admin interface. This means we’re now proxying Node-RED through Nginx. We just have a few more tweaks to lock down Node-RED, and then we’ll be finished.
Etape 5 – Sécuriser Node-RED et l’habiller
Now that our connection is secure, let’s add a password to the Node-RED admin. Instead of putting a bare password right into our settings file, we first make a one-way cryptographic hash of it, and use that instead. We’ll use node-red-admin
to create the hash:
- node-red-admin hash-pw
You will be prompted for a password. Type it in, press ENTER
, and a hash will be printed on screen. Copy that to your clipboard and open the Node-RED settings file.
- nano ~/.node-red/settings.js
Scroll down and uncomment the adminAuth
block (by removing the « // » in front of each line). Change username
to whatever you like, and paste the hash into the password
field.
adminAuth: {
type: "credentials",
users: [{
username: "admin",
password: "$2a$08$Ab9prIr1M8a5a1/Zx8.B9.uIOCPe.v90ZGuZc2kAATp6BHJ/WV5KS",
permissions: "*"
}]
},
While we’ve got the file open, uncomment the uihost
line as well by removing the //
at the front of the line.
uiHost: "127.0.0.1",
This means Node-RED will only listen on the local interface, and wont be reachable directly by the outside world (it will only be accessed through the Nginx proxy). You can now save and close the file.
Update the firewall one last time, just to make sure Node-RED is never directly accessible.
- sudo ufw deny 1880
Finally, restart Node-RED.
- sudo systemctl restart node-red
Navigate to https://node-red.example.com
and you’ll see a login screen instead of the main editing interface.
If your site is showing a login screen and an https
connection, you’ve set everything up correctly.
Conclusion
We now have a reasonably secure installation of Node-RED, being proxied by Nginx using Let’s Encrypt for its SSL certificates. Log in and get wiring! There is much more information and project inspiration available at Node-RED’s website.
Sources:
- https://www.digitalocean.com/community/tutorials/how-to-connect-your-internet-of-things-with-node-red-on-ubuntu-16-04