Node-RED. Sauvegarde automatique des flows par email, FTP, copie locale • Domotique et objets connectés à faire soi-même

Node-RED ne dispose d’aucun outil de sauvegarde automatique par défaut. Même si NodeRED a atteint une certaine stabilité, il est important de sauvegarder régulièrement les flows en cas de problème avec un module ou en cas de panne par exemple. 

Localiser les fichiers NodeRED

Les flows sont stockés dans un fichier au format JSON par NodeRED dans le répertoire utilisateur. Par défaut, les fichiers sont enregistrés dans le répertoire /Users//.node-red sur Windows (c:\users\.node-red  ), macOS ou Linux.

Mieux que naviguer dans les répertoires, sur Linux ou macOS, il suffit d’exécuter cette commande pour localiser le répertoire d’installation de Node-RED.

La commande sudo est optionnelle si vous êtes connecté avec un compte administrateur (root)

sudo find / -type d -name ".node-red" -ls

La commande retourne la liste des répertoires qui contient le dossier recherché avec les droits attribués

1450744 4 drwxr-xr-x 5 projetsdiy projetsdiy 4096 avril 2 22:58 /home/projetsdiy/.node-red

Déplacez vous dans le répertoire

cd /home/projetsdiy/.node-red

puis exécutez la commande ls pour lister les fichiers stockés dans le dossier

flows_projetsdiy_cred.json 
flows_projetsdiy.json 
lib node_modules package.json 
package-lock.json 
settings.js 
start 
start_cred

Vous devez y trouver les deux fichiers utilisateur nommés flows_.json et flows__cred.json. Hostname est le nom attribué au système. Le fichier cred (pour credential, node-red-contrib-credential) est optionnel. Il permet de stocker de façon séparée les identifiants utilisateur.

Sauvegarde manuelle des flows Node-RED

La première solution consiste à exporter manuellement les flows NodeRed depuis la palette

Dans la boite de dialogue qui s’ouvre, plusieurs options sont disponibles :

  1. Exporter uniquement le flow courant
  2. Exporter tous les flows (conseillé)
  3. L’option Download permet de télécharger les flows sous la forme d’un fichier JSON
  4. L’option Copy to Clipboard (déconseillé) permet de copier dans le presse papier du système le contenu du fichier JSON. Il faudra ensuite enregistrer le contenu du presse papier dans un fichier texte.

Sauvegarde automatique locale

Valerio Vaccaro a proposé un flow qui permet faire une copie de sauvegarde locale. Chaque copie est horodatée à la date du backup. Je vous conseille de créer un sous-répertoire dans lequel les fichiers de sauvegarde seront enregistrés.

N’oubliez pas de modifier les chemins des fichiers avant de déployer le projet.

[{"id":"c9a474c5.cc2e98","type":"file in","z":"5519a8f3.84c4c8","name":"flows_vps.json","filename":"/root/.node-red/flows_vps.json","format":"utf8","x":360,"y":460,"wires":[["cd01d8fb.bcdf58"]]},{"id":"e6ef0ce1.d67b9","type":"file","z":"5519a8f3.84c4c8","name":"","filename":"Save file","appendNewline":false,"createDir":false,"overwriteFile":"true","x":720,"y":460,"wires":[[]]},{"id":"562a7cf3.6bfc14","type":"inject","z":"5519a8f3.84c4c8","name":"","topic":"","payload":"Start backup","payloadType":"str","repeat":"","crontab":"","once":true,"onceDelay":"","x":130,"y":460,"wires":[["c9a474c5.cc2e98","d6075a9a.835f08"]]},{"id":"cd01d8fb.bcdf58","type":"function","z":"5519a8f3.84c4c8","name":"new filename","func":"msg.filename = \"/root/.node-red/backup_\"+(new Date().toISOString().replace(':', '_').replace(':', '_').replace(/\\..+/, ''))+\"_flows_vps.json\";\nreturn msg;\n","outputs":1,"noerr":0,"x":550,"y":460,"wires":[["e6ef0ce1.d67b9"]]},{"id":"d6075a9a.835f08","type":"file in","z":"5519a8f3.84c4c8","name":"flows_vps_cred.json","filename":"/root/.node-red/flows_vps_cred.json","format":"utf8","x":380,"y":520,"wires":[["2b057928.89d4c6"]]},{"id":"6ed812ec.4e625c","type":"file","z":"5519a8f3.84c4c8","name":"","filename":"Save file","appendNewline":false,"createDir":false,"overwriteFile":"true","x":720,"y":520,"wires":[[]]},{"id":"2b057928.89d4c6","type":"function","z":"5519a8f3.84c4c8","name":"new filename","func":"msg.filename = \"/root/.node-red/backup_\"+(new Date().toISOString().replace(':', '_').replace(':', '_').replace(/\\..+/, ''))+\"_flows_vps_cred.json\";\nreturn msg;\n","outputs":1,"noerr":0,"x":570,"y":520,"wires":[["6ed812ec.4e625c"]]}]

Backup par email

La copie manuelle peut convenir lorsqu’on “bricole” avec Node-RED. Pour un projet en production, c’est rapidement contraignant et très risqué. Voyons comment on peut automatiser la sauvegarde très facilement avec un petit script qui envoi régulièrement une sauvegarde par email.

Commencez par ajouter le Node email depuis le gestionnaire de palette

Ajoutez ensuite un Node inject

Editez le Node (double-clic) :

  • Donnez un libellé dans le champ Payload.
  • Cocher Inject Once after 0.1 seconds qui permet d’exécuter le Node une fois 0.1 seconde après à chaque fois que le projet est déployé (ou à chaque fois que l’on clique sur le déclencheur manuel situé à gauche de Node).
  • Terminer en cliquant sur Done.

Placez une fonction (function) sur le flow et reliez le au node inject. La fonction permet de préparer le contenu de l’email. Collez le code ci-dessous dans la fonction et modifier :

  • Le Payload sera le corps de l’email
  • Le Topic sera le sujet de l’email
  • attachments contient le fichiers à joindre à l’email. Pour en savoir plus sur l’option attachments ici
    • Modifier le chemin vers les fichiers ( et )
    • Le fichier cred est optionnel
msg = {
    payload: "Node-RED files \n\n",
    topic: "Node-RED Backup",
    attachments: [
        {   
            path: '/home//.node-red/flows_.json'
        },{ // optional - optionnel
            path: '/home//.node-red/flows__cred.json'
        },
    ]
}
return msg;

Ajouter maintenant un Node email et configurer les options :

  • To destinataire de l’email
  • Server serveur d’envoi d’email (serveur SMTP)
  • Port du serveur SMTP (465 pour Gmail par défaut)
  • Userid identifiant de votre compte mail
  • Password mot de passe de votre compte mail
  • Cocher Use TLS pour Gmail et probablement pour les autres également
  • Done pour enregistrer la configuration

Relier les Nodes et ajouter un Debug pour vérifier et localiser une éventuelle erreur de configuration.

paplpjunjjivbibbribv-1274112

Déployer le flow de backup

Cliquer sur Deploy pour déployer le projet. Si tout est correctement configuré, vous recevrez quelques instants plus tard un email contenant la sauvegarde des fichiers de votre projet en pièce jointe.

Code complet de script de sauvegarde

Copiez puis importez le script de sauvegarde dans votre projet Node-RED.

[{"id":"5519a8f3.84c4c8","type":"tab","label":"Flow 3","disabled":false,"info":""},{"id":"2f982ae7.a78d56","type":"e-mail","z":"5519a8f3.84c4c8","server":"smtp.gmail.com","port":"465","secure":true,"tls":true,"name":"","dname":"Send email","x":490,"y":80,"wires":[]},{"id":"62d29031.438c4","type":"function","z":"5519a8f3.84c4c8","name":"Prepare email","func":"msg = {\n payload: \"Node-RED files \\n\\n\",\n topic: \"Node-RED Backup\",\n attachments: [\n { \n path: '/home/projetsdiy/.node-red/flows_projetsdiy.json'\n },{ // optional - optionnel\n path: '/home/projetsdiy/.node-red/flows_projetsdiy_cred.json'\n },\n ]\n}\nreturn msg;","outputs":1,"noerr":0,"x":300,"y":100,"wires":[["2f982ae7.a78d56","dd452920.422568"]]},{"id":"dd452920.422568","type":"debug","z":"5519a8f3.84c4c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":490,"y":120,"wires":[]},{"id":"2ac13700.a040ba","type":"inject","z":"5519a8f3.84c4c8","name":"","topic":"","payload":"start backup","payloadType":"str","repeat":"","crontab":"","once":true,"onceDelay":0.1,"x":130,"y":100,"wires":[["62d29031.438c4"]]}]

Configurer votre compte gmail

Pour les utilisateurs de gmail, il est nécessaire de configurer votre compte afin de pouvoir expédier des emails depuis Node-RED. En effet, Gmail interdit par défaut les applications non sécurisées à expédier des emails. Si vous déployez le flow, vous allez automatiquement recevoir cet email d’alerte de Gmail.

Ouvrez un navigateur et allez sur la page https://myaccount.google.com. Aller sur l’onglet Sécurité puis descendre jusqu’au bloc Accès moins sécurisé des applications et suivre le lien vers Activer l’accès (déconseillé).

Cocher ensuite l’option Autoriser les applications moins sécurisées.

Maintenant vous ne recevrez plus d’email d’avertissement de la part de Gmail.

Sauvegarder sur un serveur FTP

Troisième solution, envoyer régulièrement le flow sur un serveur FTP distant. C’est probablement la meilleure solution pour sécuriser votre travail.

Installer le module node-red-contrib-ftp depuis le gestionnaire de palette.

Placer une fonction et coller le code en l’adaptant à votre configuration :

  • filename répertoire de destination / nom du fichier. Ici le fichier sera horodaté à la date du jour
  • localFilename chemin vers le fichier à sauvegarder
msg.filename = '/flow_'+new Date().toISOString()+'.json';
msg.localFilename = '/home/projetsdiy/.node-red/flows_jeedom.json';
return msg;

Coller un Node FTP. Ajouter un nouveau serveur en cliquant sur le crayon :

  • Host adresse IP du serveur FTP (ici un serveur FTP sur le réseau local fonctionnant sur un NAS Synology)
  • Port par défaut 21 (déconseillé)
  • User identifiant de connexion
  • Password mot de passe

Choisir dans la liste le serveur FTP que l’on vient de créer. Dans Operation, choisir put.

Enfin relier les Nodes et déployer.

Le code du flow FTP

[{"id":"2ac13700.a040ba","type":"inject","z":"5519a8f3.84c4c8","name":"","topic":"","payload":"Start backup","payloadType":"str","repeat":"","crontab":"","once":true,"onceDelay":0.1,"x":130,"y":300,"wires":[["c23fb1fb.da69e"]]},{"id":"45b0fedd.f6bbc","type":"debug","z":"5519a8f3.84c4c8","name":"","active":false,"console":"false","complete":"payload","x":710,"y":420,"wires":[]},{"id":"c23fb1fb.da69e","type":"function","z":"5519a8f3.84c4c8","name":"Configuration","func":"// filename : chemin et nom de fichier sur la destination - destination path and file name\n// localFilename : chemin du fichier local - local file path\nmsg.filename = '/flow_'+new Date().toISOString()+'.json';\nmsg.localFilename = '/home/projetsdiy/.node-red/flows_.json';\nreturn msg;","outputs":1,"noerr":0,"x":320,"y":340,"wires":[["3be2ee22.016552"]]},{"id":"3be2ee22.016552","type":"ftp in","z":"5519a8f3.84c4c8","ftp":"439530c1.0f6ba","operation":"put","filename":"","localFilename":"","name":"Put to FTP","x":510,"y":380,"wires":[["45b0fedd.f6bbc"]]},{"id":"439530c1.0f6ba","type":"ftp","z":"","host":"xxx.xxx.xxx.xxx","port":"21","secureOptions":"","user":"","connTimeout":"","pasvTimeout":"","keepalive":""}]

Programmer une sauvegarde automatique régulière

Au début du tutoriel, nous avons configuré le Node inject pour qu’il soit exécuté une seule fois au déploiement du projet (ou manuellement en cliquant sur le déclencheur, mais il est tout à fait possible de le programmer pour qu’il soit exécuté régulièrement. Editer le Node. On peut programmer le mode de répétition (repeat) :

  • Par intervalle (interval). Par exemple toutes les 72 heures
  • Par intervalle périodiquement (interval between times) : inadapté dans le cas d’une sauvegarde
  • Périodiquement (at a specific time), c’est le mode le mieux adapté. On pourra par exemple faire une sauvegarder tous les jours à 12h00

Avez-vous aimé cet article ? [Total: 0 Moyenne: 0]