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
-
... ... @@ -14,7 +14,7 @@ 14 14 Chaque exécution : 15 15 16 16 * exporte toutes les bases en SQL dans ##<APPDATA>/dumps## ; 17 -* sauvegarde les données des conteneurs etla bibliothèque Immich, en excluant les fichiers bruts des bases ;17 +* sauvegarde les données des conteneurs, la bibliothèque Immich et le contenu de Joplin, en excluant les fichiers bruts des bases ; 18 18 * supprime les instantanés de plus de 30 jours. 19 19 20 20 {{info}} ... ... @@ -21,13 +21,99 @@ 21 21 Les fichiers bruts d'une base en fonctionnement ne sont pas fiables pour une restauration. Ce sont les dumps SQL qui font foi. 22 22 {{/info}} 23 23 24 -== Script ==24 +== Mise en place du dépôt == 25 25 26 +=== Sur le Raspberry Pi (dépôt) === 27 + 28 +Utilisateur dédié, sans shell : 29 + 26 26 {{code language="bash"}} 27 -#!/bin/bash 31 +sudo useradd -m -d /srv/plakar -s /usr/sbin/nologin plakar 32 +sudo mkdir -p <CHEMIN_DEPOT> 33 +sudo chown plakar:plakar <CHEMIN_DEPOT> 34 +sudo install -d -m 700 -o plakar -g plakar /srv/plakar/.ssh 35 +{{/code}} 36 + 37 +Limitation au SFTP, dans ##/etc/ssh/sshd_config.d/plakar.conf## : 38 + 39 +{{code}} 40 +Match User plakar 41 + ForceCommand internal-sftp 42 + AllowTcpForwarding no 43 + X11Forwarding no 44 +{{/code}} 45 + 46 +{{code language="bash"}} 47 +sudo systemctl reload ssh 48 +{{/code}} 49 + 50 +Même en cas de vol de la clé, elle ne donne ni shell ni tunnel : seulement un accès SFTP. 51 + 52 +=== Sur le serveur principal (source) === 53 + 54 +Clé SSH dédiée, sans phrase de passe puisqu'elle sert à la tâche cron : 55 + 56 +{{code language="bash"}} 57 +sudo ssh-keygen -t ed25519 -f /root/.ssh/plakar_matrix -N "" 58 +{{/code}} 59 + 60 +Contenu de ##/root/.ssh/plakar_matrix.pub## à copier dans ##/srv/plakar/.ssh/authorized_keys## sur le Pi (propriétaire ##plakar##, droits ##600##). 61 + 62 +##/root/.ssh/config## : 63 + 64 +{{code}} 65 +Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com 66 + 67 +Host <HOTE_DEPOT> 68 + User plakar 69 + IdentityFile /root/.ssh/plakar_matrix 70 +{{/code}} 71 + 72 +La ligne ##Ciphers## limite, pour toutes les connexions SSH de root, les algorithmes de chiffrement à des variantes modernes. 73 + 74 +Première connexion, pour valider l'empreinte du Pi (sinon la tâche cron échouera) : 75 + 76 +{{code language="bash"}} 77 +sudo sftp <HOTE_DEPOT> 78 +{{/code}} 79 + 80 +Phrase secrète du dépôt et création : 81 + 82 +{{code language="bash"}} 83 +sudo sh -c 'umask 077; openssl rand -base64 12 > /root/.plakar-pass' 84 +sudo plakar -keyfile /root/.plakar-pass at "sftp://plakar@<HOTE_DEPOT>:<CHEMIN_DEPOT>" create 85 +{{/code}} 86 + 87 +{{warning}} 88 +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. 89 +{{/warning}} 90 + 91 +== Restaurer si le serveur principal est perdu == 92 + 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 : 94 + 95 +{{code language="bash"}} 96 +sudo plakar at <CHEMIN_DEPOT> ls 97 +sudo plakar at <CHEMIN_DEPOT> restore -to /tmp/restore <ID_INSTANTANE> 98 +{{/code}} 99 + 100 +Plakar demande alors la phrase secrète de façon interactive. 101 + 102 +== Script == 103 + 104 +{{code language="bash"}}#!/bin/bash 28 28 set -euo pipefail 29 -umask 077 # Ajout : dumps lisibles par root seul106 +umask 077 30 30 108 +# Alertes Telegram 109 +. /root/.backup-telegram 110 +notifier() { 111 + curl -fsS -m 10 "https://api.telegram.org/bot$TG_TOKEN/sendMessage" \ 112 + -d chat_id="$TG_CHAT" --data-urlencode text="$1" >/dev/null || true 113 +} 114 +attention() { echo "ATTENTION: $1" >&2; notifier "⚠️ Sauvegarde : $1"; } 115 +trap 'notifier "❌ Sauvegarde interrompue à la ligne $LINENO"' ERR 116 + 31 31 REPO="sftp://<UTILISATEUR>@<HOTE_DEPOT>:<CHEMIN_DEPOT>" 32 32 KEYFILE="<FICHIER_PHRASE_SECRETE>" 33 33 DUMPS="<APPDATA>/dumps" ... ... @@ -39,19 +39,19 @@ 39 39 > "$DUMPS/$c.sql" 2>/dev/null \ 40 40 || docker exec "$c" sh -c 'exec mariadb-dump -uroot -p"${MYSQL_ROOT_PASSWORD:-$MARIADB_ROOT_PASSWORD}" --all-databases' \ 41 41 > "$DUMPS/$c.sql" 2>/dev/null \ 42 - || e cho "ATTENTION:dump $c échoué">&2128 + || attention "dump $c échoué" 43 43 done 44 44 45 45 # Nextcloud : dump via l'utilisateur applicatif 46 46 docker exec "$(docker ps -q -f name=nextcloud_db)" sh -c 'exec mariadb-dump -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE"' \ 47 47 > "$DUMPS/nextcloud.sql" 2>/dev/null \ 48 - || e cho "ATTENTION:dump nextcloud échoué">&2134 + || attention "dump nextcloud échoué" 49 49 50 50 # Dumps PostgreSQL 51 -for c in joplin-db flus-db wallabag-db immich_postgres vikunja-db jellystat-db n8n-postgres dawarich_db; do # Ajout : dawarich_db137 +for c in joplin-db flus-db wallabag-db immich_postgres vikunja-db jellystat-db n8n-postgres dawarich_db; do 52 52 docker exec "$c" sh -c 'exec pg_dumpall -U "$POSTGRES_USER"' \ 53 53 > "$DUMPS/$c.sql" 2>/dev/null \ 54 - || e cho "ATTENTION:dump $c échoué">&2140 + || attention "dump $c échoué" 55 55 done 56 56 57 57 # Sauvegarde, sans core dumps, binlogs ni fichiers bruts des bases ... ... @@ -62,11 +62,13 @@ 62 62 -ignore "**/xwiki/mariadb/**" \ 63 63 -ignore "**/store.bak.*/**" \ 64 64 <APPDATA> \ 65 - <BIBLIOTHEQUE_IMMICH> 151 + <BIBLIOTHEQUE_IMMICH> \ 152 + <CONTENU_JOPLIN> 66 66 67 67 # Rétention : 30 jours glissants 68 68 plakar -keyfile "$KEYFILE" at "$REPO" rm -before 30d -apply 69 -{{/code}} 156 +notifier "✅ Sauvegarde terminée"{{/code}} 157 +~{~{/code}} 70 70 71 71 Tâche cron, ##/etc/cron.d/backup-plakar## : 72 72 ... ... @@ -74,6 +74,28 @@ 74 74 30 3 * * * root /root/backup-plakar.sh >> /var/log/backup-plakar.log 2>&1 75 75 {{/code}} 76 76 165 +== Alertes == 166 + 167 +Le script envoie un message Telegram à chaque exécution : 168 + 169 +|=Message|=Signification 170 +|✅ Sauvegarde terminée|Tout s'est bien passé 171 +|⚠️ Sauvegarde : dump … échoué|Un dump de base a échoué, la sauvegarde a continué sans lui 172 +|❌ Sauvegarde interrompue à la ligne …|Erreur bloquante, la sauvegarde n'a pas eu lieu 173 + 174 +Si aucun message n'arrive un matin, le script n'a pas démarré (serveur éteint, tâche cron cassée). 175 + 176 +Jeton du bot et identifiant du groupe dans ##/root/.backup-telegram##, lisible par root seul : 177 + 178 +{{code language="bash"}} 179 +TG_TOKEN="<JETON_BOT>" 180 +TG_CHAT="<ID_GROUPE>" 181 +{{/code}} 182 + 183 +{{warning}} 184 +Dans le script, chaque ligne continuée doit se terminer par ##\## sans rien après, pas même un espace. Une barre oblique inverse suivie d'un espace ne continue plus la ligne : c'est ce qui a interrompu plusieurs sauvegardes en septembre 2026. Contrôle après toute modification : ##sudo bash -n /root/backup-plakar.sh##, et ##cat -A## pour voir les caractères invisibles en fin de ligne. 185 +{{/warning}} 186 + 77 77 == Ajouter une base == 78 78 79 79 Ajouter le nom du conteneur dans la boucle MariaDB ou PostgreSQL du script, puis exclure ses fichiers bruts avec un ##-ignore## s'ils se trouvent dans ##<APPDATA>##.