Paquet YunoHost pour Vèy Lalwa — v1.0.1~ynh1

Format de paquetage 2, helpers 2.1, sur le modèle de jwe_ynh.

Ce que l'installation fait, dans cet ordre : extraire l'archive, rendre le
.env depuis les réponses d'installation, construire l'application web (npm ci,
polices, build, prune), monter l'environnement Python, puis remplir la base
depuis le corpus de recherche embarqué.

Trois choix qui méritent d'être dits :

- La base, le cache et l'export vivent dans data_dir, jamais dans le répertoire
  d'installation. « ynh_setup_source --full_replace » efface celui-ci
  intégralement à chaque mise à jour : y laisser la base effacerait tout le
  travail de veille accumulé. Vérifié en simulant la mise à jour — 59 textes,
  367 sources et 3 passages survivent à l'effacement.
- Un domaine dédié, sans question « path ». Les liens internes sont absolus et
  SvelteKit demanderait une recompilation avec « paths.base » pour tenir sur
  un sous-chemin. Mieux vaut une contrainte annoncée qu'un sous-chemin à
  moitié fonctionnel.
- Les identifiants Légifrance sont facultatifs, et les tests s'exécutent sans :
  cela vérifie au passage le mode dégradé documenté. Le rapport de passage
  affiche alors « legifrance ignoré — repli sur … », et les deux autres
  collecteurs détectent quand même les 7 ajouts et les 4 changements de
  décision.

Un minuteur systemd distinct porte le passage de collecte, le helper
« ynh_config_add_systemd » ne gérant que l'unité principale. Il est arrêté
avant toute mise à jour : un passage qui démarrerait pendant le remplacement
des fichiers travaillerait sur un arbre à moitié écrit.

Vérifié avant publication, pas après : séquence npm complète depuis l'archive
publiée, environnement Python, remplissage, démarrage du service lisant la base
de data_dir, origine déduite des en-têtes du proxy, passage en mode dégradé, et
simulation d'effacement du répertoire d'installation. shellcheck sans
avertissement, TOML valides.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Cyber Mawonaj
2026-07-25 23:33:28 -04:00
co-authored by Claude Opus 5
commit 07b349be86
23 changed files with 1144 additions and 0 deletions
+106
View File
@@ -0,0 +1,106 @@
#:schema https://raw.githubusercontent.com/YunoHost/apps/master/schemas/manifest.v2.schema.json
packaging_format = 2
id = "veyelalwa"
name = "Vèy Lalwa"
description.en = "Legislative watch on French law and its effects on the freedoms of individuals, associations and businesses, with a Guadeloupe focus"
description.fr = "Veille législative sur le droit français et ses effets sur les libertés des individus, des associations et des entreprises, avec un zoom Guadeloupe"
version = "1.0.1~ynh1"
maintainers = []
[upstream]
license = "AGPL-3.0-or-later"
website = "https://o-k-i.net"
code = "https://labola.o-k-i.net/cyber-mawonaj/veye-lalwa"
admindoc = "https://labola.o-k-i.net/cyber-mawonaj/veye-lalwa/src/branch/main/README-pipeline.md"
fund = "https://liberapay.com/OKI/donate/"
[integration]
yunohost = ">= 12.1"
helpers_version = "2.1"
architectures = "all"
multi_instance = true
ldap = "not_relevant"
sso = "not_relevant"
# L'installation construit l'application web (npm) et l'environnement Python du
# pipeline, puis remplit la base depuis le corpus de recherche embarqué.
disk = "700M"
ram.build = "1G"
# À l'exécution : Node en veille socket-like via Restart, plus un passage de
# collecte deux fois par jour.
ram.runtime = "200M"
[install]
[install.domain]
type = "domain"
# Pas de question « path » : l'application occupe la racine d'un domaine.
# Les liens internes sont absolus (/recherche, /textes/…) et SvelteKit
# exigerait de recompiler avec `paths.base` pour tenir sur un sous-chemin.
# Mieux vaut une contrainte annoncée qu'un sous-chemin à moitié fonctionnel.
[install.init_main_permission]
type = "group"
default = "visitors"
# Une veille législative n'a d'intérêt que publique : c'est un travail
# d'information citoyenne, pas un outil interne.
[install.legifrance_client_id]
ask.en = "Légifrance API client ID (PISTE)"
ask.fr = "Identifiant client de l'API Légifrance (PISTE)"
help.en = "From https://piste.gouv.fr — declare an application AND subscribe it to the « Légifrance » API. Use the OAuth pair (Client ID / Client secret), NOT the API key, which is rejected by the token endpoint. Leave empty: the pipeline then falls back on the Sénat and Conseil constitutionnel, which is enough to track promulgations and constitutional decisions."
help.fr = "Depuis https://piste.gouv.fr — déclarez une application ET abonnez-la à l'API « Légifrance ». Utilisez le couple OAuth (Client ID / Client secret), PAS la clé d'API, refusée par le point d'accès du jeton. Laissez vide : le pipeline se replie alors sur le Sénat et le Conseil constitutionnel, ce qui suffit à suivre les promulgations et les décisions."
type = "string"
optional = true
[install.legifrance_client_secret]
ask.en = "Légifrance API client secret (PISTE)"
ask.fr = "Secret client de l'API Légifrance (PISTE)"
help.en = "The « Client secret » shown next to the Client ID. Leave empty if you left the ID empty."
help.fr = "Le « Client secret » affiché à côté du Client ID. Laissez vide si vous avez laissé l'identifiant vide."
type = "password"
optional = true
[install.contact_email]
ask.en = "Contact address for the collectors' user-agent"
ask.fr = "Adresse de contact pour le user-agent des collecteurs"
help.en = "Sent with every request to Légifrance, the Sénat and the Conseil constitutionnel so their administrators can reach you. Presenting oneself honestly is the price of scraping public services."
help.fr = "Envoyée à chaque requête vers Légifrance, le Sénat et le Conseil constitutionnel, pour que leurs administrateurs puissent vous joindre. Se présenter honnêtement est la contrepartie de l'interrogation de services publics."
type = "email"
optional = true
[resources]
[resources.sources.main]
url = "https://labola.o-k-i.net/cyber-mawonaj/veye-lalwa/archive/v1.0.1.tar.gz"
sha256 = "632e534fbcda5f5ebe771b9383f3807b8bf1a5a8e0fb24f7a22b77772fe75a94"
autoupdate.strategy = "latest_forgejo_tag"
[resources.system_user]
[resources.install_dir]
# Répertoire persistant : la base SQLite, le cache HTTP et l'export JSON y
# vivent. Sans lui, `ynh_setup_source --full_replace` effacerait à chaque
# mise à jour tout l'historique de veille accumulé.
[resources.data_dir]
[resources.permissions]
main.url = "/"
[resources.ports]
[resources.apt]
# sqlite3 : diagnostic et sauvegarde à chaud (.backup).
# python3-venv : environnement du pipeline.
# build-essential + python3-dev : repli de compilation de better-sqlite3
# quand aucun binaire précompilé ne correspond à l'architecture.
packages = "ca-certificates, sqlite3, python3, python3-venv, python3-dev, build-essential"
[resources.nodejs]
version = "22"