Code source wiki de Sauvegarde
Modifié par john le 2026/09/20 20:36
Masquer les derniers auteurs
| author | version | line-number | content |
|---|---|---|---|
![]() |
1.1 | 1 | {{toc/}} |
| 2 | |||
| 3 | == Objectif == | ||
| 4 | |||
![]() |
4.1 | 5 | Sauvegarder un ou plusieurs dossiers automatiquement avec ##rsync##, en conservant les permissions, en journalisant les actions, et en pouvant être planifié avec ##cron##. |
![]() |
1.1 | 6 | |
![]() |
2.1 | 7 | ---- |
![]() |
1.1 | 8 | |
![]() |
4.1 | 9 | == Pourquoi rsync ? == |
![]() |
1.1 | 10 | |
![]() |
4.1 | 11 | * Synchronisation incrémentale : copie uniquement ce qui a changé |
![]() |
1.1 | 12 | * Conservation des permissions, dates et liens symboliques |
| 13 | * Prise en charge des exclusions | ||
![]() |
4.1 | 14 | * Rapide, fiable et disponible partout |
![]() |
1.1 | 15 | |
![]() |
2.1 | 16 | ---- |
![]() |
1.1 | 17 | |
![]() |
4.1 | 18 | == Script == |
![]() |
1.1 | 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 | |||
![]() |
4.1 | 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" | ||
![]() |
1.1 | 39 | {{/code}} |
| 40 | |||
![]() |
4.1 | 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 | |||
![]() |
2.1 | 45 | ---- |
![]() |
1.1 | 46 | |
![]() |
4.1 | 47 | == Options == |
![]() |
1.1 | 48 | |
![]() |
4.1 | 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 | ||
![]() |
1.1 | 57 | |
![]() |
4.1 | 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 | |||
![]() |
2.1 | 62 | ---- |
![]() |
1.1 | 63 | |
![]() |
4.1 | 64 | == Essayer sans risque == |
![]() |
1.1 | 65 | |
![]() |
4.1 | 66 | {{code language="bash"}} |
| 67 | rsync -avhn --delete "$SOURCE/" "$DEST/" | ||
| 68 | {{/code}} | ||
![]() |
1.1 | 69 | |
![]() |
4.1 | 70 | ##-n## affiche ce qui serait fait, sans rien modifier. À lancer systématiquement après une modification du script. |
![]() |
1.1 | 71 | |
![]() |
4.1 | 72 | ---- |
| 73 | |||
| 74 | == Ajout à cron == | ||
| 75 | |||
![]() |
1.1 | 76 | {{code language="bash"}} |
![]() |
4.1 | 77 | chmod +x sauvegarde.sh |
| 78 | ./sauvegarde.sh # test manuel d'abord | ||
| 79 | crontab -e | ||
| 80 | {{/code}} | ||
| 81 | |||
| 82 | {{code language="text"}} | ||
![]() |
1.1 | 83 | 0 3 * * * /chemin/vers/sauvegarde.sh |
| 84 | {{/code}} | ||
| 85 | |||
![]() |
4.1 | 86 | ---- |
![]() |
1.1 | 87 | |
![]() |
4.1 | 88 | == Exclusions == |
![]() |
1.1 | 89 | |
![]() |
4.1 | 90 | {{code language="bash"}} |
| 91 | rsync -avh --delete --exclude='*.bak' --exclude='node_modules/' "$SOURCE/" "$DEST/" | ||
| 92 | {{/code}} | ||
![]() |
1.1 | 93 | |
![]() |
4.1 | 94 | Pour une liste longue, un fichier d'exclusions : |
![]() |
1.1 | 95 | |
| 96 | {{code language="bash"}} | ||
![]() |
4.1 | 97 | rsync -avh --delete --exclude-from="$HOME/.rsync-exclude" "$SOURCE/" "$DEST/" |
![]() |
1.1 | 98 | {{/code}} |
| 99 | |||
![]() |
2.1 | 100 | ---- |
![]() |
1.1 | 101 | |
![]() |
4.1 | 102 | == Sauvegardes datées == |
![]() |
1.1 | 103 | |
![]() |
4.1 | 104 | Un dossier par jour, en partageant les fichiers inchangés avec la veille (peu d'espace occupé) : |
![]() |
1.1 | 105 | |
| 106 | {{code language="bash"}} | ||
| 107 | DEST="/mnt/backup/Documents_$(date +%F)" | ||
![]() |
4.1 | 108 | rsync -a --link-dest="/mnt/backup/Documents_$(date -d yesterday +%F)" "$SOURCE/" "$DEST/" |
![]() |
1.1 | 109 | {{/code}} |
| 110 | |||
![]() |
2.1 | 111 | ---- |
![]() |
1.1 | 112 | |
![]() |
4.1 | 113 | == Notification == |
![]() |
1.1 | 114 | |
| 115 | {{code language="bash"}} | ||
![]() |
4.1 | 116 | notify-send "Sauvegarde terminée" "Documents sauvegardés" |
![]() |
1.1 | 117 | {{/code}} |
| 118 | |||
![]() |
4.1 | 119 | Nécessite ##libnotify## et un environnement graphique. Sur un serveur, envoyer plutôt un message par un bot de messagerie ou par courriel. |
![]() |
1.1 | 120 | |
![]() |
2.1 | 121 | ---- |
![]() |
1.1 | 122 | |
| 123 | == Bonnes pratiques == | ||
| 124 | |||
![]() |
4.1 | 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 | ||
![]() |
1.1 | 130 | |
![]() |
2.1 | 131 | ---- |
![]() |
1.1 | 132 | |
| 133 | == Liens utiles == | ||
| 134 | |||
![]() |
4.1 | 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]] | ||
![]() |
1.1 | 137 | |
![]() |
2.1 | 138 | ---- |
![]() |
1.1 | 139 | |
| 140 | == Liens internes == | ||
| 141 | |||
![]() |
4.1 | 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]] | ||
![]() |
3.1 | 144 | * [[Retour à l’accueil>>doc:Wiki Batcave John.WebHome]] |
