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
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Variables A EDITER !!
SRC="/srv/Files/"
REMOTE_USER="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-transporter"
#
TODAY=$(date +%Y-%m-%d)
WEEK=$(date +%Y-%V)
MONTH=$(date +%Y-%m)
# Exclusions (si besoin)
EXCLUDES=( "--exclude=QBittorrentVPN/downloads/" )
create_remote_dirs() {
ssh -i "$SSH_KEY" "$REMOTE" "mkdir -p $REMOTE_BASE/daily $REMOTE_BASE/weekly $REMOTE_BASE/monthly"
}
backup() {
local TYPE=$1
local NAME=$2
local DEST_DIR="${REMOTE_BASE}/${TYPE}/${NAME}" # chemin côté distant (absolu)
local DEST_RSYNC="${REMOTE}:${DEST_DIR}" # destination Rsync (user@host:/path)
# trouver la dernière sauvegarde côté distant
local LAST_BACKUP
LAST_BACKUP=$(ssh -i "$SSH_KEY" "$REMOTE" "ls -1t $REMOTE_BASE/$TYPE 2>/dev/null | head -n 1" || true)
echo "Backup $TYPE -> $DEST_RSYNC (link-dest -> $LAST_BACKUP)"
if [ -n "$LAST_BACKUP" ]; then
# link-dest doit être un chemin tel qu'il est vu sur la machine distante
rsync -aHvz -e "ssh -i $SSH_KEY" \
--delete \
"${EXCLUDES[@]}" \
--link-dest="$REMOTE_BASE/$TYPE/$LAST_BACKUP" \
"$SRC" "$DEST_RSYNC"
else
rsync -aHvz -e "ssh -i $SSH_KEY" \
--delete \
"${EXCLUDES[@]}" \
"$SRC" "$DEST_RSYNC"
fi
# mettre à jour le mtime du dossier de backup pour éviter qu'il soit considéré comme "ancien"
ssh -i "$SSH_KEY" "$REMOTE" "mkdir -p '$DEST_DIR' && touch '$DEST_DIR'"
}
rotate() {
local TYPE=$1
local MAX_AGE=$2
echo "Rotation $TYPE : suppression des backups plus vieux que $MAX_AGE jours..."
ssh -i "$SSH_KEY" "$REMOTE" "find '$REMOTE_BASE/$TYPE' -mindepth 1 -maxdepth 1 -type d -mtime +$MAX_AGE -print -exec rm -rf {} \;"
}
# run
create_remote_dirs
backup "daily" "$TODAY"
if [ "$(date +%u)" -eq 7 ]; then
backup "weekly" "$WEEK"
fi
if [ "$(date +%d)" -eq 1 ]; then
backup "monthly" "$MONTH"
fi
rotate "daily" 7
rotate "weekly" 28
rotate "monthly" 90
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
No comments to display
No comments to display