🎒 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 🙏