0 Votes

Code source wiki de Sauvegarde

Modifié par john le 2026/09/20 20:36

Afficher les derniers auteurs
1 {{toc/}}
2
3 == Objectif ==
4
5 Sauvegarder un ou plusieurs dossiers automatiquement avec ##rsync##, en conservant les permissions, en journalisant les actions, et en pouvant être planifié avec ##cron##.
6
7 ----
8
9 == Pourquoi rsync ? ==
10
11 * Synchronisation incrémentale : copie uniquement ce qui a changé
12 * Conservation des permissions, dates et liens symboliques
13 * Prise en charge des exclusions
14 * Rapide, fiable et disponible partout
15
16 ----
17
18 == Script ==
19
20 {{code language="bash"}}
21 #!/bin/bash
22 set -euo pipefail
23
24 SOURCE="$HOME/Documents"
25 DEST="/mnt/backup/Documents"
26 LOGFILE="$HOME/rsync_backup.log"
27
28 echo "[$(date '+%F %T')] Sauvegarde de $SOURCE vers $DEST" >> "$LOGFILE"
29
30 # La destination doit être réellement montée
31 if ! mountpoint -q /mnt/backup; then
32 echo "[$(date '+%F %T')] ERREUR : /mnt/backup n'est pas monté, abandon." >> "$LOGFILE"
33 exit 1
34 fi
35
36 rsync -avh --delete --exclude='*.bak' "$SOURCE/" "$DEST/" >> "$LOGFILE" 2>&1
37
38 echo "[$(date '+%F %T')] Terminé." >> "$LOGFILE"
39 {{/code}}
40
41 {{warning}}
42 Avec ##--delete##, si le disque de destination n'est pas monté, rsync écrit dans le dossier vide qui sert de point de montage, sur le disque système : la sauvegarde précédente devient invisible et l'espace se remplit. Toujours vérifier le montage avant, avec ##mountpoint -q##.
43 {{/warning}}
44
45 ----
46
47 == Options ==
48
49 |=Option|=Effet
50 |##-a##|Mode archive : droits, dates, liens symboliques
51 |##-v##|Affiche les fichiers traités
52 |##-h##|Tailles lisibles
53 |##--delete##|Supprime dans la destination ce qui n'existe plus dans la source
54 |##-n## ou ##--dry-run##|Simule sans rien écrire
55 |##--exclude=##|Ignore un motif
56 |##--link-dest=##|Crée un instantané en partageant les fichiers inchangés
57
58 {{info}}
59 La barre oblique finale compte : ##"$SOURCE/"## copie le **contenu** du dossier, ##"$SOURCE"## copie le **dossier lui-même** dans la destination.
60 {{/info}}
61
62 ----
63
64 == Essayer sans risque ==
65
66 {{code language="bash"}}
67 rsync -avhn --delete "$SOURCE/" "$DEST/"
68 {{/code}}
69
70 ##-n## affiche ce qui serait fait, sans rien modifier. À lancer systématiquement après une modification du script.
71
72 ----
73
74 == Ajout à cron ==
75
76 {{code language="bash"}}
77 chmod +x sauvegarde.sh
78 ./sauvegarde.sh # test manuel d'abord
79 crontab -e
80 {{/code}}
81
82 {{code language="text"}}
83 0 3 * * * /chemin/vers/sauvegarde.sh
84 {{/code}}
85
86 ----
87
88 == Exclusions ==
89
90 {{code language="bash"}}
91 rsync -avh --delete --exclude='*.bak' --exclude='node_modules/' "$SOURCE/" "$DEST/"
92 {{/code}}
93
94 Pour une liste longue, un fichier d'exclusions :
95
96 {{code language="bash"}}
97 rsync -avh --delete --exclude-from="$HOME/.rsync-exclude" "$SOURCE/" "$DEST/"
98 {{/code}}
99
100 ----
101
102 == Sauvegardes datées ==
103
104 Un dossier par jour, en partageant les fichiers inchangés avec la veille (peu d'espace occupé) :
105
106 {{code language="bash"}}
107 DEST="/mnt/backup/Documents_$(date +%F)"
108 rsync -a --link-dest="/mnt/backup/Documents_$(date -d yesterday +%F)" "$SOURCE/" "$DEST/"
109 {{/code}}
110
111 ----
112
113 == Notification ==
114
115 {{code language="bash"}}
116 notify-send "Sauvegarde terminée" "Documents sauvegardés"
117 {{/code}}
118
119 Nécessite ##libnotify## et un environnement graphique. Sur un serveur, envoyer plutôt un message par un bot de messagerie ou par courriel.
120
121 ----
122
123 == Bonnes pratiques ==
124
125 * Tester avec ##--dry-run## avant d'automatiser
126 * Vérifier que la destination est montée avant tout ##--delete##
127 * Journaliser, et vérifier le journal de temps en temps
128 * Restaurer un fichier au hasard de temps à autre : une sauvegarde jamais restaurée n'est pas vérifiée
129 * Garder une copie hors de la machine : une sauvegarde sur le même hôte ne protège ni du vol ni de l'incendie
130
131 ----
132
133 == Liens utiles ==
134
135 * [[Manuel de rsync>>https://linux.die.net/man/1/rsync]]
136 * [[explainshell : décomposer une commande rsync>>https://explainshell.com/explain?cmd=rsync+-avh+--delete+source%2F+destination%2F]]
137
138 ----
139
140 == Liens internes ==
141
142 * [[Retour aux scripts perso>>doc:Wiki Batcave John.TutosLinux.ScriptsPerso.WebHome]]
143 * [[Sauvegarde de l'infrastructure (Plakar)>>doc:Wiki Batcave John.Infrastructure.Sauvegarde.WebHome]]
144 * [[Retour à l’accueil>>doc:Wiki Batcave John.WebHome]]