0 Votes

Modifications pour le document Sauvegarde

Modifié par john le 2026/10/03 20:01

Depuis la version 2.1
modifié par john
sur 2026/09/18 22:27
Commentaire de modification : Il n'y a aucun commentaire pour cette version
À la version 6.1
modifié par john
sur 2026/09/19 20:00
Commentaire de modification : Il n'y a aucun commentaire pour cette version

Résumé

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 et la 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 seul
106 +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 - || echo "ATTENTION: dump $c échoué" >&2
128 + || 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 - || echo "ATTENTION: dump nextcloud échoué" >&2
134 + || 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_db
137 +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 - || echo "ATTENTION: dump $c échoué" >&2
140 + || 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>##.