Range --archive-seule au lieu de le supprimer, et mesure la RAM

Le mode etait justifie dans CLAUDE.md comme « la brique reutilisable en CI ».
C'etait faux : le README du depot du code s'en sert depuis toujours comme
chemin de reprise a la main quand publier.sh echoue en cours de route. Il a
donc failli partir sur une justification erronee.

Garde et range : 8 ramifications ramenees a 5, dont une seule assouplit encore
un garde-fou, contre trois auparavant. Deux defauts reels en sont sortis — un
depot sale n'etait PAS signale dans ce mode, et la version y retombait sur
celle deja publiee, piege que le README documentait au lieu de le corriger.

refuser() separe le constat du conseil : le constat vaut dans les deux modes,
« choisissez un numero libre » est faux en reprise, ou le tag vise est
justement celui qu'on veut retrouver.

Le depot git devient une exigence inconditionnelle en tete, ce qui supprime
quatre tests -d .git disperses plus bas.

Les cinq variables d'environnement jumelles disparaissent : chacune doublait
une option qu'elle repetait, l'aide en listait dix pour cinq reglages, et rien
ne disait laquelle l'emportait.

ram.runtime passe de 200M a 256M. Mesure sur le serveur : pic reel de
208 793 600 o, soit 199,1 Mio, contre 200M declares — 0,4 % de marge, c'est-a-
dire aucune. systemctl show -p MemoryPeak ne renvoie rien sur ce serveur et
reussit en silence ; c'est le cgroup qui garde le maximum.

Les deux doc/*_fr.md, identiques octet pour octet a leurs jumeaux, sont
supprimes : YunoHost retombe sur les fichiers par defaut, deja en francais.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mathieu
2026-08-22 12:15:24 +02:00
co-authored by Claude Opus 5
parent fac694da03
commit 1f115790ee
4 changed files with 132 additions and 170 deletions
-82
View File
@@ -1,82 +0,0 @@
## Comment l'authentification fonctionne
MaBibli n'a **pas de connexion propre**. L'identité vient entièrement du portail YunoHost :
nginx authentifie le visiteur, puis SSOwat injecte dans la requête les en-têtes `YNH_USER`,
`YNH_USER_EMAIL` et `YNH_USER_FULLNAME`, que l'application se contente de lire.
Conséquences pratiques :
- **Qui peut voir la bibliothèque se règle dans les permissions YunoHost** (`mabibli.main`),
pas dans l'application.
- La collection est **commune** à toutes les personnes autorisées. Chaque livre garde une trace
de qui l'a saisi, mais personne n'est cloisonné : c'est une bibliothèque de foyer.
- Les **statuts de lecture sont personnels** (chacun sa progression), les **prêts sont communs**
(un livre absent l'est pour tout le monde).
- Se déconnecter du portail YunoHost ne déconnecte pas nécessairement des applications :
chacune garde sa propre session. C'est une limite connue de YunoHost, pas de MaBibli.
⚠️ **Ne pas exposer le port interne.** Le service écoute volontairement sur `127.0.0.1`
uniquement. L'application fait confiance à `YNH_USER` parce que SSOwat écrase cet en-tête à
chaque requête ; un service joignable directement permettrait à quiconque de forger
`YNH_USER` et de contourner le portail. Le port n'est pas ouvert au pare-feu, et
`ASPNETCORE_URLS` dans l'unité systemd ne doit jamais être élargi à `0.0.0.0` ou `*`.
## Domaine entier obligatoire
MaBibli s'installe **sur un domaine entier**, pas sous un sous-chemin (`/mabibli`).
Le client est une application Blazor WebAssembly : son chemin de base et les empreintes
d'intégrité de son service worker sont figés **à la compilation**. Comme le paquet installe une
archive déjà compilée — et ne compile jamais rien sur le serveur — il n'existe pas de moyen
propre de les réécrire à l'installation. YunoHost refusera donc un changement d'URL vers un
sous-chemin.
## Où vivent les données
| Quoi | Où |
|---|---|
| Binaires et client web | `/var/www/mabibli` (appartient à `root`, l'application ne peut pas s'y écrire) |
| Base SQLite | `/home/yunohost.app/mabibli/mabibli.db` |
| Journaux | `journalctl -u mabibli` |
La base est **délibérément séparée des binaires** : une mise à jour remplace intégralement
`/var/www/mabibli` sans jamais toucher aux données. Le schéma est migré automatiquement au
démarrage, il n'y a aucune commande à lancer après une mise à jour.
## Sauvegarde
La base tourne en mode **WAL**. C'est important pour qui voudrait bricoler une sauvegarde à la
main : à un instant donné, l'essentiel des données peut se trouver dans `mabibli.db-wal` et
**pas** dans `mabibli.db`. Mesuré sur une base fraîchement migrée, `mabibli.db` faisait 4 Ko —
et ne contenait **aucune table** — pendant que le fichier `-wal` en portait 205 Ko.
Le script de sauvegarde du paquet ne copie donc pas les fichiers tels quels : il demande à
SQLite un instantané cohérent (`.backup`, l'API de sauvegarde en ligne), déposé à côté de la
base sous le nom `mabibli-instantane.db`. C'est ce fichier que la restauration remet en place,
en écartant au passage les `-wal` / `-shm` de l'archive, qui décrivaient l'état d'une autre
copie de la base.
Le service **n'est pas arrêté** pendant la sauvegarde : l'API de sauvegarde en ligne garantit la
cohérence du fichier produit sans bloquer les lectures, et couper l'application à chaque
sauvegarde nocturne coûterait une indisponibilité pour rien.
Pour une sauvegarde manuelle, la bonne commande est donc :
```bash
sqlite3 /home/yunohost.app/mabibli/mabibli.db ".backup '/quelque/part/mabibli.db'"
```
et surtout pas un `cp` du seul fichier `.db`.
## Le scan du code-barres exige HTTPS
L'accès à la caméra n'est autorisé par les navigateurs que dans un contexte sécurisé. En
production, le certificat Let's Encrypt de YunoHost suffit. En revanche, joindre le serveur par
son IP locale (`http://192.168.x.x`) fera **toujours** échouer le scan : ce n'est pas un
contexte sécurisé. La saisie manuelle de l'ISBN reste disponible dans tous les cas.
## Accès sortant nécessaire
Le serveur doit pouvoir joindre `catalogue.bnf.fr` et `openlibrary.org` en HTTPS pour
pré-remplir les fiches à partir d'un ISBN. Sans accès sortant, l'application fonctionne, mais
toute saisie devient manuelle.
-9
View File
@@ -1,9 +0,0 @@
MaBibli est une application de gestion de bibliothèque personnelle, pensée pour un foyer.
- **Catalogue** des livres physiques et des ebooks (fiches uniquement, aucun fichier n'est hébergé).
- **Prêts** : à qui le livre a été confié, depuis quand, et l'historique complet des prêts passés.
- **Scan ISBN** au code-barres depuis le téléphone, ou saisie manuelle, avec pré-remplissage automatique du titre, de l'auteur, de l'éditeur et de la couverture.
- **Statuts de lecture** personnels : chaque membre du foyer suit sa propre progression sur une collection commune.
- **Consultation hors-ligne** : l'application est une PWA installable, et la bibliothèque reste consultable sans réseau.
Les métadonnées viennent du catalogue de la **BnF** puis d'**OpenLibrary**, deux sources libres et sans clé d'API. Aucune dépendance à Google Books.