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:
@@ -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.
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user