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 :