Yo !
Aujourd’hui je vais vous parler de la sauvegarde régulière des informations importantes pour votre installation domotique à travers ce post : « Domoticz : sauvegarde automatique et régulière de votre système domotique ».
Mon installation domotique fonctionne alors que je ne suis pas souvent à la maison. Mon soucis principal est donc la stabilité et la disponibilité de l’installation.
Je préfère ne pas intégrer une nouvelle fonctionnalité si il ne me reste qu’un soupçon de doute concernant l’impacte de celui-ci sur le CPU et la mémoire.
Cependant… il faut bien avancer et comme je n’ai pas d’environnement de test me permettant de tester en grandeur nature, il a bien fallu penser à mettre en place une solution me permettant de repartir de 0 en cas d’incident majeur.
Allez GO, c’est parti !
Domoticz : sauvegarde automatique et régulière de votre système domotique
Pour commencer, je me suis posé la question suivante : Qu’est ce que je dois sauvegarder ?
Après avoir regardé un peu les fichiers présents sur le raspberry mais aussi les forums sur le net, notamment le forum officiel de domoticz, j’ai pris la décision de sauvegarder 3 choses :
- la base de donnée domoticz
- le répertoire domoticz
- le filesystem complet du raspberry
Sauvegarde de la base de donnée domoticz
Pour sauvegarder la base de donnée de domoticz, j’ai trouvé la commande suivante :
1 |
/usr/bin/curl -s http://domoticz_ip:domoticz_port/backupdatabase.php > /backup_directory/backup_file |
Avec la commande curl (man curl), vous allez pouvoir récupérer le résultat de l’action qui est lancée lorsque l’on clique sur le bouton d’export de la base de donnée présent sur l’écran accessible par le chemin : Réglages / Paramètres puis choisir l’onglet « Sauvegarde/restauration« . Dans la commande ci-dessus, le symbole « > » redirige la sortie standard vers le fichier spécifié ensuite.
Sauvegarde du répertoire domoticz
Pour procéder à la sauvegarde du répertoire domoticz, je vais utiliser la commande tar (man tar). Voici la commande que je propose :
1 |
sudo tar czf monFichierBackup.tar.gz mon_repertoire/ |
Les options choisies spécifient :
- c : créer une archive
- z : utiliser la compression gzip
- f : permet de spécifier le fichier archive, ici : monFichierBackup.tar.gz.
Sauvegarde complète de la carte SD (filesystem)
La première chose à faire est de repérer le chemin utilisé pour notre carte SD. Pour connaitre le chemin vers votre carte SD, on utilise la commande fdisk (man fdisk) :
1 2 3 4 5 6 7 8 9 10 11 12 |
pi@domoBox ~ $ sudo fdisk -l Disk /dev/mmcblk0: 31.9 GB, 31914983424 bytes 4 heads, 16 sectors/track, 973968 cylinders, total 62333952 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000b5098 Device Boot Start End Blocks Id System /dev/mmcblk0p1 8192 122879 57344 c W95 FAT32 (LBA) /dev/mmcblk0p2 122880 7744511 3810816 83 Linux |
Avec ce résultat, on peut voir que notre carte se cache derrière le répertoire :
/dev/mmcblk0
La commande à utiliser pour créer une image de votre carte SD est la commande dd (man dd).
Si vous n’avez pas envie de vous casser la tête à lire le manuel de cette commande, voici la commande que j’utilise :
1 |
sudo dd bs=4M if=/chemin_de_la_carte | gzip > /répertoire_de_destination/nom_du_fichier`date +%d%m%y`.gz |
Attention, ce traitement est long et charge beaucoup votre système.
Chez moi ce traitement a mis 7 heures 25 minutes sachant que j’écris le résultat sur un disque USB monté sur un autre RaspberryPi, ce qui n’est pas vraiment optimal étant donné que le réseau Ethernet et l’USB se partagent le même bus… et surtout que le disque de destination est en NTFS (vraiment pas top sous linux niveau consommation de CPU) mais bon à la limite, je ne suis pas pressé
Bon voilà nous savons désormais sauvegarder chacun des éléments important du système domotique.
Voyons voir comment automatiser la sauvegarde dans le but d’avoir toujours une sauvegarde assez récente des éléments.
Automatisation de la sauvegarde & nettoyage
Pour automatiser la sauvegarde, j’ai décidé d’utiliser la crontab (man cron) qui permet l’exécution de tâches planifiées. Réfléchissons maintenant à quand programmer les sauvegardes.
Pour ce qui est de la sauvegarde de la base de données, j’ai décidé de programmer la sauvegarde tous les matin à 01h, ainsi, si un crash arrive un jour, je repars de ce fichier pour restaurer l’ensemble des informations récupérées pas domoticz tel que l’historique des températures ou encode de l’utilisation des différents périphériques.
Pour ce qui est de la sauvegarde du répertoire domoticz, j’ai décidé de mettre en place une sauvegarde hebdomadaire le lundi matin à 4h. Ainsi, si des éléments de ce répertoire (scripts, icônes perso…) sont corrompus, seule une semaine de travail sera perdue. j’essaierai de lancer une sauvegarde manuelle en cas d’ajout de scripts… ou même d’automatiser ce point plus tard.
Pour ce qui est de la sauvegarde complète du filesystem du RPi, je pense qu’une sauvegarde automatique n’est nécessaire qu’une fois par mois le premier à 2h. Bien que cette sauvegarde soit souvent (toujours?) nécessaire à la restauration complète de votre centre domotique, les modifications effectuées au niveau du système (en gros, autres répertoires que /home) sont relativement rares, c’est pourquoi j’ai décidé de ne pas effectuer souvent cette sauvegarde étant donné le temps d’exécution nécessaire.
Pour éditer votre crontab, utiliser la commande crontab -e. Voici à quoi doit correspondre notre crontab :
1 2 3 |
0 1 * * * ./backup.sh DB 30 1 * * 1 ./backup.sh DOMOTICZ 0 2 1 * * ./backup.sh FILESYSTEM |
Bon, maintenant que ce point est résolu, il faut maintenant réfléchir au nombre de version de chaque type de sauvegarde à conserver et par la même occasion au nettoyage du répertoire de sauvegarde.
Vu les périodicités fixées précédemment, je choisis de conserver 7 jours (soit 7 fichiers) de sauvegarde de la base de donnée, 1 mois de sauvegarde du répertoire Domoticz (soit 4 fichiers), et 2 mois de FILESYSTEM (soit 2 fichiers).
1 2 3 4 5 6 |
#Nettoyage des sauvegardes du filesystem myFile="/chemin/ver/mon/*.ext" temps="7" file_to_be_deleted=`find $myFile -type f -mtime +$temps` echo "file_to_be_deleted : $file_to_be_deleted" >> $LOG_FILE find $myFile -type f -mtime +$temps -exec rm {} \; |
Avec cette commande, j’affiche puis supprime les fichiers correspondant à myFile qui sont plus vieux que temps.
Pour parler de volume, actuellement le poids des fichiers est de :
- DB : 5,5MB
- DOMOTICZ : 150 MB
- FILESYSTEM : 7,7Go
L’espace libre nécessaire pour que la sauvegarde se déroule bien est donc d’un peu plus de 16Go.
Ecriture du script de sauvegarde
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
#! /bin/sh ##------------------------------------------------------------------------- ## Script : backup.sh ## ## Objectif : Script qui permet d'automatiser la sauvegarde des éleménts ## importants d'une installation DOmoticz' ## ## Auteur : Bastien DUMAS ## Date : 01/11/2015 ## Version : 1.0 ##------------------------------------------------------------------------- ################### CONFIGURATION DU SCRIPT ################### ## Information abonné FreeMobile pour l'envoie de SMS FREE_USERNAME="votre ID" #Nom d'utilisateur freemobile FREE_PASSWORD="votre PASSWORD" #Password freemobile #Informations relative à domoticz DOMOTICZ_IP="localhost" # Domoticz IP DOMOTICZ_PORT="8080" # Domoticz port DOMOTICZ_DIRECTORY="/home/pi/domoticz" #Répertoire Domoticz FILESYSTEM="/dev/mmcblk0" #Chemin du device filesystem #Informations relative à la sauvegarde BACKUP_DIRECTORY="votre répertoire de backup" #Répertoire de destination des fichiers issus de la sauvegarde TIMESTAMP=`/bin/date +%Y%m%d%H%M%S` #Timestamp utilisé pour différencier les sauvegardes DB_BACKUPFILE="domoticz_$TIMESTAMP.db" #Nom du fichier issu de la sauvegarde de la base de donnée domoticz DOMOTICZ_DIRECTORY_BACKUPFILE="domoticz_directory_$TIMESTAMP.tar.gz" #Nom du fichier issu de la sauvegarde du répertoire domoticz FILESYSTEM_BACKUPFILE="domoBox_$TIMESTAMP.gzip" #Nom du fichier issu de la sauvegarde du filesystem complet #Chemin du fichier de log LOG_FILE="/media/nas/RPi/domoticz/backup/backup.log" #Temps de conservation des fichiers de sauvegarde TTL_DB="7" #Base de donnée TTL_DOMOTICZ="31" #Répertoire domoticz TTL_FILESYSTEM="62" #Sauvegarde complete du FILESYSTEM ############################################################### ####################### DEBUT DU SCRIPT ####################### echo "===============> Sauvegarde du $TIMESTAMP" >> $LOG_FILE echo "==== ELEMENTS DE CONFIGURATION ====" >> $LOG_FILE echo "BACKUP_DIRECTORY : $BACKUP_DIRECTORY" >> $LOG_FILE echo "TIMESTAMP : $TIMESTAMP" >> $LOG_FILE echo "DB_BACKUPFILE : $DB_BACKUPFILE" >> $LOG_FILE echo "DOMOTICZ_DIRECTORY_BACKUPFILE : $DOMOTICZ_DIRECTORY_BACKUPFILE" >> $LOG_FILE echo "FILESYSTEM_BACKUPFILE : $FILESYSTEM_BACKUPFILE" >> $LOG_FILE echo "myBackupFile = ${BACKUP_DIRECTORY}/${DB_BACKUPFILE}" >> $LOG_FILE echo "LOG_FILE = $LOG_FILE" >> $LOG_FILE echo "===================================" >> $LOG_FILE echo "" echo "" #### PARTIE 1 : SAUVEGARDE ##### case "$1" in DB) ## Sauvegarde de la base de donnée de domoticz echo "$TIMESTAMP : Vous avez demande la sauvegarde de la base de donnée de Domoticz " >> $LOG_FILE myBackupFile="${BACKUP_DIRECTORY}/${DB_BACKUPFILE}" #Initialisation du timer BEFORE=$(/bin/date +'%s') #Sauvegarde sav_db=$(curl -s http://$DOMOTICZ_IP:$DOMOTICZ_PORT/backupdatabase.php > $myBackupFile) #Calcul du temps d'éxécution AFTER=$(/bin/date +'%s') ELAPSED=$(($AFTER - $BEFORE)) ELAPSED=`/bin/date -u -d @${ELAPSED} +"%T"` #LOG du résultat if [ -e $myBackupFile ] then msg="$TIMESTAMP : Sauvegarde OK dans le fichier : $myBackupFile en $ELAPSED" echo $msg >> $LOG_FILE ##Envoie du SMS de succes curl -s -i -k "https://smsapi.free-mobile.fr/sendmsg?user=$FREE_USERNAME&pass=$FREE_PASSWORD&msg=$msg" else msg="$TIMESTAMP : ERREUR LORS DE LA SAUVEGARDE DE LA BASE DE DONNEE DOMOTICZ" echo $msg >> $LOG_FILE ##Envoie du SMS d'erreur curl -s -i -k "https://smsapi.free-mobile.fr/sendmsg?user=$FREE_USERNAME&pass=$FREE_PASSWORD&msg=$msg" exit 3; fi ;; DOMOTICZ) ## Sauvegarde du répertoire domoticz complet echo "$TIMESTAMP : Vous avez demande la sauvegarde du répertoire DOMOTICZ" >> $LOG_FILE #Construction du nom de fichier myBackupFile="${BACKUP_DIRECTORY}/${DOMOTICZ_DIRECTORY_BACKUPFILE}" #Initialisation du timer BEFORE=$(/bin/date +'%s') #Sauvegarde sav_directory=$(sudo tar czf $myBackupFile $DOMOTICZ_DIRECTORY) #Calcul du temps d'éxécution AFTER=$(/bin/date +'%s') ELAPSED=$(($AFTER - $BEFORE)) ELAPSED=`/bin/date -u -d @${ELAPSED} +"%T"` #LOG du résultat if [ -e $myBackupFile ] then msg="$TIMESTAMP : Sauvegarde OK dans le fichier : $myBackupFile en $ELAPSED" echo $msg >> $LOG_FILE ##Envoie du SMS de succes curl -s -i -k "https://smsapi.free-mobile.fr/sendmsg?user=$FREE_USERNAME&pass=$FREE_PASSWORD&msg=$msg" else msg="$TIMESTAMP : ERREUR LORS DE LA SAUVEGARDE DU REPERTOIRE DOMOTICZ" echo $msg >> $LOG_FILE ##Envoie du SMS d'erreur curl -s -i -k "https://smsapi.free-mobile.fr/sendmsg?user=$FREE_USERNAME&pass=$FREE_PASSWORD&msg=$msg" exit 3; fi ;; FILESYSTEM) ## Sauvegarde du FILESYSTEM complet echo "$TIMESTAMP : Vous avez demande la sauvegarde du FILESYSTEM" >> $LOG_FILE #Construction du nom de fichier myBackupFile="${BACKUP_DIRECTORY}/${FILESYSTEM_BACKUPFILE}" #Initialisation du timer BEFORE=$(/bin/date +'%s') #Sauvegarde sav_filesystem=$(sudo dd bs=4M if=$FILESYSTEM | gzip > $myBackupFile) #Calcul du temps d'éxécution AFTER=$(/bin/date +'%s') ELAPSED=$(($AFTER - $BEFORE)) ELAPSED=`/bin/date -u -d @${ELAPSED} +"%T"` #LOG du résultat if [ -e $myBackupFile ] then msg="$TIMESTAMP : Sauvegarde OK dans le fichier : $myBackupFile en $ELAPSED" echo $msg >> $LOG_FILE ##Envoie du SMS de succes curl -s -i -k "https://smsapi.free-mobile.fr/sendmsg?user=$FREE_USERNAME&pass=$FREE_PASSWORD&msg=$msg" else msg="$TIMESTAMP : ERREUR LORS DE LA SAUVEGARDE DU FILESYSTEM" echo $msg >> $LOG_FILE ##Envoie du SMS d'erreur curl -s -i -k "https://smsapi.free-mobile.fr/sendmsg?user=$FREE_USERNAME&pass=$FREE_PASSWORD&msg=$msg" exit 3; fi ;; *) ## ERREUR DE PARAMETRE echo "USAGE $0 :" >&2 echo "$0 type_sauvegarde" >&2 echo "$0 (DB|DOMOTICZ|FILESYSTEM)" >&2 echo "Paramètres incorrectes" >> $LOG_FILE exit 3; esac #### PARTIE 2 : NETTOYAGE ##### #Nettoyage des sauvegarde de DB myDBFile="${BACKUP_DIRECTORY}/*.db" DB_to_be_deleted=`find $myDBFile -type f -mtime +$TTL_DB` echo "DB_to_be_deleted : $DB_to_be_deleted" >> $LOG_FILE find $myDBFile -type f -mtime +$TTL_DB -exec rm {} \; #Nettoyage des sauvegardes de répertoire domoticz myDIRECTORYFile="${BACKUP_DIRECTORY}/*.tar.gz" DIRECTORY_to_be_deleted=`find $myDIRECTORYFile -type f -mtime +$TTL_DOMOTICZ` echo "DIRECTORY_to_be_deleted : $DIRECTORY_to_be_deleted" >> $LOG_FILE find $myDIRECTORYFile -type f -mtime +$TTL_DOMOTICZ -exec rm {} \; #Nettoyage des sauvegardes du filesystem myFSFile="${BACKUP_DIRECTORY}/*.gzip" FS_to_be_deleted=`find $myFSFile -type f -mtime +$TTL_FILESYSTEM` echo "FS_to_be_deleted : $FS_to_be_deleted" >> $LOG_FILE find $myFSFile -type f -mtime +$TTL_FILESYSTEM -exec rm {} \; ######################## FIN DU SCRIPT ####################### |
Et voila
Vous avez maintenant toutes les billes pour mettre vous aussi en place une sauvegarde automatique de l’ensemble des éléments importants de votre installation domotique.
Perso je stocke les sauvegardes sur mon petit NAS fait maison (à base de RaspberryPi aussi et de la solution OpenMediaVault) comme ça .. en cas de soucis : 1 heure suffit pour relancer l’installation complète depuis une carte SD neuve.
N’hésitez pas à me dire si ce point vous intéresse !
Pour aller plus loin
On peut maintenant sauvegarder tranquillement l’ensemble de son installation mais en développant ce script je me suis demandé si je n’aurais pas du partir du nombre de fichiers modifiés depuis une date donnée pour déclencher une sauvegarde. Peut-être que les sauvegardes serait plus significative et moins nombreuses. Enfin bref, une première solution est maintenant en place, il faut lui laisser sa chance et on verra plus tard si il y a des choses à modifier/améliorer/revoir
J’espère que ce post « Domoticz : sauvegarde automatique et régulière de votre système domotique » pourra vous être utile et bien sûr, comme d’hab, si vous avez des questions, remarques, ou encore précisions à apporter, n’hésitez pas à laisser un commentaire !
Je partage mon script qui pourrait aussi t’intéresser http://blogmotion.fr/systeme/script-backup-rpi-partage-15977
Hello,
j’adore votre script, que j’ai mis en place, mais j’ai détecté une petite erreur sur la fin.
pour faire marcher, j’ai changé quelques lignes pour la partie nettoyage.
Merci.
#Nettoyage des sauvegarde de DB
myDBFile= »${BACKUP_DIRECTORY} »
DB_to_be_deleted=
find $myDBFile -name '*.db' -type f -mtime +$TTL_DB
echo « DB_to_be_deleted : $DB_to_be_deleted »
find $myDBFile -type f -name ‘*.db’ -mtime +$TTL_DB -exec rm {} \;
#Nettoyage des sauvegardes de répertoire domoticz
myDIRECTORYFile= »${BACKUP_DIRECTORY} »
DIRECTORY_to_be_deleted=
find $myDIRECTORYFile -name '*.tar.gz' -type f -mtime +$TTL_DOMOTICZ
echo « DIRECTORY_to_be_deleted : $DIRECTORY_to_be_deleted »
find $myDIRECTORYFile -type f -name ‘*.tar.gz’ -mtime +$TTL_DOMOTICZ -exec rm {} \;
#Nettoyage des sauvegardes du filesystem
myFSFile= »${BACKUP_DIRECTORY} »
FS_to_be_deleted=
find $myFSFile -name '*.gzip' -type f -mtime +$TTL_FILESYSTEM
echo « FS_to_be_deleted : $FS_to_be_deleted »
find $myFSFile -type f -name ‘*.gzip’ -mtime +$TTL_FILESYSTEM -exec rm {} \;
Bonjour,
merci pour le script que j’ai installé 😉
cependant, je me demande un peu comment faire pour restaurer la sauvegarde de la SD Card si elle venait à tomber en panne ?
Une petite indication svp ?
Pas mal… pas mal LOL…
J’ai adapté avec ma Freebox Revolution (NAS)
Je vais laisser en place pour l’instant pour voir comment il se comporte mais je pense que je vais mettre rapidement la compression des fichiers pour la db et faire un seul script pour gérer les 3 qui se lanceront à la suite, je n’aurai qu’une ligne dans le crontab.
Bref… c’est une bonne base pour commencer…
Bravo!
Très bon script que j’ai réussi à réadapter sur mon NAS Synology.
En revanche peux t’on changer l’envoi de SMS par un commande de notification prowl ?
D’autre part en ligne de commande j’ai systématiquement l’erreur invalid date qui s’affiche.
Bonjour,
J’aimerai pouvoir aussi sauvegarder sur mon NAS mais je suis debutant donc peu de connaissance, pourrais-tu partager ton script adapté sur le NAS !!???? Merci d’avance