"Les données n'existent pas tant qu'elles ne sont pas sauvegardées à deux endroits différents." Un crash disque ou une erreur humaine (rm -rf /) arrive sans prévenir. Voici comment créer un script robuste qui sauvegarde, compresse, et nettoie vos anciennes archives automatiquement.
1. La stratégie (Règle 3-2-1)
Avant de coder, rappelons la base. Une sauvegarde locale sur le même disque ne protège pas contre un crash matériel ou un incendie. L'idéal est :
- 3 copies de vos données.
- 2 supports différents (Disque local + NAS/Cloud).
- 1 copie hors site (Offsite).
2. Le Script de Sauvegarde (Bash)
Nous allons créer un script qui :
- Crée une archive datée du dossier
/var/www/html(Site Web). - Exporte la base de données MySQL.
- Supprime les sauvegardes vieilles de plus de 7 jours (Rotation).
Créez le fichier : nano /root/backup-auto.sh
#!/bin/bash
# --- VARIABLES DE CONFIGURATION ---
BACKUP_DIR="/var/backups/monsite"
SOURCE_DIR="/var/www/html"
DB_NAME="wordpress"
DB_USER="root"
DB_PASS="votre_mot_de_passe"
DATE=$(date +%F_%H-%M-%S) # Format: AAAA-MM-JJ_HH-MM-SS
# Création du dossier de backup s'il n'existe pas
mkdir -p $BACKUP_DIR
echo "--- Démarrage du backup : $DATE ---"
# 1. Sauvegarde des Fichiers (tar)
# -c: create, -z: gzip, -p: preserve permissions, -f: file
tar -czpf $BACKUP_DIR/files-$DATE.tar.gz $SOURCE_DIR 2>/dev/null
if [ $? -eq 0 ]; then
echo "[OK] Fichiers sauvegardés."
else
echo "[ERREUR] Échec de la sauvegarde fichiers."
fi
# 2. Sauvegarde de la Base de Données (mysqldump)
mysqldump -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/db-$DATE.sql
gzip $BACKUP_DIR/db-$DATE.sql # On compresse le SQL
if [ $? -eq 0 ]; then
echo "[OK] Base de données exportée."
else
echo "[ERREUR] Échec de l'export SQL."
fi
# 3. Rotation (Suppression des vieux fichiers > 7 jours)
find $BACKUP_DIR -type f -name "*.gz" -mtime +7 -delete
echo "--- Backup terminé. Nettoyage effectué. ---"
N'oubliez pas de rendre le script exécutable (sinon le Cron échouera) :
chmod +x /root/backup-auto.sh
-mtime +7 dans la commande find est cruciale. Sans elle, votre disque dur finirait par être saturé par des milliers de sauvegardes. C'est ce qu'on appelle la politique de rétention.
3. Automatisation avec Cron
Nous voulons que ce script s'exécute toutes les nuits à 03h00 du matin (heure creuse).
Ouvrez l'éditeur Cron :
crontab -e
Ajoutez cette ligne à la fin :
0 3 * * * /root/backup-auto.sh >> /var/log/backup.log 2>&1
Explication :
0 3 * * *: À 03h00, tous les jours.>> /var/log/backup.log: Redirige la sortie (les 'echo') vers un fichier log pour vérifier si tout s'est bien passé le lendemain.2>&1: Redirige aussi les erreurs vers ce même fichier log.
4. Externalisation (Le "+1")
Pour respecter la règle 3-2-1, il faut envoyer ce fichier ailleurs. Le plus simple est d'utiliser rsync vers un autre serveur ou un NAS à la fin du script :
# À ajouter à la fin du script
rsync -avz -e ssh $BACKUP_DIR/ user@serveur-distant:/home/user/backups/
5. Tester la restauration
"Une sauvegarde non testée n'est pas une sauvegarde."
Pour restaurer, il suffit de faire l'inverse :
# Restaurer les fichiers
tar -xzf files-2023-XX-XX.tar.gz -C /
# Restaurer la base de données
gunzip < db-2023-XX-XX.sql.gz | mysql -u root -p wordpress