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