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 journaliere, hebdo, mensuelle
# Source : /srv/Files/ (Machine A)
# Destination : /srv/Backup/Shuttle/ (Machine B)

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

SRC="/srv/Files/"
DEST="root@IP_MACHINE_B:/srv/Backup/Shuttle"
SSH_KEY="$HOME/.ssh/shuttle_key"

TODAY=$(date +%Y-%m-%d)
WEEK=$(date +%Y-%V)
MONTH=$(date +%Y-%m)

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"
}

backup() {
    local TYPE=$1
    local DEST_DIR="$DEST/$TYPE/$2"
    echo "Backup $TYPE vers $DEST_DIR..."
    /usr/bin/rsync -avz -e "ssh -i $SSH_KEY" --delete "$SRC" "$DEST_DIR"
}

rotate() {
    local TYPE=$1
    local KEEP=$2
    local PATH="$DEST/$TYPE"

    VERSIONS=$(/usr/bin/ssh -i "$SSH_KEY" root@IP_MACHINE_B "ls -1 $PATH 2>/dev/null | sort")
    COUNT=$(/usr/bin/echo "$VERSIONS" | /usr/bin/wc -l)
    if [ "$COUNT" -gt "$KEEP" ]; then
        REMOVE=$(/usr/bin/echo "$VERSIONS" | /usr/bin/head -n $(($COUNT - $KEEP)))
        for OLD in $REMOVE; do
            echo "Suppression ancienne version $TYPE : $OLD"
            /usr/bin/ssh -i "$SSH_KEY" root@IP_MACHINE_B "rm -rf $PATH/$OLD"
        done
    fi
}

# Création des dossiers parents si besoin
create_remote_dirs

# Backup quotidien
backup "daily" "$TODAY"

# Backup hebdomadaire (dimanche)
if [ "$(date +%u)" -eq 7 ]; then
    backup "weekly" "$WEEK"
fi

# Backup mensuel (1er du mois)
if [ "$(date +%d)" -eq 1 ]; then
    backup "monthly" "$MONTH"
fi

# Rotation : garder 7 derniers jours, 4 dernieres semaines, 3 derniers mois
rotate "daily" 7
rotate "weekly" 4
rotate "monthly" 3

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 caracteres spéciaux

  • Connexion SSH sécurisée et sans mot de passe