Automatiser la Synchronisation entre Deux Serveurs avec rsync et SSH AVEC VERSIONING
Voici un tuto complet, clair et corrigé, intégrant toutes les leçons tirées de ton expérience : pas d’accents, chemin de clef SSH précisé, création automatique des dossiers, rotation quotidienne/hebdo/mensuelle.
1️⃣ Objectif
Ce guide explique comment synchroniser automatiquement le contenu d’un dossier sur une Machine A vers une Machine B avec :
-
Versioning : daily / weekly / monthly
-
Rotation : suppression automatique des anciennes versions
-
Connexion SSH sans mot de passe
Exemple : copier /srv/Files/ de Machine A vers /srv/Backup/Shuttle/ sur Machine B.
2️⃣ Prérequis
-
Machine A et Machine B accessibles via SSH
-
Rsync installé sur Machine A et Machine B
-
Clé SSH configurée pour un accès sans mot de passe
3️⃣ Etape 1 : Generer une clé SSH sur Machine A
-
Sur Machine A, genere une clé SSH (sans mot de passe pour l’automatisation) :
ssh-keygen -t rsa -b 4096 -f ~/.ssh/shuttle_key -C "backup"
-
Copier la clé publique sur Machine B :
ssh-copy-id -i ~/.ssh/shuttle_key root@IP_MACHINE_B
-
Tester la connexion :
ssh -i ~/.ssh/shuttle_key root@IP_MACHINE_B
-
Tu ne dois plus avoir de demande de mot de passe.
4️⃣ Etape 2 : Préparer les dossiers sur Machine B
-
Rsync a besoin que les dossiers parents existent pour créer les sous-dossiers datés.
-
Sur Machine B, crée les dossiers :
ssh -i ~/.ssh/shuttle_key root@IP_MACHINE_B "mkdir -p /srv/Backup/Shuttle/daily /srv/Backup/Shuttle/weekly /srv/Backup/Shuttle/monthly"
5️⃣ Etape 3 : Script de backup automatisé
Crée un fichier /home/scripts/backup/backup_rsync_to_alphavps.sh sur Machine A :
#!/bin/bash
# --------------------------------------------
# Backup rsync avec rotation journalière, hebdo, mensuelle
# Source : /srv/Files/ (Machine A)
# Destination : /srv/Backup/Shuttle/ (Machine B)
# --------------------------------------------
# PATH pour cron
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Variables
SRC="/srv/Files/"
DEST="root@IP_MACHINE_B:/srv/Backup/Shuttle"
SSH_KEY="/root/.ssh/shuttle-alphavps"
TODAY=$(date +%Y-%m-%d)
WEEK=$(date +%Y-%V)
MONTH=$(date +%Y-%m)
# Fonction pour créer les dossiers sur la machine B
create_remote_dirs() {
/usr/bin/ssh -i "$SSH_KEY" root@IP_MACHINE_B "mkdir -p /srv/Backup/Shuttle/daily /srv/Backup/Shuttle/weekly /srv/Backup/Shuttle/monthly"
}
# Fonction de backup
backup() {
local TYPE=$1 # daily / weekly / monthly
local NAME=$2
local DEST_DIR="$DEST/$TYPE/$NAME"
# Chercher la dernière sauvegarde existante pour ce type
local LAST_BACKUP
LAST_BACKUP=$(ssh -i "$SSH_KEY" root@IP_MACHINE_B "ls -1t /srv/Backup/Shuttle/$TYPE | head -n 1")
echo "Backup $TYPE vers $DEST_DIR..."
if [ -n "$LAST_BACKUP" ]; then
/usr/bin/rsync -avz -e "ssh -i $SSH_KEY" \
--delete \
--link-dest="/srv/Backup/Shuttle/$TYPE/$LAST_BACKUP" \
"$SRC" "$DEST_DIR"
else
/usr/bin/rsync -avz -e "ssh -i $SSH_KEY" \
--delete \
"$SRC" "$DEST_DIR"
fi
}
# Fonction de rotation basée sur find (durée en jours)
rotate() {
local TYPE=$1
local MAX_AGE=$2 # en jours
echo "Rotation $TYPE : suppression des backups plus vieux que $MAX_AGE jours..."
/usr/bin/ssh -i "$SSH_KEY" root@IP_MACHINE_B "
find /srv/Backup/Shuttle/$TYPE -mindepth 1 -maxdepth 1 -type d -mtime +$MAX_AGE -print -exec rm -rf {} \;
"
}
# -------------------------
# 0 Créer les dossiers parents sur la machine B
create_remote_dirs
# 1 Backup quotidien
backup "daily" "$TODAY"
# 2 Backup hebdomadaire (dimanche)
if [ "$(date +%u)" -eq 7 ]; then
backup "weekly" "$WEEK"
fi
# 3 Backup mensuel (1er du mois)
if [ "$(date +%d)" -eq 1 ]; then
backup "monthly" "$MONTH"
fi
# -------------------------
# Rotation : garder les backups récents
rotate "daily" 7 # supprime daily > 7 jours
rotate "weekly" 28 # supprime weekly > 28 jours
rotate "monthly" 90 # supprime monthly > 90 jours
echo "Backup termine."
-
Remplace
IP_MACHINE_Bpar l’IP réelle de la machine B. -
Vérifie que le chemin de la clé SSH correspond à celui généré (
~/.ssh/shuttle_key). -
Le script supprime automatiquement les versions dépassant le quota.
6️⃣ Etape 4 : Rendre le script exécutable
chmod +x /home/scripts/backup/backup_rsync_to_alphavps.sh
7️⃣ Etape 5 : Test manuel
/bin/bash /home/scripts/backup/backup_rsync_to_alphavps.sh
-
Vérifie que les dossiers datés sont créés sur Machine B.
-
Aucun mot de passe ne doit être demandé.
8️⃣ Etape 6 : Automatisation avec cron
-
Exemple : lancer le script tous les jours à 3h :
0 3 * * * /bin/bash /home/scripts/backup/backup_rsync_to_alphavps.sh
-
Avec cette configuration :
-
Backup quotidien →
daily/YYYY-MM-DD -
Backup hebdo →
weekly/YYYY-WW -
Backup mensuel →
monthly/YYYY-MM -
Rotation automatique des anciennes versions
-
✅ Résultat :
-
Copie incrémentielle avec rsync
-
Versioning daily/weekly/monthly
-
Rotation automatique
-
Script robuste pour cron, sans accents ni caractères spéciaux
-
Connexion SSH sécurisée et sans mot de passe