Sauvegarde Ubuntu → cloud (rclone) – guide complet

🎒 Aujourd’hui, on met en place des sauvegardes automatiques sur Ubuntu (exemple avec MEGA)

Salut ! Aujourd’hui, je vais te montrer pas à pas comment créer une sauvegarde automatique d’un dossier en une seule archive .tar.gz, l’envoyer vers le cloud, garder quelques versions d’historique et relancer ça régulièrement tous les 5 jours. On va prendre MEGA comme exemple, mais la méthode fonctionne aussi avec :

  • Google Drive, Dropbox, OneDrive
  • Backblaze B2, Amazon S3, Scaleway Object Storage, OVH Object Storage
  • WebDAV / Nextcloud (hébergement perso ou mutualisé)

Le tuto est écrit pour un serveur Ubuntu. Tu peux l’adapter à d’autres distributions très facilement.


🧩 Prérequis

  • Accès SSH à ton serveur Ubuntu
  • Un compte cloud (ici MEGA)

1) Installer rclone (version officielle)

On installe rclone depuis le script officiel (il inclut tous les services, dont MEGA) :

sudo apt update
sudo apt remove -y rclone 2>/dev/null || true
sudo snap remove rclone 2>/dev/null || true
sudo -v
curl -fsSL https://rclone.org/install.sh | sudo bash
rclone version
rclone help backends | grep -i mega || echo "MEGA OK si listé ci-dessus"

2) Connecter MEGA à rclone

Lance l’assistant et suis les invites :

rclone config
# n → New remote
# name > mega
# Storage > mega
# user > VOTRE_EMAIL_MEGA
# pass > VOTRE_MOT_DE_PASSE_MEGA
# Edit advanced config? (y/n) > n
# y pour confirmer
# q pour quitter

Crée le dossier côté MEGA (une seule fois) :

rclone mkdir "mega:/DiscutBackups/MonProjet"

3) Préparer l’arborescence locale

mkdir -p ~/bin ~/backups/generiques ~/logs

4) Créer le script de sauvegarde

Important : remplace utilisateur par ton nom d’utilisateur Linux et DossierASauvegarder par le dossier (ou fichier) que tu veux vraiment sauvegarder (ex. /home/paul/www).

nano ~/bin/backup_to_mega.sh

Colle le contenu suivant (complet) :

#!/usr/bin/env bash
set -euo pipefail

# ========= CONFIG =========
# >> Remplace /home/utilisateur/DossierASauvegarder par TON chemin
SOURCES=(
  "/home/utilisateur/DossierASauvegarder"
)
# Exemples supplémentaires (décommente et adapte si besoin) :
# SOURCES+=("/home/utilisateur/Documents")
# SOURCES+=("/home/utilisateur/ma_base/fichier.db")

# Exclusions (optionnel) — exemples :
# EXCLUDES=("/home/utilisateur/DossierASauvegarder/logs/*" "/home/utilisateur/DossierASauvegarder/tmp/*")
EXCLUDES=()

# Dossiers locaux pour les archives et les logs
LOCAL_DEST="/home/utilisateur/backups/generiques"
LOGDIR="/home/utilisateur/logs"
LOCKFILE="/tmp/backup-generic.lock"

# Dossier de destination sur MEGA (à adapter si besoin)
REMOTE_MEGA="mega:/DiscutBackups/MonProjet"

# Fréquence & rétention
INTERVAL_DAYS=5           # <-- Sauvegarde tous les 5 jours
RETENTION_LOCAL_DAYS=14   # ~ 2 semaines en local
RETENTION_MEGA_DAYS=60    # ~ 2 mois sur MEGA
# ========= FIN CONFIG =========

DATE="$(date +'%Y-%m-%d_%H-%M-%S')"
HOST="$(hostname -s)"
TMPDIR="$(mktemp -d)"
ARCHIVE="$TMPDIR/backup_${HOST}_${DATE}.tar.gz"
LOGFILE="$LOGDIR/backup-generic.log"

log(){ echo "[$(date +'%F %T')] $*" | tee -a "$LOGFILE" ; }
cleanup(){ rm -rf "$TMPDIR"; rm -f "$LOCKFILE"; }
trap cleanup EXIT

# Anti double-exécution
if [ -e "$LOCKFILE" ]; then
  log "Un backup semble déjà en cours (lock). Abandon."
  exit 1
fi
echo $$ > "$LOCKFILE"

mkdir -p "$LOCAL_DEST" "$LOGDIR"

# Ne lance que si > INTERVAL_DAYS depuis le dernier backup (sauf FORCE=1)
if [ "${FORCE:-0}" != "1" ]; then
  if find "$LOCAL_DEST" -maxdepth 1 -type f -name "backup_*.tar.gz" -mtime -${INTERVAL_DAYS} | grep -q .; then
    log "Dernier backup < ${INTERVAL_DAYS} jours ⇒ on saute (utilise FORCE=1 pour forcer)."
    exit 0
  fi
fi

# Vérif des sources (on log mais on continue)
MISSING=0
for p in "${SOURCES[@]}"; do
  if [ ! -e "$p" ]; then log "AVERTISSEMENT: source introuvable: $p"; MISSING=1; fi
done
[ "$MISSING" -ne 0 ] && log "NB: OK si certains chemins ne sont pas présents."

# Préparer exclusions tar
TAR_EXCLUDES=()
for e in "${EXCLUDES[@]}"; do TAR_EXCLUDES+=( "--exclude=$e" ); done

# Archive + compression (1 seul fichier .tar.gz)
log "Compression des sources…"
tar -czf "$ARCHIVE" --absolute-names --ignore-failed-read --warning=no-file-changed \
  "${TAR_EXCLUDES[@]}" "${SOURCES[@]}" 2>>"$LOGFILE"

SIZE="$(du -h "$ARCHIVE" | awk '{print $1}')"
log "Archive créée: $(basename "$ARCHIVE") ($SIZE)"

# Copie locale + rotation
LOCAL_FILE="$LOCAL_DEST/$(basename "$ARCHIVE")"
cp -f "$ARCHIVE" "$LOCAL_FILE"
log "Copie locale -> $LOCAL_FILE"

log "Rotation locale > ${RETENTION_LOCAL_DAYS} jours…"
find "$LOCAL_DEST" -type f -name "backup_*.tar.gz" -mtime +$RETENTION_LOCAL_DAYS -print -delete \
  | sed 's/^/Supprimé local: /' | tee -a "$LOGFILE" || true

# Upload vers MEGA
rclone mkdir "$REMOTE_MEGA" >/dev/null 2>&1 || true
log "Upload vers MEGA → $REMOTE_MEGA"
rclone copy "$LOCAL_FILE" "$REMOTE_MEGA" \
  --transfers=2 --checkers=4 --retries=3 --low-level-retries=10 \
  --timeout=5m --contimeout=30s --log-file="$LOGFILE" --log-level=INFO

# Rotation côté MEGA (supprime archives > N jours)
log "Rotation MEGA > ${RETENTION_MEGA_DAYS} jours…"
rclone delete "$REMOTE_MEGA" --min-age ${RETENTION_MEGA_DAYS}d --log-file="$LOGFILE" --log-level=INFO || true
rclone rmdirs "$REMOTE_MEGA" --leave-root --log-file="$LOGFILE" --log-level=INFO || true

log "Backup MEGA terminé ✅"

Dans nano : Ctrl+O (Entrée) pour sauvegarder, puis Ctrl+X pour quitter.

5) Donner les droits + lancer une 1ère sauvegarde

chmod +x ~/bin/backup_to_mega.sh
# Forcer une 1ère sauvegarde (ignore l'intervalle 5 jours)
FORCE=1 ~/bin/backup_to_mega.sh

6) Vérifier

tail -n 120 ~/logs/backup-generic.log
rclone ls "mega:/DiscutBackups/MonProjet" | tail

7) Planifier (cron quotidien — le script ne sauvegarde que tous les 5 jours)

( crontab -l 2>/dev/null; echo "12 3 * * * PATH=/usr/local/bin:/usr/bin:/bin /home/utilisateur/bin/backup_to_mega.sh" ) | crontab -
crontab -l

📦 Exemples pratiques

  • Sauvegarder un seul fichier :
    SOURCES+=("/home/utilisateur/ma_base/fichier.db")
  • Plusieurs dossiers :
    SOURCES+=("/home/utilisateur/Documents")
    SOURCES+=("/home/utilisateur/www")
  • Exclure des logs/temporaires :
    EXCLUDES=("/home/utilisateur/DossierASauvegarder/logs/*" "/home/utilisateur/DossierASauvegarder/tmp/*")
  • Changer le répertoire cloud :
    REMOTE_MEGA="mega:/DiscutBackups/ServeurPerso"
  • Forcer manuellement un backup :
    FORCE=1 ~/bin/backup_to_mega.sh

🛠️ Restauration rapide

# Récupérer une archive depuis MEGA
rclone copy "mega:/DiscutBackups/MonProjet/backup_HOST_DATE.tar.gz" /tmp/

# Voir le contenu sans extraire
tar -tzf /tmp/backup_HOST_DATE.tar.gz | head

# Extraire (exemple dans /restore)
mkdir -p /restore
tar -xzf /tmp/backup_HOST_DATE.tar.gz -C /restore

N’oublie pas : remplace toujours utilisateur, DossierASauvegarder et MonProjet par tes vraies valeurs.


Ça vous a plu ? Laissez un petit merci en commentaire 🙏

S’abonner
Notification pour
guest

0 Commentaires
Commentaires en ligne
Afficher tous les commentaires