infra : la sauvegarde PostgreSQL redevient observable, l'alerte disait faux (#172) #178
No reviewers
Labels
No labels
Compat/Breaking
EC01
EC02
EC03
EC04
EC05
EC06
Kind/BDD
Kind/Back
Kind/Bug
Kind/CICD
Kind/Cloud
Kind/Contenu
Kind/Data
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Front
Kind/IA
Kind/Infra
Kind/Monitoring
Kind/Security
Kind/Testing
Portée/Post-jury
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
ops/alerte
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
g2/enervision!178
Loading…
Reference in a new issue
No description provided.
Delete branch "lenaic/172-sauvegarde-observable"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ferme #172. L'alerte avait tort, et c'est le pire cas possible : une alerte critique qui se déclenche sur une absence de donnée désarme celui qui la lit.
Les vidages passaient tous les jours
Deux causes, indépendantes
1. Le rôle
backupn'a aucune étiquette danssite.yml.Le déploiement continu joue
--tags app,proxy. Un rôle sans étiquette n'est jamais joué./usr/local/bin/pg-backup.shest donc resté figé à sa version d'amorçage du 2 septembre, celle d'avant le #42, qui ne publie aucune métrique.Le rôle prend l'étiquette
backupet entre dans les étiquettes du déploiement. Il est idempotent et ne touche pas au socle : un répertoire, deux scripts, une ligne de cron.2. Les fichiers de métriques sortaient en
0640 root:root.pg-backup.shtourne en root sous une umask restrictive et n'imposait pas de mode. node-exporter tourne sans privilège :D'où une panne qui ne touchait que la sauvegarde. Le
chmodporte sur le temporaire, avant le renommage, donc l'écriture reste atomique. 0644 et pas 0640 : trois compteurs, aucun secret.Vérifié sur le serveur avant d'écrire
Script réinstallé à la main, vidage rejoué :
Cette demande fait en sorte que ça n'ait plus à être fait à la main.
Preuve
Lien avec le #176
Même famille : un fichier déployé une fois à la main, que le déploiement continu ne rafraîchit jamais. Le #176 traite les montages de fichiers dans les conteneurs, celui-ci un rôle Ansible sans étiquette. Les deux se fusionnent indépendamment.
Le diagnostic est juste et je l'ai vérifié de bout en bout :
--collector.textfile.directory=/host/var/lib/node_exporter/textfile, répertoire créé en0775 deploy:deploypar le rôleapp, donc traversable ; des fichiers en0640 root:rooty étaient effectivement illisibles pour node-exporter, qui tourne sans privilège.chmodsur le TEMPORAIRE avant lemvgarde bien l'atomicité. Le correctif est le bon, et le rôlebackupsans étiquette était une vraie bombe à retardement — un script d'exploitation figé au 2 septembre que le déploiement continu ne rejouait jamais.Un point qui me gêne, un autre plus léger.
1. Le contrôle de chaîne éprouve l'orthographe, pas le comportement — et il rend un message faux
Deux problèmes, l'un après l'autre.
Le repli produit deux valeurs.
grep -cimprime0sur sa sortie standard ET sort en 1 quand il ne trouve rien :|| echo 0ajoute donc une seconde ligne. Reproduit :Le verdict reste rouge, donc le banc n'est pas cassé — mais il crache une erreur bash et son message annonce « (0\n0 sur 2) ». Un rouge qui se présente mal se fait ignorer. Le
|| echo 0est en trop,grep -cimprime déjà0.Surtout, le motif épingle une écriture, pas une propriété.
umask 022en tête de la fonction, ouinstall -m 0644, donneraient exactement le bon résultat et rougiraient ce banc. C'est le reproche que la #174 fait, à côté, aux bancs qui lisent du texte plutôt que d'observer un effet.Et ici l'effet est observable presque gratuitement : le script porte déjà le crochet,
TEXTFILE_DIR="${PG_BACKUP_TEXTFILE_DIR:-/var/lib/node_exporter/textfile}". Le jouer en entier demande un fauxdockerdans lePATH, ce qui n'est peut-être pas le prix qu'on veut payer aujourd'hui — mais alors, au minimum : retirer le|| echo 0, et élargir le motif pour qu'une réécriture correcte (umask,install -m) ne fasse pas rougir du code sain.2. Ce que
--tags app,proxy,backupchange vraimentLe rôle est idempotent,
Premier vidageest gardé parcreates, rien à redire sur le fond. Mais à partir de cette fusion, une fusion dans develop réécrit/usr/local/bin/pg-backup.shet/etc/cron.d/pg-backupen production. C'est voulu et c'est la bonne décision ; ça mérite juste d'être dit tel quel dansdocs/runbooks/deploiement.md, à côté de la liste des rôles joués — quelqu'un qui débogue un vidage doit savoir que le script sous ses yeux peut avoir changé sous lui à la dernière fusion.À noter aussi, si la #177 passe avec la #178 : une seule fusion recréera alors tous les conteneurs ET réécrira la sauvegarde. Ça fait beaucoup de gestes automatiques pour un
git mergedeux jours avant le jury. Rien ne s'y oppose techniquement, mais ça vaut d'être décidé sciemment plutôt que par empilement de deux demandes.Le reste est propre : le commentaire de
site.ymlexplique le pourquoi au bon endroit, et le choix de0644plutôt que0640est justifié (trois compteurs, aucun secret).