Skip to main content

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

  1. 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"
  1. Copier la clé publique sur Machine B :

ssh-copy-id -i ~/.ssh/shuttle_key root@IP_MACHINE_B
  1. 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_B par 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