Code source wiki de Sauvegarde
Modifié par john le 2026/09/20 20:36
Afficher les derniers auteurs
| author | version | line-number | content |
|---|---|---|---|
| 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]] |