vendredi 6 novembre 2015

Domoticz sauvegarde automatique de la base sur lecteur externe

Salut à tous,

Après quelques mois d'utilisation de mon installation domotique, j'ai eu quelques fois l'occasion de profiter de la sauvegarde externe automatique détaillée dans le dernier article.
En effet, ma première carte SD (une récup) m'a lâché et utilisant la version beta de domoticz, j'ai eu 2 ou 3 mauvaises mises à jour.
Ce script de sauvegarde est donc une très bonne chose pour retrouver un système fonctionnel après un problème.

Cependant la restauration d'une sauvegarde complète est très très longue et quelques fois j'aurai bien aimé ne pouvoir récupérer que la base de données plutôt que recharger l'image de sauvegarde de la nuit.

J'ai donc, en plus, activé la sauvegarde automatique dans le paramétrage domoticz.
Cette option active une sauvegarde horaire, journalière et mensuelle du fichier "domoticz.db" qui est alors sauvegardé :
Chaque heure sur 24h tournantes dans domoticz/backups/hourly
Chaque jour sur 31 jours tournants dans domoticz/backups/daily
Chaque mois sur 12 mois tournants dans domoticz/backups/monthly
Comme je souhaite préserver ma carte SD au maximum des écritures, j'ai "déporté" ce répertoire vers mon disque externe Freebox (dont le montage est expliqué dans mon dernier article).

- Sur le disque externe Freebox, j'ai créé un répertoire 'backup-raspberry/bdd"
Vu du serveur raspberry, ce répertoire est donc localisé dans :
/mnt/freebox/backup-raspberry/bdd
- Sur le RPI, j’ai supprimé le répertoire "backups"
cd domoticz
sudo rm -r ~/domoticz/backups
- Ensuite j'ai créé un fichier de type "lien symbolique" qui pointe sur le disque Freebox
ln -s /mnt/freebox/backup-raspberry/bdd/ backups
Ainsi quand je fais un "ls -al" du répertoire, j'obtiens :



Les sauvegardes horaires tournent sur 24h
hourly/backup-hour-20.db
hourly/backup-hour-21.db
etc

Les sauvegardes journalières tournent sur un mois
daily/backup-day-7.db
daily/backup-day-8.db
etc

Les sauvegardes mensuelles tournent sur une année
monthly/backup-month-10.db
monthly/backup-month-11.db
etc

samedi 28 février 2015

Sauvegarde complete Raspberry sur Freebox V6

Salut à tous,
Il y a peu, je me suis laissé tenter par le nouveau Raspberry Pi 2 avec l'idée d'en faire un petit serveur domotique.
Après m'être documenté à droite et à gauche, mon choix de distribution Linux s'est vite arrêté sur Raspbian, un dérivé de Debian parfaitement optimisé pour Raspberry tout en préservant au maximum la vie de la carte SD.
La gestion de la domotique est confiée à Domoticz, logiciel open sources multi protocoles consommant peu de ressources tout en étant relativement complet et puissant.
Quelques configurations, customisations et scripts spécifiques plus tard est venu le besoin de ne pas perdre tout ce travail en cas de décès de la carte SD en place.
Personnellement je préfère une sauvegarde complète de la carte SD (8 Gigas) et pour ceci, il existe l'excellente commande "dd" sous linux grace à laquelle il est possible d'effectuer une sauvegarde image du disque entier à chaud.
Mon besoin est de stocker cette sauvegarde sur un disque externe raccordé à la Freebox V6.
Il existe de nombreux tutos ou articles comme celui-ci expliquant comment réaliser ceci sauf... que je me suis systématiquement retrouvé avec un agacant "Permission denied" au moment de monter le disque externe de la Freebox avec la commande "mount".
Finalement c'est l'option "sec=ntlm" manquante dans les différents tutos qui provoquait ce problème peut-être lié au kernel plus récent du RPI2. 

Voici donc ma méthode KISS. Pour l'appliquer il est préférable d'avoir de bonnes notions sur linux car je ne détaille pas expressément chaque étape.

1) Création du répertoire de montage
sudo mkdir /mnt/freebox

2) Ajout du montage dans le fstab (attention ce n'est qu'une seule ligne, l'adresse locale de ma freebox est 192.168.1.254 et le disque externe raccordé est nommé USBWD)
Personnellement j'utilise l'éditeur "nano"
//192.168.1.254/USBWD /mnt/freebox cifs users,noauto,uid=root,gid=users,sec=ntlm,user=freebox,pass=XXXX,_netdev,vers=1.0 0 0

3) Le script que j'ai placé dans un fichier backup.sh dans le répertoire /home/pi/domoticz/scripts
Vous devez absolument identifier le nom de votre périphérique correspondant à votre carte SD à l'aide de la commande fdisk sour root, chez moi  son nom est "mmcblk0"
#!/bin/sh
#
# Script de sauvegarde de l'image complète du serveur vers un disque USB
# Contient un système de purge
#

# Chemin montage disque distant
MOUNT_PATH=/mnt/freebox
# Repertoire sauvegarde journaliere
SAVE_PATH_DAY=/backup-raspberry/days/
# Repertoire sauvegarde hebdomadaire
SAVE_PATH_WEEK=/backup-raspberry/weeks/
# Formatage date pour nom du fichier et logs
DATE_BCK=`date +%d-%m-%Y-%Hh%M`
# Nom du fichier de sauvegarde
BCK_FILE=srv-domoticz-${DATE_BCK}.img.gz
# Nombre de semaines à conserver
KEEP_WEEKS=10
# Nombre de jours à conserver
KEEP_DAYS=10
# Filtre de recherche
FILE_FILTER="srv*img.gz"
# Recuperation numero du jour de semaine
DAY_OF_WEEK=`date +%u`

# Inscription du début de la sauvegarde dans le syslog
echo '*** BACKUP CARTE SD SUR FREEBOX DEBUT : '$DATE_BCK' ***'
/usr/bin/logger '*** BACKUP CARTE SD SUR FREEBOX DEBUT : '$DATE_BCK' ***'

# montage du disque dur Freebox
if ! mountpoint -q /mnt/freebox ; then
/bin/mount ${MOUNT_PATH}
if [ $? -ne 0 ]; then
echo '*** BACKUP CARTE SD SUR FREEBOX ERREUR MONTAGE DISQUE ***'
/usr/bin/logger '*** BACKUP CARTE SD SUR FREEBOX ERREUR MONTAGE DISQUE ***'
exit 1
fi
fi

# Sauvegarde sur le disque externe USB Freebox
echo "Sauvegarde sur la Freebox"
if [ $DAY_OF_WEEK -eq "1" ];then
echo "Sauvegarde hebdomadaire"
ls -1t ${MOUNT_PATH}${SAVE_PATH_WEEK}${FILE_FILTER} | tail -n +$KEEP_WEEKS | xargs rm -rf
dd if=/dev/mmcblk0 | gzip -9 > ${MOUNT_PATH}${SAVE_PATH_WEEK}srv-domoticz-${DATE_BCK}.img.gz
else
echo "Sauvegarde journalière"
ls -1t ${MOUNT_PATH}${SAVE_PATH_DAY}${FILE_FILTER} | tail -n +$KEEP_DAYS | xargs rm -rf
dd if=/dev/mmcblk0 | gzip -9 > ${MOUNT_PATH}${SAVE_PATH_DAY}srv-domoticz-${DATE_BCK}.img.gz
fi

# umount du disque dur Freebox
/bin/umount ${MOUNT_PATH}
if [ $? -ne 0 ]; then
echo '*** BACKUP CARTE SD SUR FREEBOX ERREUR DEMONTAGE DISQUE ***'
/usr/bin/logger '*** BACKUP CARTE SD SUR FREEBOX ERREUR DEMONTAGE DISQUE ***'
fi

# Formatage de la date et inscription de la fin de la sauvegarde dans le syslog
DATE_FIN=`date +%d-%m-%Y-%Hh%M`
echo '*** BACKUP CARTE SD SUR FREEBOX FIN : '$DATE_FIN' ***'
/usr/bin/logger '*** BACKUP CARTE SD SUR FREEBOX FIN : '$DATE_FIN' ***'
Ne pas oublier de rendre le script executable par un chmod +x
Vous pouvez le tester manuellement avec un sudo ./backup.sh
Il est aisé de consulter si l'opération s'est bien passée en consultant le syslog.
pi@raspberrypi-sz ~ $ cat /var/log/syslog.1 | grep BACKUP
Feb 28 01:15:01 raspberrypi-sz logger: *** BACKUP CARTE SD SUR FREEBOX DEBUT : 28-02-2015-01h02 ***
Feb 28 02:11:14 raspberrypi-sz logger: *** BACKUP CARTE SD SUR FREEBOX FIN : 28-02-2015-02h02 ***

4) Le crontab root lançant la sauvegarde une fois par nuit à 1h00 (je l'adapterai sûrement)
0 1 * * * /home/pi/domoticz/scripts/backup.sh

La taille du fichier de sauvegarde compressé fait 1.3Go