Comment faire une sauvegarde incrémentale de WordPress : backup des fichiers

Je vous présente un tutoriel pour faire une sauvegarde incrémentale des dossiers et fichiers de WordPress entre deux serveurs Linux, en utilisant rsync dans un script bash. Et comment créer automatiquement plusieurs archives.
Dans ce tutoriel vous verrez l’utilisation de : Script bash, rsync, tar, find.

Préparation de la connexion et création des clés SSH

Afin de ne pas devoir à chaque fois entrer manuellement un mot de passe, je vais créer des clés SSH. Je me place sur le serveur qui va me servir de serveur de sauvegarde (backup). Et j’utilise la commande ssh-keygen pour créer mes clés privées et publiques. À faire qu’une seule fois.

Puis avec la commande ssh-copy-id, je vais copier la clé publique sur le serveur cible (le serveur où il y a les données à sauvegarder). Ici, il va demander de confirmer l’authenticité du serveur cible, vous validez. Puis vous entrez son mot de passe (vous n’aurez plus à le faire par la suite).

Pour tester, je lance une commande à distance uname avec SSH, il ne devrait pas me demander de mot de passe.

# Copy ssh key
# ------------
# -e "ssh -p22 -oHostKeyAlgorithms=+ssh-dss"
ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub root@81.28.97.137
ssh root@81.28.97.137 "uname"

Création du script Bash pour faire une sauvegarde incrémentale

Je vais me placer dans mon dossier de travail, où sera créé le script Bash.
cd /root/tuto/rsync et je vais commencer par entrer mes commandes.

#!/bin/bash
# rsync-inc.sh v1 Incremental backup wordpress directory

# Code
# ----

Dans un premier temps j’indique la variable SERVEUR qui va être l’adresse IP (ou cela peut-être un nom) de la machine où je dois récupérer le dossier WordPress, puis le chemin avec la variable BACKUP où seront synchronisé les données sur le serveur de backup.

Ensuite pour l’incrémentation des sauvegardes, je vais indiquer dans la variable BACKUPDATE d’afficher la date du jour avec l’heure, qui va changer à chaque fois que le script est exécuté, sous cette forme annéemoisjour-heureminute avec la commande date.

Les variables

SERVEUR='81.28.97.137'
BACKUP='/home/backup'
BACKUPDATE=$(date +"%Y%m%d-%H%M")

je vous montre en ligne de commande, avec un echo, ce que donne la variable BACKUPDATE.

echo $(date +"%Y%m%d-%H%M")
20190313-1747

Je vais créer le dossier de la variable BACKUP s’il n’existe pas, en utilisant ! -d. Puis dans l’ordre, création du dossier, attribution de l’user et group root et droit du dossier (drw——-). Le && indique un ET (= si l’opération c’est bien déroulé, continuer).

[ ! -d $BACKUP ] && mkdir $BACKUP && chown 0.0 $BACKUP && chmod 600 $BACKUP

Copie synchronisée

Maintenant je peux faire la copie entre les deux serveurs de mon dossier WordPress, en utilisant la commande rsync. Sur cet autre article rsync-options-pratiques que j’ai écrit, vous retrouvez les explications sur les options les plus pratiques de rsync.

Ici, je dis à rsync de se connecter sur le port 22, de conserver les ID d’origine avec l’option --numeric-ids et de supprimer les dossiers et les fichiers sur la sauvegarde, s’ils n’existent plus dans le dossier d’origine, avec l’option --delete.

Si vous avez une erreur de connexion avec d’ancien serveur ssh, vous pouvez ajouter cette option -e "ssh -p22 -oHostKeyAlgorithms=+ssh-dss".

echo "Rsync..."
rsync -az -e 'ssh -p22' --numeric-ids --delete root@$SERVEUR:/var/www/wordpress $BACKUP

Création des archives compressées

Ensuite, je vais créer les archives incrémentales avec la commande tar et find pour supprimer les archives qui sont plus anciennes de 30 jours.

Je vais dans le dossier BACKUP pour que l’archive une fois créée est comme chemin uniquement wordpress, comme cela c’est plus simple à réutiliser lors d’une décompression. Et je crée l’archive compressée (cfz) en utilisant dans le nom, la variable BACKUPDATE définie plus haut.

Maintenant avec find, je vais lui indiquer d’effacer tous les fichiers qui commencent par « wordpress- » et avec mtime +30 qui sont plus vieux de 30 jours. -maxdepth indique de ne pas traiter les répertoires et -f de ne prendre en compte que les fichiers. Et j’envoie le résultat de la commande find avec un pipe | xorgs vers la commande rm, pour les effacer.

echo "Archive..."
cd $BACKUP
tar cfz wordpress-$BACKUPDATE.tar.gz wordpress

find $BACKUP -maxdepth 1 -type f -name 'wordpress-*' -mtime +30 | xargs rm -vf

Vérifier que les anciennes archives seront bien supprimées

Si vous voulez faire cette vérification tout de suite, on peut changer la date d’un fichier et lancer la commande find ci-dessus. Pour cela, j’utilise la commande touch et le nom du fichier.

Par exemple, je veux lui dire de rendre mon fichier plus vieux de 31 jours avec cette commande :
touch -d "31 days ago" wordpress-20190313-1747.tar.gz

Définir une tâche automatisée du backup de wordpress

On peut maintenant ajouter ce script de sauvegarde dans un crontab pour l’automatiser. J’édite le fichier /etc/crontab et je rentre dans l’ordre, de lancer le script à 5 heures du matin et cela tous les jours (* * *), avec l’utilisateur root, d’exécuter la commande /root/tuto/rsync/rsync-inc.sh et d’envoyer le résultat (s’il y a une sortie texte) vers un périphérique vide (/dev/null) afin d’éviter par exemple de recevoir un e-mail à chaque exécution.

mcedit /etc/crontab
00 5    * * *   root    /root/tuto/rsync/rsync-inc.sh >/dev/null


Le script Bash utilisé dans ce tuto

Je vous mets, ci-dessous, le code source du script de sauvegarde.

#!/bin/bash
# rsync-inc.sh v1 Incremental backup wordpress directory

# Copy ssh key
# ------------
# ssh-keygen -t rsa
# ssh-keygen -f "/root/.ssh/known_hosts" -R "81.28.97.137"
# ssh-copy-id -i /root/.ssh/id_rsa.pub root@81.28.97.137
# ssh root@81.28.97.137 "uname"
# -e "ssh -p22 -oHostKeyAlgorithms=+ssh-dss"

# DEV
# ----
# cd /root/tuto/rsync
# Test old backup
# touch -d "31 days ago" wordpress-___.tar.gz

# Code
# ----
SERVEUR='81.28.97.137'
BACKUP='/home/backup'
BACKUPDATE=$(date +"%Y%m%d-%H%M")

[ ! -d $BACKUP ] && mkdir $BACKUP && chown 0.0 $BACKUP && chmod 600 $BACKUP

echo "Rsync..."
rsync -az -e 'ssh -p22' --numeric-ids --delete root@$SERVEUR:/var/www/wordpress $BACKUP

echo "Archive..."
cd $BACKUP
tar cfz wordpress-$BACKUPDATE.tar.gz wordpress

find $BACKUP -maxdepth 1 -type f -name 'wordpress-*' -mtime +30 | xargs rm -vf