Sauvegardes…🔗

Posted by Médéric Ribreux 🗓 In blog/ Sysadmin/

#sysadmin #backup #security

Maintenant que je dispose d'un vrai blog et d'un vrai outil de gestion de photos en ligne, que le tout fonctionne correctement, il ne faut pas que j'oublie la partie sauvegarde… Ça serait bête de tout avoir à recommencer "from scratch…"

Sauvegarde du blog

L'objectif est de permettre de récupérer les informations importantes du blog, aussi bien les données (le corps des billets) que les documents téléchargés. Pour rappel, dans ma configuration, Serendipity utilise une base de données SQLite.

D'une manière générale, je poserai les fichiers de sauvegarde dans /opt/backup, répertoire qu'il faudra auparavant créer par l'utilisateur root en ayant soin de rendre le répertoire inaccessible à toute autre personne que l'utilisateur root:

mkdir /opt/backup
chmod 700 /opt/backup

Les photos étant des fichiers assez volumineux, j'utiliserai au maximum la compression bzip2 qui donne d'excellents résultats (bon c'est compensé par une super lenteur lors de la compression/décompression mais ici, c'est bien l'objectif de place qui est priorisé). Le paquet bzip2 est donc indispensable: aptitude install bzip2.

Sauvegarde de la base de données

Les bases de données SQLite sont constituées d'un simple fichier où il y a tout dedans. Le concept est simple. Si la base de données n'est pas en fonctionnement, il suffit de copier le fichier pour faire une sauvegarde. Dans le cas de Serendipity, le fichier est /var/lib/dbconfig-common/sqlite3/serendipity/serendipity.

En étant prévoyant, je préfère les exports SQL. Pour cela, il nous faut un outil de base: sqlite3 qui est une interface en ligne de commande pour attaquer une DB SQLite V3. L'installation est assez simple: aptitude install sqlite3.

Ensuite, l'export SQL peut se faire par la commande suivante:

echo '.dump' | sqlite3 /var/lib/dbconfig-common/sqlite3/serendipity/serendipity | bzip2 -c > /opt/backup/serendipity.sql.bz2

Sauvegarde des fichiers

Mon but est de sauvegarder les fichiers uploadés sur le serveur ainsi que les fichiers de configuration. Les fichiers uploadés se trouvent dans /var/lib/serendipity/uploads et les fichiers de conf dans /etc/serendipity. Classiquement sous GNU/Linux (et sans doute sous Unix), on utilise la commande tar pour faire ça:

cd / ; /bin/tar -cjf /opt/backup/serendipity_conf.tar.bz2 etc/serendipity
cd / ; /bin/tar -cjf /opt/backup/serendipity_upload.tar.bz2 var/lib/serendipity/uploads

Sauvegarde des galeries d'images

Je ne vais pas revenir sur les explications antérieures sur les sauvegardes, sauvegarder Gallery signifie:

Voyons comment on fait pour tout:

cd /; /bin/tar -cjf /opt/backup/gallery_conf.tar.bz2 etc/gallery
cd /; /bin/tar -cjf /opt/backup/gallery_albums.tar.bz2 var/www/albums

Automatisation de tout ça !

Maintenant que nous disposons de tout ce qu'il nous faut, autant automatiser cette tache pour ne pas l'oublier. Sous GNU/Linux, on utilise généralement une tache cron pour ça. Vu le peu de stress et d'activité d'un blog ou d'un site Gallery, mon avis est qu'une sauvegarde par semaine sera largement suffisante.

Nous allons donc utiliser le script Bash suivant pour la sauvegarde:

#!/bin/sh
# Script de sauvegarde de Serendipity et de Gallery
#

# Serendipity:
echo '.dump' | sqlite3 /var/lib/dbconfig-common/sqlite3/serendipity/serendipity | bzip2 -c > /opt/backup/serendipity.sql.bz2
cd / ; /bin/tar -cjf /opt/backup/serendipity_conf.tar.bz2 etc/serendipity
cd / ; /bin/tar -cjf /opt/backup/serendipity_upload.tar.bz2 var/lib/serendipity/uploads

# Gallery:
cd / ; /bin/tar -cjf /opt/backup/gallery_conf.tar.bz2 etc/gallery
cd /; /bin/tar -cjf /opt/backup/gallery_albums.tar.bz2 var/www/albums

Nous nommerons ce script /etc/cron.weekly/backup et nous n'oublierons pas de le rendre exécutable (sinon, il n'est pas lancé par cron): chmod 700 /etc/cron.weekly/backup.

Reste enfin à vérifier quand est lancée la sauvegarde hebdomadaire. Le fichier /etc/crontab nous permet de répondre à cette question:

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Ce fichier nous montre que tous les scripts situés dans /etc/cron.weekly sont exécutés via run-parts (un script de lancement de scripts) à 6H47 tous les dimanches par défaut. Pour ma part, je préfère lancer tout ça le vendredi à 12H05. Voici donc ma ligne à moi:

05 12    * * 5   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )

Enfin, ne pas oublier de relancer le service cron (enfin je ne suis pas sûr que cela soit nécessaire mais dans le doute, ça ne coute pas grand-chose): /etc/init.d/cron restart.

Récupérer la sauvegarde sur un ordinateur distant

Nous venons d'automatiser la sauvegarde sur le serveur. Cette sauvegarde va nous permettre de remettre en fonctionnement le site assez rapidement en cas de corruption de données. Toutefois, si le disque du serveur crame, nous voilà dans de beaux draps…

Pour cela, on peut utiliser scp ou encore rsync. On peut imaginer d'autres solutions sur du téléchargement par http en mode sécurisé dont l'URL aurait été envoyée par e-mail… On verra toutes ces solutions dans un prochain billet, c'est un autre projet.

Et la restauration ?

C'est très bien de récupérer des données, encore est-il plus intéressant de les restaurer en cas de besoin. Voici quelques commandes qui nous permettent d'aller plus vite:

Restauration:

rm -r /var/lib/dbconfig-common/sqlite3/serendipity/serendipity && bzcat /opt/backup/serendipity.sql.bz2 | sqlite3 /var/lib/dbconfig-common/sqlite3/serendipity/serendipity
cd / ; /bin/tar -xjf /opt/backup/serendipity_conf.tar.bz2
cd / ; /bin/tar -xjf /opt/backup/serendipity_upload.tar.bz2
cd / ; /bin/tar -xjf /opt/backup/gallery_conf.tar.bz2
cd /; /bin/tar -xjf /opt/backup/gallery_albums.tar.bz2