Sauvegarder son serveur Linux personnel + son mutualisé : the easy way !

Votre serveur va avoir sa première défaillance matérielle dès demain, mais pas de panique ! Je vais vous aider à créer votre premier backup. Les suivants vous offriront d’anciennes versions de vos fichiers.

Bon, pour un ordinateur de bureau, nous avons vu comment réaliser des sauvegardes automatiques au montage d’un périphérique externe. Pour un téléphone, nous avons vu comment synchroniser contacts et calendriers entre Ubuntu Touch et un serveur.

Hélas pour un serveur, c’est une autre paire de manches. Bases de données, mails, fichiers de conf, logiciels installés hors des dépôts, sites web : il y en a partout. Un snapshot du disque serait insuffisant en cas de changement de matériel.

Problématique

Avant de foncer tête baissée, voyons comment ne pas créer les sauvegardes au même endroit que les fichiers originaux :
— Si vous disposez d’un autre serveur, vous pouvez lire ce comparatif d’outils dédiés (voir burp avec son interface ou obnam),
— Mais si vous n’avez qu’un seul serveur, il serait aberrant de perdre l’accès à vos données (résiliation, attaque, panne, etc).

Il faut à mon sens :
— Dans un premier temps, générer puis télécharger les sauvegardes du serveur sur un ordinateur local, hors du Net,
— Dans un second temps, sauvegarder les données du serveur en même temps que celles de l’ordinateur sur un support externe,
— Dans un troisième temps, synchroniser les sauvegardes en ligne, comme avec hubiC.

Bien sûr, tout le monde n’est pas du même avis, avec ce tuto vous pouvez tout autant synchroniser serveur et ordinateur directement vers le service en ligne de votre choix. Moi je considère que mon ordinateur contient une sauvegarde serveur récente. J’utilise ensuite la même solution pour sauvegarder le tout, en conservant différentes versions (états) des fichiers au fil du temps.

1- Plan d’action

Mon but n’est pas d’avoir une remise en service rapide de mon serveur. Si c’était le cas, j’aurais du matériel fiable.

Côté serveur, je réalise donc un script bash, cronné quotidiennement, qui copie en root dans un dossier tout ce que j’ai créé ou modifié. Il donne finalement la propriété du dossier à l’utilisateur autorisé à être utilisé en SSH.

Côté ordinateur, je réalise un second script bash, à exécuter manuellement, qui récupère en local le dossier de sauvegarde du serveur. Il récupère en supplément le contenu d’un serveur FTP sur un hébergement mutualisé.

2- Script de sauvegarde du serveur

Je vous laisse le soin de vous inspirer de mon script afin d’identifier tout ce qui vous importe. Copiez simplement ce qui suit dans un fichier, stocké où bon vous semble, et donnez lui le droit d’exécution.

J’utilise l’option inhabituelle –relative qui copie le chemin absolu d’un dossier, recréant ainsi l’architecture de la distribution dans le dossier de sauvegarde.

#!/bin/bash
# Rappels :
# - le script doit être exécuté en droits root
# - le script ne prend pas en charge les rotations de sauvegardes
# - les fichiers reçoivent à la fin la propriété d'un utilisateur SSH
# - le script ne copie que les fichiers personnalisés, pour les retrouver facilement

nom_utilisateur_ssh="VOTRE_UTILISATEUR"
nom_repertoire="Sauvegarde_serveur"
chemin_repertoire=/home/$nom_utilisateur_ssh/$nom_repertoire
chemin_execution_script=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
options="--delete-excluded --relative --archive --progress"

# Réinitialise le dossier des sauvegardes
cd /home/$nom_utilisateur_ssh
mkdir -p $nom_repertoire

# Sauvegarde le script lui même
rsync $options $chemin_execution_script/script_de_sauvegarde.sh $chemin_repertoire

# Copie les fichiers de configuration
rsync $options /etc/crontab $chemin_repertoire
rsync $options /etc/init.d/regles_iptables $chemin_repertoire
rsync $options /etc/fail2ban/jail.conf $chemin_repertoire
rsync $options /etc/nginx $chemin_repertoire
rsync $options /etc/php5/fpm/pool.d/www.conf $chemin_repertoire
rsync $options /etc/ssh $chemin_repertoire

# Serveur GitLab
cd /home/git/gitlab
sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production
rsync $options /home/git/gitlab-shell/config.yml $chemin_repertoire
rsync $options /home/git/gitlab/config/gitlab.yml $chemin_repertoire # décommenter keep_time, voir la doc
rsync $options /home/git/gitlab/tmp/backups $chemin_repertoire
rsync $options /home/git/gitlab/.secret $chemin_repertoire
rsync $options /home/git/.ssh/config $chemin_repertoire
cd $chemin_repertoire

# Serveur XMPP Metronome
metronomectl stop
rsync $options /etc/metronome $chemin_repertoire
rsync $options /var/lib/metronome $chemin_repertoire
rsync $options /home/$nom_utilisateur_ssh/metronome $chemin_repertoire
metronomectl start

# Serveur web Nginx
rsync $options --exclude=phpmyadmin --exclude=data/cache /var/www $chemin_repertoire

# Base de données MySQL
mysqldump --user="UTILISATEUR" --password="MOT_DE_PASSE" --databases BASE_DE_DONNES > $chemin_repertoire/NOM_FICHIER.sql

# Autres dossiers potentiels
# /home/$nom_utilisateur_ssh/Maildir/
# /home/$nom_utilisateur_ssh/.procmailrc

# Uniformise les droits récursivement, pour permettre le téléchargement
chown -R $nom_utilisateur_ssh:$nom_utilisateur_ssh $chemin_repertoire

3- Script de récupération de la sauvegarde, sur ordinateur

Ce petit bout de script, simplissime, nécessite l’installation du logiciel lftp pour la synchronisation FTP en local. Faire des tests avec lftp vous évitera de perdre vos données réelles.

Attention, contrairement à rsync, lftp ne dispose pas d’une option –delete-excluded ce qui signifie que si vous excluez de nouveaux dossiers, il vous incombe de les supprimer localement.

#!/bin/bash

rsync --delete --archive --progress -e "ssh -p 22" UTILISATEUR@SERVEUR:./Sauvegarde_serveur "/home/UTILISATEUR/"

lftp ftp://NOM_UTILISATEUR:MOT_DE_PASSE@SERVEUR -e "mirror --verbose --delete-first --exclude=data/cache /distant /home/UTILISATEUR/Sauvegarde_FTP/; quit"

Ce script peut comme toujours être automatisé avec crontab pour les évènements temporels, ou avec incrontab pour les évènements déclenchés par le système de fichiers (montage de disque, création ou modification d’un fichier, etc).

Via /etc/crontab :
0 0 * * * * root sh /home/NOM_UTILISATEUR/script_de_sauvegarde.sh >/dev/null 2>&1

Bon à ce stade je vous avoue que j’avais très envie d’achever cet article : pour sauvegarder votre base SQL de mutualisé, vous disposez peut être d’une URL sécurisée à appeler. Si c’est le cas, vous devriez vous en sortir avec curl. Sinon vous devrez chercher la solution qui vous convient (et je vous invite à laisser un commentaire) qui dump votre base dans le langage de votre mutualisé.

4- Chiffrement des sauvegardes

Toute méthode apporte son lot d’avantages et d’inconvénients. Je vous laisse le soin de faire vos propres recherches, sachez simplement qu’il est facile de le faire avec le logiciel Disques sous Ubuntu.

Mes deux sources principales sont cet article du blog de Romain Vimont (®om) pour le script et cet autre article du blog d’Aurélien Maigret (Dewep) pour la partie lftp en plus de ce wiki. Merci à eux pour leur aide précieuse !

Illustration sous CC BY 2.0 réalisée par Torkild Retvedt.