Sauvegarde automatisée d'une application web sur un RaspberryPi avec rsync

Sauvegarde automatisée d'une application web avec rsync sur Linux Debian

Publié le 28/10/2015

On souhaite automatiser la sauvegarde d'une application web. La sauvegarde va concerner la base de donnée et les médias. On part du principe qu'on à un serveur dédié Linux Debian à sauvegarder et que l'on dispose d'un RaspberryPi comme serveur de sauvegarde. On va ajouter à ce dernier un disque externe sur lequel on va réaliser les sauvegardes. Puis on va ajouter un notification Slack à la fin du script de sauvegarde.

1 - Config du serveur hébergeant le site

1.1 - Installation de rsync

sudo apt-get install rsync

Configuration de rsync :

sudo nano /etc/rsyncd.conf

uid = root
gid = root
strict modes = no

Création du dossier de destination de sauvegarde et ajout des autorisations pour l'utilisateur courant :


sudo mkdir /home/user/backup /home/user/backup/mysql/ /home/user/backup/medias/
sudo chown -R user /home/USER/backup
sudo chmod -R 660 /home/USER/backup

1.2 - Création du webhook Slack

A l'adresse : slack.com/apps

On va dans "Configure", puis dans l'onglet "Custom Integrations" on clique sur "Incoming WebHooks", puis "Add Configuration"'. On récupère l'url du webhook pour allez la coller dans la configuration de script de sauvegarde.

1.3 - Création du script bash de sauvegarde


sudo mkdir /var/scripts
sudo nano /var/scripts/backup.sh

#!/bin/bash

#date du jour
DATE=`date +%y_%m_%d_%H%M%S`

#liste des dossier
LISTEBDD=$( echo 'show databases' | mysql -u root -pPASSWORD )

#on boucle sur chaque dossier
for SQL in $LISTEBDD

do

if [ $SQL != "information_schema" ] && [ $SQL != "mysql" ] && [ $SQL != "Database" ] && [ $SQL != "performance_schema" ] && [ $SQL != "test" ]; then

#echo $SQL
mysqldump -u root -pPASSWORD $SQL | gzip > /home/USER/backup/mysql/$SQL"_mysql_"$DATE.sql.gz

fi

done

# backup medias (pour une app Symfony2)
zip -r /home/USER/backup/APP_NAME/APP_NAME_media_$DATE.zip /var/www/app_name/web/uploads

rsync -avp /home/USER/backup/ FQDN_RASPBERRYPI::datadir

rm -rf /home/USER/backup/mysql/*
rm -rf /home/USER/backup/medias/*

curl -X POST -H 'Content-type: application/js:"Backup Done"}' https://hooks.slack.com/services/XXXXXX

Rendre le script exécutable :

sudo chmod +x /var/scripts/backup.sh

2 - Configuration du serveur de sauvegarde

2.1 - Ajout d'un disque externe et formatage

On va ajouter un disque externe non partionné et on va le formatter en ext4. Une fois le disque branché on va lancer la commande fdisk -l pour s'assurer que notre disque est reconnu par l'OS.

sudo fdisk -l

Va apparaitre les informations concernant le disque :


Disk /dev/sda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders, total 156301488 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: 0x00000000

On formate du disque au format ext4 :

sudo mkfs.ext4 /dev/sda

On crée un point de montage :

sudo mkdir /backup

Et on monte le volume sur le point de montage :

sudo mount /dev/sda /backup

On vérifie que notre volume est bien disponible :

df -h

2.2 - Installation et paramétrage de rsync

Installation de rsync :

sudo apt-get install rsync

Une fois l’installation terminé un peu de configuration est à réaliser. Il faut éditer le fichier /etc/default/rsync pour dé-commenter la ligne RSYNC_ENABLE=true.

Configuration de rsyncd.conf :

sudo nano /etc/rsyncd.conf

hosts allow = IP_SERV_1 IP_SERV_2
list = true
uid = root
gid = root
use chroot = false
read only = false

[datadir]
path = /backup/

Note : IP_SERV_2 sera l'IP d'un second serveur à sauvegarder.

Ajout de l'utilisateur rsync :


sudo useradd rsync
sudo passwd rsync
sudo groupadd rsync
sudo usermod -G -a rsync rsync

Redémarrage de rsync :

sudo /etc/init.d/rsync restart

Mise en place des autorisation et droits utilisateurs sur le dossier /backup :


chown -R rsync:rsync /backup
chmod -R 660 /backup

3 - Paramétrage du routeur

On va ajouter une NAT sur le port 873 du routeur de notre LAN où se trouve le RaspberryPi.

4 - Execution automatisée du script sur le serveur web

On exécute le script tous les soir à 2h45 une fois par semaine.

Ajouter dans le crontab :

crontab -e

# m h  dom mon dow   command
45 2 1,7,14,28 * * /var/scripts/backup.sh

On peut exécuter à la main le script de sauvegarde de la façon suivante :

su /var/scripts/backup.sh

5 - Démarrage automatique de Rsync

sudo nano /etc/rc.local Ajouter la ligne suivante :

sudo nano /etc/rc.local

Ressources :

https://api.slack.com/docs/attachments