Last active 1730124638

Revision aeb95f74c90926f08e96ac75caa9b4d944a75432

btrfs-backup.sh Raw
1#!/usr/bin/env bash
2
3# Config
4SOURCE="/home"
5LOCAL_DEST="/snapshots"
6DEST="/run/media/mathieu/ext_ssd/backups"
7KEEP_LOCAL=10 # Nombre de snapshots locaux à conserver
8KEEP_DISTANT=31 # Nombre de snapshots distant à conserver
9# KEEP_DAILY=7 # Rétention des snapshots distants
10# KEEP_WEEKLY=4
11# KEEP_MONTHLY=6
12DATE=$(date +"%Y-%m-%d_%H-%M-%S")
13SNAPSHOT_NAME="$DATE"
14LAST_RUN_FILE="$DEST/.last_run"
15LAST_SNAPSHOT_FILE="$DEST/.last_snapshot"
16
17get_age_days() {
18 local file=$1
19 local file_time=$(date -r "$file" +%s)
20 local current_time=$(date +%s)
21 echo $(((current_time - file_time) / 86400))
22}
23
24if ! mountpoint -q "$DEST/.."; then
25 echo "Erreur: Le disque externe n'est pas monté sur $DEST"
26 exit 1
27fi
28
29# Vérifier la dernière exécution
30if [ -f "$LAST_RUN_FILE" ]; then
31 last_run=$(cat "$LAST_RUN_FILE")
32 days_since_last_run=$((($(date +%s) - $(date -d "$last_run" +%s)) / 86400))
33 if [ $days_since_last_run -gt 7 ]; then
34 echo "Attention: $days_since_last_run jours se sont écoulés depuis la dernière sauvegarde."
35 fi
36else
37 echo "Première exécution détectée."
38fi
39
40# Créer un nouveau snapshot en lecture seule de /home
41if sudo btrfs subvolume snapshot -r "$SOURCE" "$LOCAL_DEST/$SNAPSHOT_NAME"; then
42 echo "Snapshot local créé avec succès: $LOCAL_DEST/$SNAPSHOT_NAME"
43else
44 echo "Erreur lors de la création du snapshot local"
45 exit 1
46fi
47
48# Envoyer le snapshot vers la destination
49if [ -f "$LAST_SNAPSHOT_FILE" ]; then
50 last_snapshot=$(cat "$LAST_SNAPSHOT_FILE")
51 if [ -d "$LOCAL_DEST/$last_snapshot" ]; then
52 echo "Envoi d'un snapshot incrémentiel..."
53 if sudo btrfs send -p "$LOCAL_DEST/$last_snapshot" "$LOCAL_DEST/$SNAPSHOT_NAME" | sudo btrfs receive "$DEST"; then
54 echo "Snapshot incrémental envoyé avec succès vers $DEST/$SNAPSHOT_NAME"
55 else
56 echo "Erreur lors de l'envoi du snapshot incrémentiel. Tentative d'envoi complet..."
57 if sudo btrfs send "$LOCAL_DEST/$SNAPSHOT_NAME" | sudo btrfs receive "$DEST"; then
58 echo "Snapshot complet envoyé avec succès vers $DEST/$SNAPSHOT_NAME"
59 else
60 echo "Erreur lors de l'envoi du snapshot complet"
61 sudo btrfs subvolume delete "$LOCAL_DEST/$SNAPSHOT_NAME"
62 exit 1
63 fi
64 fi
65 else
66 echo "Le snapshot précédent n'existe pas localement. Envoi d'un snapshot complet..."
67 if sudo btrfs send "$LOCAL_DEST/$SNAPSHOT_NAME" | sudo btrfs.receive "$DEST"; then
68 echo "Snapshot complet envoyé avec succès vers $DEST/$SNAPSHOT_NAME"
69 else
70 echo "Erreur lors de l'envoi du snapshot complet"
71 sudo btrfs subvolume delete "$LOCAL_DEST/$SNAPSHOT_NAME"
72 exit 1
73 fi
74 fi
75else
76 echo "Aucun snapshot précédent trouvé. Envoi d'un snapshot complet..."
77 if sudo btrfs send "$LOCAL_DEST/$SNAPSHOT_NAME" | sudo btrfs receive "$DEST"; then
78 echo "Snapshot complet envoyé avec succès vers $DEST/$SNAPSHOT_NAME"
79 else
80 echo "Erreur lors de l'envoi du snapshot complet"
81 sudo btrfs subvolume delete "$LOCAL_DEST/$SNAPSHOT_NAME"
82 exit 1
83 fi
84fi
85
86# Mettre à jour les fichiers de suivi
87date +"%Y-%m-%d %H:%M:%S" >"$LAST_RUN_FILE"
88echo "$SNAPSHOT_NAME" >"$LAST_SNAPSHOT_FILE"
89
90# Fonction de nettoyage des snapshots locaux
91cleanup_local_snapshots() {
92 echo "Nettoyage des snapshots locaux..."
93 local snapshots=($(ls -1d "$LOCAL_DEST"/20*_*-*-* | sort -r))
94 local count=0
95 for snapshot in "${snapshots[@]}"; do
96 if [ $count -ge $KEEP_LOCAL ]; then
97 echo "Suppression du snapshot local: $snapshot"
98 sudo btrfs subvolume delete "$snapshot"
99 fi
100 count=$((count + 1))
101 done
102}
103
104# Fonction de nettoyage des snapshots sur la destination
105cleanup_remote_snapshots() {
106 echo "Nettoyage des snapshots distants..."
107 cd "$DEST" || exit
108
109 local snapshots=($(ls -1d 20*_*-*-* | sort -r))
110
111 for snapshot in "${snapshots[@]}"; do
112 local age=$(get_age_days "$snapshot")
113
114 # Supprimer tous les snapshots plus vieux que 31 jours
115 if [ $age -gt $KEEP_DISTANT ]; then
116 echo "Suppression du snapshot distant: $snapshot"
117 sudo btrfs subvolume delete "$snapshot"
118 fi
119 done
120}
121
122# Exécuter le nettoyage
123cleanup_local_snapshots
124cleanup_remote_snapshots
125
126echo "Sauvegarde et nettoyage terminés"