17/11/2024

DomotiqueLinuxPowerShell

Sauvegarder Jeedom avec PowerShell sous Linux

I. Présentation

Dans ce tutoriel, je vous propose une solution en Powershell pour sauvegarder Jeedom ou plutôt copier la sauvegarde Jeedom sur un NAS, en gérant une rétention. Pour moi, c'était l'occasion de tester Powershell sous Linux et en même temps de sauvegarder mon instance de Jeedom.

Lorsqu'elle est configurée, la fonctionnalité de sauvegarde Jeedom génère un fichier tar.gz qui contient tous les fichiers de l'application ainsi qu'une sauvegarde de la base de données. C'est ce fichier, que l'on va copier sur le NAS et on va conserver un historique sur X jours.

II. Configurer la sauvegarde dans Jeedom

Les sauvegardes Jeedom sont stockées dans le répertoire suivant : /var/www/html/backup

Pour la configuration, il faut cliquer sur l'icône paramètres puis sur "Sauvegardes".

L'emplacement par défaut des sauvegardes est le dossier "backup" ce qui correspond au chemin complet suivant : /var/www/html/backup. C'est ce chemin que j'ai indiqué par défaut dans le script.

Vous n'êtes pas obligé de modifier ce chemin, ni le nombre de sauvegardes à mémoriser, puisque nous allons gérer cet historique directement dans le script au niveau du stockage externe. Inutile donc de conserver un historique conséquent sur le stockage local en lui-même.

Mettez à jour les paramètres de la sauvegarde si vous le souhaitez, sinon passez directement à la suite.

III. Préparation et montage du partage

Pour stocker les sauvegardes, je vais utiliser un NAS ASUSTOR, voici ce que j'ai configuré : un sous-dossier nommé "Jeedom" au sein du dossier partagé "Sauvegardes". Il sera accessible en écriture à partir d'un compte utilisateur dédié. Ce dossier est accessible à cette adresse : \\192.168.1.150\Sauvegardes\Jeedom.

Pour que ce partage soit accessible depuis le serveur Jeedom, j'ai décidé de passer par un point de montage classique Unix. En fait, à la base je souhaitais utiliser le cmdlet Powershell "New-PSDrive", il est bien disponible, mais le problème c'est les credentials. Je n'ai pas réussi à créer un objet credentials pour stocker l'identifiant et le mot de passe, car la classe n'existe pas (pour le moment...) et ça obligeait à saisir ces infos dans le prompt à chaque exécution.

Pour contourner cette problématique, j'ai intégré dans le script Powershell la commande mount.cifs et ça fonctionne parfaitement !

Je commence par créer un point de montage "backup" :

mkdir /mnt/backup

Ensuite, je peux monter le partage de mon NAS sur le système local dans /mnt/backup, en utilisant les credentials adéquats que je précise en paramètres :

mount.cifs //192.168.1.150/Sauvegardes/Jeedom /mnt/backup -o username="backup",password="xxPasswordxx"

Ceci n'est pas une bonne idée, car on a passé le mot de passe en clair dans la commande, si l'on ajoute ensuite le montage en automatique dans fstab, il vaut mieux sécuriser les credentials. Nous allons créer un fichier smbcredentials dans /root :

nano ~/.backup-credentials

Ajoutez le contenu suivant en adaptant les valeurs :

username=myusername
password=mypassword

On va ensuite sécuriser le fichier en modifiant les droits :

chmod 600 ~/.backupcreds

Maintenant, on peut monter le partage de façon sécurisée. Pour ce qui est du montage, on va directement le gérer dans le script, mais on pourrait très bien l'inclure directement dans le fichier fstab pour automatiser le montage au démarrage de la machine. Pour ma part, je préfère le monter au début du script et le démonter à la fin, ceci évite qu'il reste accessible constamment depuis le serveur Jeedom.

IV. Le script de sauvegarde

Je ne vais pas expliquer les lignes de code une à une, mais en gros voici le déroulement du script en quelques steps :

1 - Monter le stockage externe sur un point de montage local

2 - Vérifiez la présence du fichier témoin mount.file sur le stockage distant avant de poursuivre, s'il n'est pas là, on s'arrête

Pour s'assurer que le partage est bien monté dans /mnt/backup, je vous invite à créer un fichier nommé "mount.file" (sans contenu spécifique) au sein de votre stockage externe. Le script va vérifier sa présence pour s'assurer que le partage est monté correctement et accessible.

Créez ce fichier depuis votre serveur Jeedom si vous voulez :

touch /mnt/backup/mount.file

3 - On récupère le nom du fichier correspondant au backup Jeedom le plus récent

4 - On copie ce fichier à destination du stockage externe

5 - On récupère la liste des fichiers de backup stocké sur le partage et on supprime ceux qui sont obsolètes (selon la rétention définie, par défaut 30 jours)

6 - On démonte le stockage externe du point de montage pour le délier du système local

Ce script s'appuie sur quelques paramètres qui vous permettront de l'adapter à votre environnement sans modifier le code, j'ai inclus les informations à ce sujet directement sur la page GitHub.

Script complet disponible sur GitHub en cliquant sur l'image ci-dessous :

V. Planifier l'exécution du script

Pour aller jusqu'au bout, on va terminer en ajoutant une ligne dans la crontab pour exécuter le script chaque jour pour faire une sauvegarde sur le NAS. Sans trop être capable d'expliquer pourquoi, si j'ajoute l'exécution du script dans la crontab de l'utilisateur (root), il y a un souci sur l'exécution... Le point de montage n'arrive pas à se monter.

Par contre, en modifiant la crontab du système (/etc/crontab) ça fonctionne parfaitement !

Je vous propose donc de modifier le fichier crontab :

nano /etc/crontab

Ajoutez cette ligne :

0 8 * * * root /root/powershell/pwsh /home/pi/Invoke-JeedomBackup.ps1 -BackupSrc "/var/www/html/backup" -BackupDest "/mnt/backup" -MountTarget "//192.168.1.150/Sauvegardes/Jeedom" -CredsFile "/root/.backupcreds" >> /var/log/Invoke-JeedomBackup.log

La ligne ci-dessus va exécuter la sauvegarde tous les jours à 08:00, en envoyant la sortie pour log dans le fichier /var/log/Invoke-JeedomBackup.log. Je vous laisse le soin de modifier les paramètres pour adapter à votre environnement.

Voilà, désormais la sauvegarde de votre Jeedom sera externalisée sur un support de stockage externe !

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

3 commentaires sur “Sauvegarder Jeedom avec PowerShell sous Linux

  • Pas mal,

    Mais j’ai un peu de mal de comprendre l’utilité, puisqu’une option native dans jeedom permet de faire cela ? Qu’apporte cette solution de plus?

    Répondre
    • Bonjour Tarlak,

      C’était pour externaliser les sauvegardes Jeedom sur un partage distant, j’ai utilisé PowerShell sous Linux afin d’expérimenter un peu en même temps… Du coup, je me suis dit que c’était bien de partager cela dans un article 🙂

      Florian

      Répondre
      • Bonjour,

        d’accord je comprend 🙂

        Mais juste au cas ou si vous aller dans la configuration de jeedom puis dans mise à jour, vous verrez sur la droite un onglet samba, en saisissant les bonnes infos vous aurez alors dans les options de sauvegarde la possibilité de faire des sauvegardes distante automatiquement à chaque sauvegarde faite. Avec de la rétention de sauvegarde également 🙂

        Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.