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 A EDITER !!
SRC="/srv/Files/"
DEST=REMOTE_USER="root@IP_MACHINE_B:root"
REMOTE_HOST="192.168.1.104"
REMOTE="$REMOTE_USER@$REMOTE_HOST"
REMOTE_BASE="/srv/dev-disk-by-uuid-2da450f2-4dde-4234-8a5a-2011f9145fee/Backup/Shuttle"
SSH_KEY="/root/.ssh/shuttle-alphavps"transporter"
#
TODAY=$(date +%Y-%m-%d)
WEEK=$(date +%Y-%V)
MONTH=$(date +%Y-%m)
# Exclusions #EXCLUDES=(si #besoin)
EXCLUDES=( "--exclude=/srv/Files/subfolder/subsubfolder/QBittorrentVPN/downloads/" #)
# Fonction pour créer les dossiers sur la machine B)
create_remote_dirs() {
/usr/bin/ssh -i "$SSH_KEY" root@IP_MACHINE_B"$REMOTE" "mkdir -p /srv/Backup/Shuttle/$REMOTE_BASE/daily /srv/Backup/Shuttle/$REMOTE_BASE/weekly /srv/Backup/Shuttle/$REMOTE_BASE/monthly"
}
# Fonction de backup
backup() {
local TYPE=$1
# daily / weekly / monthly
local NAME=$2
local DEST_DIR="$DEST/{REMOTE_BASE}/$TYPE/{TYPE}/$NAME"{NAME}" # Chercherchemin côté distant (absolu)
local DEST_RSYNC="${REMOTE}:${DEST_DIR}" # destination Rsync (user@host:/path)
# trouver la dernière sauvegarde existantecôté pour ce typedistant
local LAST_BACKUP
LAST_BACKUP=$(ssh -i "$SSH_KEY" root@IP_MACHINE_B"$REMOTE" "ls -1t /srv/Backup/Shuttle/$REMOTE_BASE/$TYPE 2>/dev/null | head -n 1") || true)
echo "Backup $TYPE vers-> $DEST_DIR...DEST_RSYNC (link-dest -> $LAST_BACKUP)"
if [ -n "$LAST_BACKUP" ]; then
/usr/bin/# link-dest doit être un chemin tel qu'il est vu sur la machine distante
rsync -avz -e "ssh -i $SSH_KEY" \
--delete \
--link-dest="/srv/Backup/Shuttle/$TYPE/$LAST_BACKUP" \
"$SRC" "$DEST_DIR"
else
/usr/bin/rsync -avzaHvz -e "ssh -i $SSH_KEY" \
--delete \
"${EXCLUDES[@]}" \
--link-dest="$REMOTE_BASE/$TYPE/$LAST_BACKUP" \
"$SRC" "$DEST_DIR"DEST_RSYNC"
else
rsync -aHvz -e "ssh -i $SSH_KEY" \
--delete \
"${EXCLUDES[@]}" \
"$SRC" "$DEST_RSYNC"
fi
}
# Fonctionmettre à jour le mtime du dossier de rotationbackup baséepour suréviter findqu'il (duréesoit enconsidéré jours)comme "ancien"
ssh -i "$SSH_KEY" "$REMOTE" "mkdir -p '$DEST_DIR' && touch '$DEST_DIR'"
}
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"$REMOTE" "
find /srv/Backup/Shuttle/'$TYPEREMOTE_BASE/$TYPE' -mindepth 1 -maxdepth 1 -type d -mtime +$MAX_AGE -print -exec rm -rf {} \;
"
}
# -------------------------
# 0 Créer les dossiers parents sur la machine Brun
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