Sauvegarder Jeedom avec PowerShell sous Linux
Sommaire
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 !
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?
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
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 🙂