Le manifeste de la 0.5.0, deja publiee, s'est mis a pointer une archive
introuvable — l'installation echouait sur ynh_setup_source, sans que le
symptome designe la cause.
Le remplacement global des URL avait reecrit amd64.url, c'est-a-dire
precisement le champ que la documentation ecrite le meme jour designait comme
« a ne jamais changer a la main », puisque publier.sh le regenere a chaque
publication.
⚠ L'erreur de conception est plus large : le placeholder avait sa place dans la
COPIE publique, pas dans le depot de travail, qui sert au deploiement reel et
doit rester operationnel. Anonymiser un depot qui sert encore, c'est le casser.
Ce qui reste, et qui vaut : depot_code commande toujours toutes les URL
derivees, et le garde-fou refuse toujours de publier avec une URL en
example.org — il ne se declenche simplement plus ici, puisqu'il sert a la copie
publique.
sha256 inchange : seule l'URL avait bouge, le manifeste retrouve exactement son
etat de publication.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sortie du projet : l'URL du Gitea prive disparait au profit de
https://forge.example.org/mabibli — example.org est reserve a la documentation
par la RFC 2606, donc definitivement injoignable.
Une seule ligne commande tout le reste : depot_code, en tete de publier.sh, d'ou
derivent les URL de release, d'archive et le message de fin. --depot-code fait la
meme chose sans modifier le fichier.
⚠ publier.sh REFUSE desormais de publier tant que le placeholder est en place, et
il refuse avant de compiler, comme ses autres garde-fous. Sans cela on ecrirait
dans manifest.toml une amd64.url que personne ne peut telecharger, et l'echec
surviendrait bien plus loin — a l'installation, dans ynh_setup_source, sans
rapport apparent avec la cause.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Le fichier expliquait POURQUOI les choix avaient ete faits — le mode WAL mesure
a 4 Ko contre 205 Ko, la justification du domaine entier, la portee commune ou
personnelle de chaque donnee. Ces raisons ont leur place dans le README du depot
du code, pas dans un panneau que YunoHost affiche apres installation.
Ne restent que les gestes : ou sont les donnees, ou se reglent les acces, la
commande de sauvegarde manuelle correcte, et ce dont le serveur a besoin pour
fonctionner. 82 lignes -> 47.
⚠ L'acces sortant vers catalogue.bnf.fr et openlibrary.org est conserve : c'est
le seul endroit du projet ou il soit documente.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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>
Il y en avait deux, et le mauvais portait le nom le plus convaincant :
`publier-release.sh` compilait, archivait et réécrivait le manifeste, à
charge pour l'appelant de committer. Lancé seul, il a produit les deux
moitiés de la panne du 2026-08-21 — un manifeste corrigé mais non poussé,
et une release v0.4.0 contenant six commits de plus que son tag.
`publier.sh` absorbe l'étape et refuse désormais de publier, avant de
compiler, si le tag de la version existe déjà (en nommant le commit du tag
et celui de HEAD) ou si le dépôt du code n'est pas propre. `--archive-seule`
garde la brique réutilisable en CI, sous le même nom : ni manifeste, ni
commit, ni tag, donc rien à moitié publié.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
L'asset de la release v0.4.0 a été remplacé sur Gitea ; le sha256 du
manifeste désignait encore l'archive précédente, d'où l'échec de
`yunohost app upgrade` (et de son retour arrière, qui retélécharge la
même source).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
La page « À propos » de l'application affiche la version publiée : encore
faut-il que le binaire la connaisse. Le publish reçoit donc, à côté de
`-p:Version` déjà présent, `-p:MaBibliDateBuild`.
⚠️ Cet horodatage est le témoin de l'injection : sans lui, l'application se
déclare « version de développement » plutôt que d'afficher le « 1.0.0 » que le
SDK pose par défaut, lequel se lirait comme une vraie version alors qu'il ne
désigne rien.
`SOURCE_DATE_EPOCH` est respecté, comme pour l'archive : sinon deux
compilations du même commit donneraient deux sha256 différents pour la seule
raison que l'heure a changé, et la reproductibilité visée par les options de
`tar` ne vaudrait plus rien.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
publier.sh enchaîne la publication de bout en bout : version déduite de la
précédente, archive, manifeste, commit et push du paquet, tag et push du code,
avec vérification côté distant. Seul le dépôt de l'archive dans la release
Gitea reste manuel — l'URL est rappelée en fin de sortie.
PUBLICATION.md et A_FAIRE.md sont supprimés : leur contenu vit désormais dans
le README de mabibli, point d'entrée unique du projet. doc/DESCRIPTION.md et
doc/ADMIN.md restent ici, YunoHost les lisant lui-même.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
PUBLICATION.md donne les gestes pas à pas, avec le contrôle attendu à
chaque étape : première mise en production, montée de version (0.1.0 →
0.1.1), retour arrière si la mise à jour échoue, désinstallation.
Deux points qui se paient cher s'ils sont oubliés y sont explicites :
`--version` est obligatoire pour une nouvelle version applicative (sans
lui le script reproduit celle du manifeste), et la sauvegarde de sécurité
pré-upgrade ne contient PAS le répertoire de données.
README et A_FAIRE renvoient au fichier plutôt que de tripler la
procédure. Dernière URL fictive éliminée : gitea.exemple.org subsistait
dans l'exemple CI de publier-release.sh.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Le data_dir de YunoHost vit sous /home/yunohost.app/mabibli, or
ProtectHome=yes rend /home vide dans le namespace du service : le démarrage
mourait sur « SQLite Error 14: unable to open database file ».
ReadWritePaths ne perce pas ProtectHome — vérifié sur une unité de test :
`yes` + ReadWritePaths échoue, `tmpfs` + BindPaths réussit. La forme retenue
garde les répertoires personnels du serveur invisibles au service.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`Environment=` découpe sur les espaces : sans guillemets, la ligne
définissait `ConnectionStrings__MaBibli=Data` et une variable parasite
`Source=…`. L'application recevait la chaîne de connexion `Data` et mourait
au démarrage en ArgumentException, faisant échouer l'installation à l'étape
« Démarrage de mabibli » (constaté sur le serveur, reproduit isolément sur
une unité de test).
Version de paquet à ~ynh2 : l'archive est inchangée, seule la conf bouge.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Le commit précédent portait le bon message mais pas les modifications :
manifest.toml, README.md, conf/systemd.service et la valeur par défaut de
--base-url référençaient encore gitea.example.org, ce qui faisait échouer
l'installation au Prefetching asset main.
A_FAIRE.md est réécrit : la visibilité privée du dépôt du code devient le
point bloquant restant (Gitea répond 404, pas 403, à un anonyme).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>