Restaure les vraies URL, et documente la production d'une copie publique
Pendant du commit du paquet. Les passages qui PARLAIENT du placeholder annoncaient desormais la vraie URL comme etant un placeholder : ils sont reecrits pour dire ce qui est. docs/publier-une-version.md porte maintenant la marche a suivre pour produire une copie publique — depot neuf sans historique, URL neutralisees, identite a revoir — avec le rm -rf .git AVANT le git init : un git clone ne conviendrait pas, l'historique portant les URL reelles dans chaque ancien commit. CLAUDE.md consigne l'erreur et la regle qui en sort : on anonymise une copie, jamais l'original. 626 tests au vert. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -2270,6 +2270,28 @@ lui-même** pour les afficher dans son catalogue et son interface d'administrati
|
|||||||
compilation, et rien n'est recompilé sur le serveur. Le manifeste déclare donc
|
compilation, et rien n'est recompilé sur le serveur. Le manifeste déclare donc
|
||||||
l'application en `full_domain`.
|
l'application en `full_domain`.
|
||||||
|
|
||||||
|
**`all_users`, et la question n'est plus posée** (2026-08-22). `init_main_permission` a
|
||||||
|
quitté `[install]` au profit de `resources.permissions.main.allowed = "all_users"`.
|
||||||
|
Vérifié dans le cœur YunoHost (`src/utils/resources.py`) : `allowed` **l'emporte** sur la
|
||||||
|
question, qui n'aurait donc fait que laisser croire que la réponse comptait.
|
||||||
|
|
||||||
|
⚠️ **Ce n'est pas un réglage de confort : `visitors` casserait deux invariants du code.**
|
||||||
|
L'application n'a aucune authentification propre — elle fait confiance à `YNH_USER` parce
|
||||||
|
que SSOwat l'écrase à chaque requête, exactement comme elle n'écoute que sur `127.0.0.1` —
|
||||||
|
et **toute personne autorisée peut supprimer n'importe quel livre** du catalogue commun,
|
||||||
|
sans rôle ni lecture seule. Ouverte au public, la portée « personnelle » (statuts de
|
||||||
|
lecture, envies) n'existe plus du tout.
|
||||||
|
|
||||||
|
⚠️ **Pas de `protected = true`, délibérément** : restreindre à un groupe dédié reste
|
||||||
|
légitime, et c'est l'affaire de l'administrateur. C'est l'**élargissement** qui est un
|
||||||
|
contresens, pas le réglage.
|
||||||
|
|
||||||
|
⚠️ **`allowed` n'agit qu'à la CRÉATION de la permission** (`if perm not in existing_perms`).
|
||||||
|
Une montée de version ne réaligne rien : un accès élargi à la main le reste. Un commentaire
|
||||||
|
de manifeste n'atteignant aucun administrateur, l'avertissement vit dans
|
||||||
|
`doc/DESCRIPTION.md` (page d'installation) et `doc/ADMIN.md` (interface d'administration) —
|
||||||
|
les deux seuls fichiers du paquet que **YunoHost lit lui-même**.
|
||||||
|
|
||||||
## Héberger hors YunoHost — voie SECONDAIRE, ajoutée le 2026-08-21
|
## Héberger hors YunoHost — voie SECONDAIRE, ajoutée le 2026-08-21
|
||||||
|
|
||||||
Demande venue d'un tiers voulant installer le projet sur un **Synology**. `Dockerfile`,
|
Demande venue d'un tiers voulant installer le projet sur un **Synology**. `Dockerfile`,
|
||||||
@@ -2374,35 +2396,43 @@ référencés mais qui partaient dans chaque release. L'archive passe de **69 à
|
|||||||
l'écart est bien moindre que sur disque (8,4 Mo), les *source maps* étant du texte qui se
|
l'écart est bien moindre que sur disque (8,4 Mo), les *source maps* étant du texte qui se
|
||||||
compresse très bien. **Toujours mesurer sur l'archive, jamais sur le disque.**
|
compresse très bien. **Toujours mesurer sur l'archive, jamais sur le disque.**
|
||||||
|
|
||||||
## Les URL de dépôt sont un placeholder — sortie du projet (2026-08-22)
|
## ⚠️ Le dépôt de travail garde ses vraies URL — corrigé le 2026-08-22
|
||||||
|
|
||||||
`https://forge.example.org/mabibli` remplace partout l'URL du Gitea privé de l'utilisateur.
|
**Erreur commise ce jour-là, et instructive.** Les URL du Gitea de l'utilisateur avaient été
|
||||||
`example.org` est réservé à la documentation par la **RFC 2606** : le placeholder est donc
|
remplacées partout par un placeholder `forge.example.org`, dans le dépôt **de travail**.
|
||||||
définitivement injoignable, ce qui est exactement ce qu'on veut d'un placeholder.
|
Deux conséquences, la seconde immédiate :
|
||||||
|
|
||||||
⚠️ **Une seule ligne commande tout** : `depot_code`, en tête de `build/publier.sh`. Les URL
|
1. le remplacement global a réécrit `amd64.url` dans `manifest.toml` — **le champ que la
|
||||||
de release, d'archive et le message de fin en dérivent. `--depot-code URL` fait la même
|
documentation qu'on venait d'écrire désignait comme « à ne jamais changer à la main »**,
|
||||||
chose sans modifier le fichier.
|
parce que `publier.sh` le régénère à chaque publication. Le manifeste de la 0.5.0, déjà
|
||||||
|
publiée, s'est mis à pointer une archive introuvable ;
|
||||||
|
2. l'installation a échoué, et **le symptôme ne désignait pas la cause** : `ynh_setup_source`
|
||||||
|
annonce une URL morte, sans rapport apparent avec un nettoyage de documentation.
|
||||||
|
|
||||||
⚠️ **`publier.sh` REFUSE de publier tant que le placeholder est en place**, et il refuse
|
⚠️ **L'erreur de conception derrière** : le placeholder avait sa place dans la **copie
|
||||||
**avant de compiler**, comme ses autres garde-fous. Sans lui, on écrirait dans
|
publique**, pas dans le dépôt de travail. Ce dernier sert au déploiement réel de son auteur
|
||||||
`manifest.toml` une `amd64.url` que personne ne peut télécharger — et l'échec surviendrait
|
et doit rester opérationnel ; la copie publique est produite à part, sans historique et avec
|
||||||
**bien plus loin**, à l'installation, sous la forme d'un `ynh_setup_source` en erreur, sans
|
les URL neutralisées — la marche à suivre est dans `docs/publier-une-version.md`.
|
||||||
rapport apparent avec la cause. C'est la même famille de panne que le manifeste corrigé mais
|
|
||||||
non poussé : un défaut posé ici, constaté ailleurs.
|
|
||||||
|
|
||||||
⚠️ **Ce que le remplacement de fichiers ne règle PAS** : l'**historique git** porte ces URL
|
**Règle qui en sort, et qui dépasse ce cas** : anonymiser un dépôt qui sert encore, c'est le
|
||||||
dans chaque ancien commit, et le dépôt du paquet contient en plus une archive de 68 Mo
|
casser. On anonymise **une copie**, jamais l'original.
|
||||||
committée par erreur à la 0.1.0 puis retirée. Seul un dépôt **neuf, sans historique**, en
|
|
||||||
vient à bout — c'est ce qui a été décidé pour la sortie.
|
|
||||||
|
|
||||||
⚠️ **`amd64.url` ne se change pas à la main** : `publier.sh` la réécrit à chaque
|
### Ce qui reste en place, et qui vaut
|
||||||
publication. La corriger donnerait l'illusion que c'est fait.
|
|
||||||
|
|
||||||
Ce qui **reste** volontairement : `maintainers = ["mathieu"]` (c'est le champ prévu par le
|
- **`depot_code`, en tête de `build/publier.sh`**, commande toutes les URL dérivées. Une
|
||||||
format v2), l'adresse de contact et le site de l'auteur dans `/a-propos` (décidé au lot Y —
|
ligne à changer, `--depot-code` pour un essai.
|
||||||
l'AGPL attend d'ailleurs qu'on puisse joindre la source, donc l'auteur), et `"mathieu"`
|
- **Le garde-fou refuse de publier si l'URL contient `example.org`**, et refuse **avant de
|
||||||
comme nom de lecteur dans les jeux de test.
|
compiler**. Il ne se déclenche pas dans le dépôt de travail — il sert à la copie publique,
|
||||||
|
pour que celui qui reprend le projet renseigne `depot_code` avant sa première release
|
||||||
|
plutôt que de le découvrir à l'installation.
|
||||||
|
- **Les cinq variables d'environnement jumelles restent supprimées** (`MABIBLI_SOURCE_DIR`,
|
||||||
|
`MABIBLI_BASE_URL`, `MABIBLI_URL_RELEASES`, `MABIBLI_OUTPUT_DIR`, `MABIBLI_VERSION`) :
|
||||||
|
chacune doublait une option qu'elle répétait, et rien ne disait laquelle l'emportait.
|
||||||
|
|
||||||
|
⚠️ **L'historique git n'est pas anonymisable** : il porte les URL réelles dans chaque ancien
|
||||||
|
commit, et le dépôt du paquet contient en plus une archive de 68 Mo committée par erreur à
|
||||||
|
la 0.1.0 puis retirée. Seul un dépôt **neuf, sans historique**, en vient à bout — d'où le
|
||||||
|
`rm -rf .git` **avant** le `git init` dans la marche à suivre.
|
||||||
|
|
||||||
## Historique du projet (pourquoi ces choix)
|
## Historique du projet (pourquoi ces choix)
|
||||||
|
|
||||||
|
|||||||
@@ -121,7 +121,7 @@
|
|||||||
private const string Site = "https://www.limonier.be";
|
private const string Site = "https://www.limonier.be";
|
||||||
|
|
||||||
/// <summary>Dépôt du code — ce que l'AGPL attend qu'on rende accessible.</summary>
|
/// <summary>Dépôt du code — ce que l'AGPL attend qu'on rende accessible.</summary>
|
||||||
private const string Depot = "https://forge.example.org/mabibli";
|
private const string Depot = "https://git.akbar.nohost.me/mathieu/mabibli";
|
||||||
|
|
||||||
private VersionApplication? _version;
|
private VersionApplication? _version;
|
||||||
|
|
||||||
|
|||||||
@@ -65,12 +65,14 @@ dotnet run --project MaBibli.Api
|
|||||||
|
|
||||||
L'API sert aussi le client compilé : une seule commande suffit.
|
L'API sert aussi le client compilé : une seule commande suffit.
|
||||||
|
|
||||||
## ⚠️ Avant de publier ce projet quelque part
|
## Ce dépôt porte les URL du serveur de son auteur
|
||||||
|
|
||||||
Les URL de dépôt sont un **placeholder volontaire**, `https://forge.example.org/mabibli`.
|
`https://git.akbar.nohost.me/mathieu/…` — c'est le dépôt **de travail**, et il doit rester
|
||||||
Une seule ligne les commande toutes — `depot_code`, en tête de
|
opérationnel. Une seule ligne les commande toutes : `depot_code`, en tête de
|
||||||
`mabibli_ynh/build/publier.sh` — et `publier.sh` **refuse de publier tant qu'elle n'est
|
`mabibli_ynh/build/publier.sh`.
|
||||||
pas changée**. Le détail est dans
|
|
||||||
|
Pour en tirer une **copie publique** destinée à des tiers, la marche à suivre — dépôt neuf
|
||||||
|
sans historique, URL neutralisées — est dans
|
||||||
[docs/publier-une-version.md](docs/publier-une-version.md).
|
[docs/publier-une-version.md](docs/publier-une-version.md).
|
||||||
|
|
||||||
## ⚠️ Depuis la 0.5.0, aucune base antérieure n'est migrable
|
## ⚠️ Depuis la 0.5.0, aucune base antérieure n'est migrable
|
||||||
|
|||||||
+4
-4
@@ -37,7 +37,7 @@ version ultérieures fonctionnent normalement.
|
|||||||
|
|
||||||
## Le paquet YunoHost
|
## Le paquet YunoHost
|
||||||
|
|
||||||
MaBibli se déploie via un **second dépôt**, [`mabibli_ynh`](https://forge.example.org/mabibli_ynh),
|
MaBibli se déploie via un **second dépôt**, [`mabibli_ynh`](https://git.akbar.nohost.me/mathieu/mabibli_ynh),
|
||||||
qui **ne contient aucun code C#** : il porte le manifeste, les configurations nginx et
|
qui **ne contient aucun code C#** : il porte le manifeste, les configurations nginx et
|
||||||
systemd, et les scripts d'installation. Toute la documentation, elle, vit ici — ce
|
systemd, et les scripts d'installation. Toute la documentation, elle, vit ici — ce
|
||||||
fichier est le point d'entrée unique du projet.
|
fichier est le point d'entrée unique du projet.
|
||||||
@@ -178,7 +178,7 @@ Vérification, à faire **sans être authentifié** (autre navigateur, ou `curl`
|
|||||||
ci-dessous) :
|
ci-dessous) :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -fsSLI "https://forge.example.org/mabibli/releases/download/v0.1.0/mabibli-0.1.0-linux-x64.tar.gz" | head -1
|
curl -fsSLI "https://git.akbar.nohost.me/mathieu/mabibli/releases/download/v0.1.0/mabibli-0.1.0-linux-x64.tar.gz" | head -1
|
||||||
```
|
```
|
||||||
|
|
||||||
Attendu : `HTTP/2 200`. Un 404 signifie soit que la release n'est pas déposée, soit que
|
Attendu : `HTTP/2 200`. Un 404 signifie soit que la release n'est pas déposée, soit que
|
||||||
@@ -200,13 +200,13 @@ Le contrôle qui tranche, quel que soit le chemin suivi — c'est le manifeste *
|
|||||||
serveur le lira** :
|
serveur le lira** :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -fsSL "https://forge.example.org/mabibli_ynh/raw/branch/main/manifest.toml" | grep amd64
|
curl -fsSL "https://git.akbar.nohost.me/mathieu/mabibli_ynh/raw/branch/main/manifest.toml" | grep amd64
|
||||||
```
|
```
|
||||||
|
|
||||||
#### A.5 Installer
|
#### A.5 Installer
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo yunohost app install https://forge.example.org/mabibli_ynh --debug
|
sudo yunohost app install https://git.akbar.nohost.me/mathieu/mabibli_ynh --debug
|
||||||
```
|
```
|
||||||
|
|
||||||
YunoHost demande le domaine (celui créé en A.1) et le groupe autorisé (`all_users`).
|
YunoHost demande le domaine (celui créé en A.1) et le groupe autorisé (`all_users`).
|
||||||
|
|||||||
+41
-30
@@ -11,41 +11,52 @@ Pour vous, qui sortez les versions. Pour installer, voir
|
|||||||
| [La chaîne de publication](#publication) | ce que `publier.sh` fait, et ce qu'il refuse |
|
| [La chaîne de publication](#publication) | ce que `publier.sh` fait, et ce qu'il refuse |
|
||||||
| [Monter de version](#b-monter-de-version) | pas à pas |
|
| [Monter de version](#b-monter-de-version) | pas à pas |
|
||||||
|
|
||||||
## Avant de publier ce projet quelque part
|
## L'URL du dépôt, et la copie publique
|
||||||
|
|
||||||
Les URL de dépôt sont un **placeholder volontaire**, `https://forge.example.org/mabibli`
|
Ce dépôt est le dépôt **de travail** : il porte les URL réelles du serveur de son auteur,
|
||||||
(le domaine `example.org` est réservé à la documentation par la RFC 2606, donc
|
`https://git.akbar.nohost.me/mathieu/…`, et c'est ce qui le rend opérationnel.
|
||||||
définitivement injoignable). Rien ne fonctionnera tant qu'il n'est pas remplacé.
|
|
||||||
|
|
||||||
**Une seule ligne commande tout le reste** — `depot_code`, en tête de
|
**Une seule ligne les commande toutes** — `depot_code`, en tête de `build/publier.sh`.
|
||||||
`mabibli_ynh/build/publier.sh`. Elle produit les URL de release, celles d'archive, et le
|
Les URL de release, d'archive et le message de fin en dérivent. `--depot-code URL` fait la
|
||||||
message de fin. Pour un essai ponctuel, `--depot-code https://…` fait la même chose sans
|
même chose sans modifier le fichier, pour un essai ponctuel.
|
||||||
modifier le fichier.
|
|
||||||
|
|
||||||
⚠️ **`publier.sh` refuse de publier tant que le placeholder est en place**, et il refuse
|
⚠️ **`amd64.url` dans `manifest.toml` ne se change JAMAIS à la main** : `publier.sh` la
|
||||||
*avant* de compiler. C'est délibéré : publier avec une URL morte écrirait dans
|
réécrit à chaque publication. La modifier hors de ce chemin produit un manifeste qui pointe
|
||||||
`manifest.toml` une `amd64.url` que personne ne peut télécharger, et l'échec surviendrait
|
une archive introuvable — l'échec survient alors **bien plus loin**, à l'installation, dans
|
||||||
bien plus tard, à l'installation, sous la forme d'un `ynh_setup_source` en erreur — sans
|
`ynh_setup_source`, sans rapport apparent avec la cause. C'est arrivé le 2026-08-22.
|
||||||
rapport apparent avec la cause.
|
|
||||||
|
|
||||||
Restent à changer à la main, une fois seulement :
|
### Produire une copie publique
|
||||||
|
|
||||||
| Fichier | Quoi |
|
Pour publier le projet à destination de tiers, on **copie** — on ne transforme pas le dépôt
|
||||||
|---|---|
|
de travail :
|
||||||
| `mabibli_ynh/manifest.toml` | `code = "…"`, et `maintainers` |
|
|
||||||
| `mabibli_ynh/conf/systemd.service` | `Documentation=…` |
|
|
||||||
| `mabibli_ynh/doc/ADMIN.md` | le lien de bas de page |
|
|
||||||
| `mabibli_ynh/README.md`, ce fichier | les liens et les commandes d'exemple |
|
|
||||||
| `MaBibli.Client/Pages/APropos.razor` | `Depot`, `Site`, et l'adresse de contact |
|
|
||||||
|
|
||||||
⚠️ **`amd64.url` dans le manifeste n'est PAS à changer à la main** : `publier.sh` la
|
```bash
|
||||||
réécrit à chaque publication. La corriger donnerait l'illusion que c'est fait alors que la
|
cd ~/Code && rm -rf mabibli-public && cp -r mabibli mabibli-public
|
||||||
source du problème est ailleurs.
|
rm -rf mabibli-public/.git
|
||||||
|
```
|
||||||
|
|
||||||
⚠️ **Le dépôt du code doit être PUBLIC.** `ynh_setup_source` télécharge sans jeton, et
|
⚠️ **Le `rm -rf .git` vient AVANT le `git init`**, et un `git clone` ne conviendrait pas :
|
||||||
Gitea comme GitHub répondent **404** — pas 403 — à un anonyme sur un dépôt privé. Le
|
l'historique porte les URL réelles dans chaque ancien commit — et, côté paquet, une archive
|
||||||
symptôme est alors rigoureusement identique à « la release n'existe pas ». Contrôle qui
|
de 68 Mo committée par erreur à la 0.1.0 puis retirée.
|
||||||
tranche, hors session authentifiée : `curl -fsSLI "<url de l'archive>"`.
|
|
||||||
|
Puis neutraliser les URL et l'identité :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd mabibli-public
|
||||||
|
grep -rl 'git\.akbar\.nohost\.me' . | xargs sed -i \
|
||||||
|
-e 's|https://git\.akbar\.nohost\.me/mathieu/mabibli_ynh|https://forge.example.org/mabibli_ynh|g' \
|
||||||
|
-e 's|https://git\.akbar\.nohost\.me/mathieu/mabibli|https://forge.example.org/mabibli|g'
|
||||||
|
git init -b main && git add -A && git commit -m "MaBibli"
|
||||||
|
```
|
||||||
|
|
||||||
|
`forge.example.org` est injoignable par construction — `example.org` est réservé à la
|
||||||
|
documentation par la **RFC 2606**. C'est voulu : `publier.sh` **refuse de publier** tant
|
||||||
|
qu'une URL en `example.org` est en place, et il refuse **avant de compiler**. Celui qui
|
||||||
|
reprend le projet doit donc renseigner `depot_code` avant sa première release, plutôt que
|
||||||
|
de découvrir le problème à l'installation.
|
||||||
|
|
||||||
|
Restent à revoir à la main dans la copie : `maintainers` dans `manifest.toml`, et l'adresse
|
||||||
|
de contact et le site dans `MaBibli.Client/Pages/APropos.razor`.
|
||||||
|
|
||||||
## Compilation
|
## Compilation
|
||||||
|
|
||||||
@@ -242,7 +253,7 @@ Créer la release `v0.1.1` dans Gitea, y téléverser
|
|||||||
`build/dist/mabibli-0.1.1-linux-x64.tar.gz`, puis vérifier sans authentification :
|
`build/dist/mabibli-0.1.1-linux-x64.tar.gz`, puis vérifier sans authentification :
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -fsSLI "https://forge.example.org/mabibli/releases/download/v0.1.1/mabibli-0.1.1-linux-x64.tar.gz" | head -1
|
curl -fsSLI "https://git.akbar.nohost.me/mathieu/mabibli/releases/download/v0.1.1/mabibli-0.1.1-linux-x64.tar.gz" | head -1
|
||||||
```
|
```
|
||||||
|
|
||||||
#### B.5 Pousser le paquet
|
#### B.5 Pousser le paquet
|
||||||
@@ -263,7 +274,7 @@ sudo yunohost backup create --apps mabibli
|
|||||||
```
|
```
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo yunohost app upgrade mabibli -u https://forge.example.org/mabibli_ynh --debug
|
sudo yunohost app upgrade mabibli -u https://git.akbar.nohost.me/mathieu/mabibli_ynh --debug
|
||||||
```
|
```
|
||||||
|
|
||||||
⚠️ **L'option `-u` n'est pas facultative ici.** MaBibli n'est pas dans le catalogue
|
⚠️ **L'option `-u` n'est pas facultative ici.** MaBibli n'est pas dans le catalogue
|
||||||
|
|||||||
Reference in New Issue
Block a user