Modifications pour le document Sauvegarde
Modifié par john le 2026/10/03 20:01
Résumé
-
Propriétés de la Page (1 modifications, 0 ajouts, 0 suppressions)
Détails
- Propriétés de la Page
-
- Contenu
-
... ... @@ -1,13 +1,11 @@ 1 1 Sauvegarde quotidienne du serveur principal vers le Raspberry Pi avec [[Plakar>>https://plakar.io]] : dépôt chiffré et dédupliqué, transport SFTP. 2 2 3 -{{toc/}} 4 - 5 5 == Fonctionnement == 6 6 7 7 |=Élément|=Valeur 8 8 |Machine sauvegardée|[[Serveur principal>>Wiki Batcave John.Infrastructure.ServeurPrincipal.WebHome]] 9 9 |Dépôt|SSD USB du [[Raspberry Pi>>Wiki Batcave John.Infrastructure.RaspberryPi.WebHome]] 10 -|Transport|SFTP , via l'intégration Plakar ##sftp##8 +|Transport|SFTP 11 11 |Déclenchement|Cron, chaque nuit à 3 h 30 12 12 |Rétention|30 jours glissants 13 13 |Script|##/root/backup-plakar.sh## ... ... @@ -16,52 +16,15 @@ 16 16 Chaque exécution : 17 17 18 18 * exporte toutes les bases en SQL dans ##<APPDATA>/dumps## ; 19 -* attend la fin de la sauvegarde Borg de [[Nextcloud>>Wiki Batcave John.Infrastructure.ServeurPrincipal.Nextcloud.WebHome]] AIO (planifiée à 3 h 00), au plus une heure ; 20 -* sauvegarde les données des conteneurs, la bibliothèque Immich, le contenu de Joplin et le dépôt Borg de Nextcloud AIO, en excluant les fichiers bruts des bases et les données brutes de Nextcloud ; 17 +* sauvegarde les données des conteneurs, la bibliothèque Immich et le contenu de Joplin, en excluant les fichiers bruts des bases ; 21 21 * supprime les instantanés de plus de 30 jours. 22 22 23 23 {{info}} 24 24 Les fichiers bruts d'une base en fonctionnement ne sont pas fiables pour une restauration. Ce sont les dumps SQL qui font foi. 25 - 26 -Nextcloud AIO fait exception : il n'y a pas de dump, sa base, ses fichiers et sa configuration sont dans son propre dépôt Borg, cohérent car produit conteneurs arrêtés. Plakar copie ce dépôt tel quel, d'où l'attente de la fin de la sauvegarde Borg : copier un dépôt en cours d'écriture donnerait une copie incohérente. 27 27 {{/info}} 28 28 29 -{{info}} 30 -Les dumps sont faits avec ##docker exec##, donc avec le client ##pg_dump## ou ##mysqldump## du conteneur lui-même, toujours à la bonne version. Les intégrations Plakar ##postgresql## et ##mysql## ont été écartées : elles exigent un accès TCP à chaque base et des clients de même version installés sur l'hôte, et produisent un instantané séparé par base. 31 -{{/info}} 24 +== Mise en place du dépôt == 32 32 33 -== Mise en place == 34 - 35 -=== Installer Plakar (les deux machines) === 36 - 37 -Installer le paquet ##plakar## (paquet ##.deb## disponible sur la [[page de téléchargement>>https://www.plakar.io/download]]) sur le serveur principal et sur le Raspberry Pi, **dans la même version**. 38 - 39 -{{code language="bash"}} 40 -sudo apt install ./plakar_<VERSION>_<ARCH>.deb 41 -plakar version 42 -{{/code}} 43 - 44 -=== Installer l'intégration SFTP (serveur principal) === 45 - 46 -Depuis Plakar 1.1, le transport SFTP n'est plus inclus dans le binaire : c'est une intégration à installer à part. Sans elle, toute commande sur un dépôt ##sftp:~/~/## échoue. 47 - 48 -Les intégrations sont installées **par utilisateur** (dans ##~~/.local/share/plakar/plugins##). La sauvegarde tournant en root, l'installation se fait avec ##sudo##. 49 - 50 -Le téléchargement des intégrations précompilées demande un compte Plakar connecté (gratuit). Le serveur n'ayant pas de navigateur, utiliser ##-no-spawn## : Plakar affiche une URL à ouvrir sur un autre poste, puis un code à saisir dans le terminal. 51 - 52 -{{code language="bash"}} 53 -sudo plakar login -github -no-spawn # ou : sudo plakar login -email <ADRESSE> 54 -sudo plakar login -status 55 -sudo plakar pkg add sftp 56 -sudo plakar pkg list 57 -{{/code}} 58 - 59 -{{info}} 60 -La connexion au compte ne sert qu'au gestionnaire d'intégrations. Les sauvegardes et restaurations n'en dépendent pas. 61 - 62 -Le Raspberry Pi n'a pas besoin de l'intégration : il ouvre le dépôt en local. 63 -{{/info}} 64 - 65 65 === Sur le Raspberry Pi (dépôt) === 66 66 67 67 Utilisateur dédié, sans shell : ... ... @@ -77,19 +77,17 @@ 77 77 78 78 {{code}} 79 79 Match User plakar 80 - ForceCommand internal-sftp -l VERBOSE41 + ForceCommand internal-sftp 81 81 AllowTcpForwarding no 82 82 X11Forwarding no 83 83 {{/code}} 84 84 85 85 {{code language="bash"}} 86 -sudo s shd -t && sudo systemctl reload ssh47 +sudo systemctl reload ssh 87 87 {{/code}} 88 88 89 89 Même en cas de vol de la clé, elle ne donne ni shell ni tunnel : seulement un accès SFTP. 90 90 91 -L'option ##-l VERBOSE## journalise chaque opération SFTP (ouverture, renommage, suppression, refus) dans ##journalctl -u ssh##. Sans elle, un refus côté dépôt n'apparaît nulle part sur le Pi. 92 - 93 93 === Sur le serveur principal (source) === 94 94 95 95 Clé SSH dédiée, sans phrase de passe puisqu'elle sert à la tâche cron : ... ... @@ -129,30 +129,9 @@ 129 129 Le dépôt est chiffré avec cette phrase secrète. Sans elle, les sauvegardes sont illisibles, même pour leur propriétaire : en conserver une copie dans le gestionnaire de mots de passe, jamais uniquement sur le serveur. 130 130 {{/warning}} 131 131 132 -== Mettre à jour Plakar == 133 - 134 -Le paquet ##plakar## et l'intégration ##sftp## se mettent à jour **séparément** : ##apt## ne touche pas aux intégrations. Après chaque mise à jour du paquet : 135 - 136 -{{code language="bash"}} 137 -# Sur les deux machines : même version partout 138 -plakar version 139 - 140 -# Sur le serveur principal : mise à jour de toutes les intégrations de root 141 -sudo plakar login -status # se reconnecter si besoin 142 -sudo plakar pkg add -u 143 -sudo plakar pkg list 144 - 145 -# Contrôle de l'accès au dépôt 146 -sudo plakar -keyfile <FICHIER_PHRASE_SECRETE> at <REPO> ls | head -2 147 -{{/code}} 148 - 149 -{{warning}} 150 -Une intégration restée sur une ancienne version alors que Plakar a été mis à jour peut provoquer des échecs difficiles à diagnostiquer, sur le verrou du dépôt notamment (voir Incidents connus). Ne jamais mettre à jour le paquet sans mettre à jour l'intégration dans la foulée. 151 -{{/warning}} 152 - 153 153 == Restaurer si le serveur principal est perdu == 154 154 155 -Le dépôt peut s'ouvrir directement sur le Raspberry Pi, où Plakar est aussi installé, avec la phrase secrète récupérée dans le gestionnaire de mots de passe .L'accès étant local, aucune intégration ni compte Plakar n'est nécessaire:93 +Le dépôt peut s'ouvrir directement sur le Raspberry Pi, où Plakar est aussi installé, avec la phrase secrète récupérée dans le gestionnaire de mots de passe : 156 156 157 157 {{code language="bash"}} 158 158 sudo plakar at <CHEMIN_DEPOT> ls ... ... @@ -163,8 +163,7 @@ 163 163 164 164 == Script == 165 165 166 -{{code language="bash"}} 167 -#!/bin/bash 104 +{{code language="bash"}}#!/bin/bash 168 168 set -euo pipefail 169 169 umask 077 170 170 ... ... @@ -191,6 +191,11 @@ 191 191 || attention "dump $c échoué" 192 192 done 193 193 131 +# Nextcloud : dump via l'utilisateur applicatif 132 +docker exec "$(docker ps -q -f name=nextcloud_db)" sh -c 'exec mariadb-dump -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE"' \ 133 + > "$DUMPS/nextcloud.sql" 2>/dev/null \ 134 + || attention "dump nextcloud échoué" 135 + 194 194 # Dumps PostgreSQL 195 195 for c in joplin-db flus-db wallabag-db immich_postgres vikunja-db jellystat-db n8n-postgres dawarich_db; do 196 196 docker exec "$c" sh -c 'exec pg_dumpall -U "$POSTGRES_USER"' \ ... ... @@ -198,34 +198,21 @@ 198 198 || attention "dump $c échoué" 199 199 done 200 200 201 -# Attente de la fin de la sauvegarde Borg d'AIO (planifiée à 3h00) 202 -attente=0 203 -while docker ps --format '{{.Names}}' | grep -qx nextcloud-aio-borgbackup; do 204 - if [ "$attente" -ge 3600 ]; then 205 - attention "Borg AIO encore en cours après 1 h : dépôt Borg possiblement incohérent" 206 - break 207 - fi 208 - sleep 60 209 - attente=$((attente + 60)) 210 -done 211 - 212 -# Backup avec exclusions : core dumps, binlogs, fichiers bruts des bases 213 -# et données brutes de Nextcloud AIO (déjà dans le dépôt Borg, de façon cohérente) 143 +# Sauvegarde, sans core dumps, binlogs ni fichiers bruts des bases 214 214 plakar --concurrency 2 -keyfile "$KEYFILE" at "$REPO" backup \ 215 215 -ignore "**/joplin-app/core.*" \ 216 - -ignore "**/Nextcloud -AIO/data/**" \146 + -ignore "**/Nextcloud/DB/**" \ 217 217 -ignore "**/log/mysql/**" \ 218 218 -ignore "**/xwiki/mariadb/**" \ 219 219 -ignore "**/store.bak.*/**" \ 220 220 <APPDATA> \ 221 221 <BIBLIOTHEQUE_IMMICH> \ 222 - <CONTENU_JOPLIN> \ 223 - <DEPOT_BORG_AIO> 152 + <CONTENU_JOPLIN> 224 224 225 225 # Rétention : 30 jours glissants 226 226 plakar -keyfile "$KEYFILE" at "$REPO" rm -before 30d -apply 227 -notifier "✅ Sauvegarde terminée" 228 -{{/code}} 156 +notifier "✅ Sauvegarde terminée"{{/code}} 157 +~{~{/code}} 229 229 230 230 Tâche cron, ##/etc/cron.d/backup-plakar## : 231 231 ... ... @@ -240,8 +240,7 @@ 240 240 |=Message|=Signification 241 241 |✅ Sauvegarde terminée|Tout s'est bien passé 242 242 |⚠️ Sauvegarde : dump … échoué|Un dump de base a échoué, la sauvegarde a continué sans lui 243 -|⚠️ Sauvegarde : Borg AIO encore en cours après 1 h …|La sauvegarde Borg de Nextcloud n'était pas finie : la copie du dépôt Borg de cette nuit peut être incohérente, celle des nuits précédentes reste utilisable 244 -|❌ Sauvegarde interrompue à la ligne …|Erreur bloquante, la sauvegarde n'a pas eu lieu (la ligne du ##plakar backup## indique un échec de Plakar lui-même : consulter la fin du journal) 172 +|❌ Sauvegarde interrompue à la ligne …|Erreur bloquante, la sauvegarde n'a pas eu lieu 245 245 246 246 Si aucun message n'arrive un matin, le script n'a pas démarré (serveur éteint, tâche cron cassée). 247 247 ... ... @@ -265,21 +265,9 @@ 265 265 {{code language="bash"}} 266 266 tail -n 50 /var/log/backup-plakar.log 267 267 grep ATTENTION /var/log/backup-plakar.log 268 -sudo grep -nE '^(warn|error|plakar):' /var/log/backup-plakar.log | tail -n 20 269 269 sudo plakar -keyfile <FICHIER_PHRASE_SECRETE> at <REPO> ls 270 -sudo plakar pkg list 271 271 {{/code}} 272 272 273 -La colonne durée de ##ls## donne le temps de chaque sauvegarde : une hausse brutale mérite un coup d'œil au journal. 274 - 275 -Contrôle d'intégrité du dernier instantané, à lancer **sur le Raspberry Pi** (lecture locale du SSD, sans passer par le réseau) : 276 - 277 -{{code language="bash"}} 278 -sudo -u plakar plakar at <CHEMIN_DEPOT> check <ID_INSTANTANE> 279 -{{/code}} 280 - 281 -Sans identifiant, ##check## vérifie tous les instantanés : c'est très long sur un Pi et doit être terminé avant 3 h 30. 282 - 283 283 == Restaurer == 284 284 285 285 Restaurer un instantané complet dans un dossier temporaire : ... ... @@ -300,8 +300,6 @@ 300 300 docker exec -i <CONTENEUR> sh -c 'exec psql -U "$POSTGRES_USER" -d postgres' < /tmp/restore/<CHEMIN>/dumps/<CONTENEUR>.sql 301 301 {{/code}} 302 302 303 -Restaurer Nextcloud AIO : restaurer le dossier ##<DEPOT_BORG_AIO>## sur l'hôte, déployer le mastercontainer sur une installation neuve, puis choisir la restauration dans l'interface AIO (chemin du dépôt, mot de passe Borg, archive). Voir la page [[Nextcloud>>Wiki Batcave John.Infrastructure.ServeurPrincipal.Nextcloud.WebHome]]. 304 - 305 305 {{warning}} 306 306 Une sauvegarde qui n'a jamais été restaurée n'est pas une sauvegarde vérifiée. Faire un essai de restauration de temps en temps, dans un dossier temporaire. 307 307 {{/warning}} ... ... @@ -309,9 +309,7 @@ 309 309 == Incidents connus == 310 310 311 311 |=Symptôme|=Cause|=Solution 312 -|Verrou restant après une exécution interrompue|Le processus a été coupé en cours| Vérifierqu'aucun Plakar netourne(##pgrep -a plakar##), puissupprimerle fichier signalédans##<CHEMIN_DEPOT>/locks/##surlePi226 +|Verrou restant après une exécution interrompue|Le processus a été coupé en cours|Supprimer le verrou orphelin avant de relancer 313 313 |Avertissements VFS|Cache local incohérent|Vider ##~~/.cache/plakar## de root 314 314 |Transfert coupé (EOF SFTP) sur de gros fichiers|Lien Wi-Fi du dépôt instable|Économie d'énergie Wi-Fi désactivée sur le Pi ; passer à ##~-~-concurrency 1## pour une première sauvegarde volumineuse 315 315 |Déconnexion du SSD pendant la sauvegarde|Pont USB en mode UAS|Voir la configuration SSD sur la page [[Raspberry Pi>>Wiki Batcave John.Infrastructure.RaspberryPi.WebHome]] 316 -|Arrêt après une dizaine de minutes, ##failed to refresh the repository lock: sftp: "Failure" (SSH_FX_FAILURE)## répété dans le journal, puis ##lock refresher: failed to refresh the repository lock##|Cause probable : intégration ##sftp## restée sur une ancienne version après une mise à jour de Plakar (octobre 2026). Le verrou est rafraîchi toutes les 5 minutes, les sauvegardes courtes peuvent donc masquer le problème|##sudo plakar pkg add -u##, supprimer le verrou orphelin, consulter ##journalctl -u ssh## sur le Pi (log ##VERBOSE##) 317 -|##authentication required. Run `plakar login`## lors d'un ##pkg add##|Le gestionnaire d'intégrations exige un compte connecté|##sudo plakar login -github -no-spawn##