feat(packaging) : package YunoHost veille-ia_ynh (packaging v2, helpers 2.1)

- manifest.toml validé contre le schéma officiel manifest.v2.schema.json
  (sources par tag forge avec placeholder sha256 assumé, nodejs 24, ports,
  system_user, install_dir, data_dir, permission privée all_users, SSO)
- Scripts install/remove/upgrade/backup/restore/change_url (bash -n OK) :
  build au fil de l'eau avec BASE_PATH, ALERTS_TOKEN généré à l'install,
  .env chmod 400, logs journald
- conf/nginx.conf : proxy_params_with_auth (header Ynh-User), conf/systemd.service :
  node via __NODEJS_DIR__, sandboxing modéré, conf/env : DATA_DIR/OLLAMA_URL/ALERTS_TOKEN
- tests.toml minimal, doc DESCRIPTION/ADMIN fr+en
- README racine : dev local, variables d'env, procédure de release, Ollama
This commit is contained in:
cyber-mawonaj
2026-08-01 09:25:39 -04:00
parent ff26136dfb
commit b3ff529cfa
17 changed files with 559 additions and 39 deletions
+86
View File
@@ -0,0 +1,86 @@
# veille-ia
Observatoire personnel de veille sur les modèles IA génératifs (sorties, licences, classements), avec moteur de recommandation par profils de projets. Application privée, self-hosted, packagée pour YunoHost. Licence AGPL-3.0.
- **Spécification fonctionnelle** : [`plan_prd_veille_ia.md`](plan_prd_veille_ia.md)
- **Conventions frontend (prioritaires)** : [`SPECS_SVELTE.md`](SPECS_SVELTE.md)
## Structure du dépôt
| Chemin | Contenu |
|---|---|
| `app/` | Application SvelteKit (Svelte 5 runes, TypeScript strict, adapter-node) |
| `veille-ia_ynh/` | Package YunoHost (packaging v2, helpers 2.1) |
| `nodered-flows/` | Flows Node-RED exportés (phase 2 — à venir) |
## Développement local (hors YunoHost)
Prérequis : Node 24 LTS, npm.
```bash
cd app
cp .env.example .env # DEV_USER=dev simule un utilisateur SSO connecté
npm ci
npm run dev
```
Sans `DEV_USER`, l'accueil public minimal est affiché et toute autre route renvoie 401 — comme en production sans header SSO.
### Variables d'environnement
| Variable | Défaut | Rôle |
|---|---|---|
| `DATA_DIR` | `./data` (relatif à `app/`) | Dossier persistant : YAML + git interne. En prod : `/home/yunohost.app/veille-ia` |
| `OLLAMA_URL` | `http://127.0.0.1:11434` | Endpoint Ollama. Optionnel : dégradation gracieuse si injoignable |
| `ALERTS_TOKEN` | *(aucun)* | Token Bearer de `POST /api/alerts`. Généré à l'install YNH, jamais commité |
| `SSO_HEADER` | `ynh-user` | Header HTTP injecté par SSOwat portant l'utilisateur authentifié |
| `DEV_USER` | *(aucun)* | Dev uniquement : simule un utilisateur SSO. Ignoré en production |
| `BASE_PATH` | *(aucun)* | Build uniquement : sous-chemin de montage (ex. `/veille`) pour `paths.base` |
### Qualité (à faire passer avant chaque commit)
```bash
npm run check # svelte-check : 0 erreur, 0 warning
npm run lint # prettier + eslint
npm run test # vitest
npm run build # build adapter-node
```
## Packaging YunoHost (`veille-ia_ynh/`)
Packaging v2 vérifié contre la documentation officielle (août 2026) et le schéma
`manifest.v2.schema.json`. Helpers 2.1 (`ynh_config_add_nginx`, `ynh_config_add_systemd`…).
Ressources : `ports`, `nodejs` (24), `system_user`, `install_dir` (`/var/www/veille-ia`),
`data_dir` (`/home/yunohost.app/veille-ia`). App privée : permission `all_users`,
identité transmise via le header `Ynh-User` (`proxy_params_with_auth`).
### Procédure de release (à suivre avant toute installation)
Le package consomme une **archive de tag** publiée sur la forge :
1. Pousser le dépôt sur `https://labola.o-k-i.net/cyber-mawonaj/veille-ia` (procédure : `doc2sveltekit-transition/GITEA.md` — dépôt créé **sans** initialisation).
2. Taguer : `git tag v0.1.0 && git push gitea v0.1.0`.
3. Télécharger `https://labola.o-k-i.net/cyber-mawonaj/veille-ia/archive/v0.1.0.tar.gz` et calculer son sha256.
4. Mettre à jour `veille-ia_ynh/manifest.toml` : `version = "0.1.0~ynh1"`, `resources.sources.main.url` et `sha256` (le placeholder `TODO_…` actuel bloque volontairement toute installation).
5. Vérifier avec `package_check` (sur une machine YunoHost de test) : viser niveau ≥ 7.
### Installation (sur le serveur)
```bash
yunohost app install /chemin/vers/veille-ia_ynh
# ou une fois publié : yunohost app install https://labola.o-k-i.net/cyber-mawonaj/veille-ia_ynh
```
L'install : déploie l'archive, `npm ci` + build (avec `BASE_PATH` = chemin d'install), génère `ALERTS_TOKEN`, écrit `/var/www/veille-ia/app/.env` (chmod 400), configure nginx + systemd (logs journald).
### Ollama
Optionnel. Si le paquet `ollama_ynh` est indisponible : Ollama sur la machine locale du porteur, exposé au serveur via wireguard/LAN — renseigner `OLLAMA_URL` à l'install (question du manifest) ou dans `/var/www/veille-ia/app/.env`. L'app démarre et fonctionne sans (dégradation gracieuse).
## État d'avancement
- [x] **Phase 0** — socle SvelteKit (SSO, thème OKI, CSP) + packaging YNH + dev local
- [ ] **Phase 1** — registre + profils + moteur de recommandation + export markdown
- [ ] **Phase 2** — inbox alertes + flows Node-RED
- [ ] **Phase 3** — templates ComfyUI + smoke tests
- [ ] **Phase 4** — durcissement (i18n gcf/en, niveau 8 package_check)
+10 -39
View File
@@ -1,42 +1,13 @@
# sv
# veille-ia — application SvelteKit
Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli).
Voir le [README racine](../README.md) pour la vue d'ensemble, le dev local et les variables d'environnement, et [SPECS_SVELTE.md](../SPECS_SVELTE.md) pour les conventions de code (prioritaires sur tout choix frontend).
## Creating a project
If you're seeing this, you've probably already done this step. Congrats!
```sh
# create a new project
npx sv create my-app
```bash
npm ci
npm run dev # dev (DEV_USER=dev dans .env simule le SSO)
npm run check # svelte-check — 0 erreur / 0 warning exigé
npm run lint # prettier + eslint
npm run test # vitest
npm run build # build adapter-node (BASE_PATH=/veille pour un sous-chemin)
node build/index.js
```
To recreate this project with the same configuration:
```sh
# recreate this project
npx sv@0.17.0 create --template minimal --types ts --add prettier eslint vitest="usages:unit" sveltekit-adapter="adapter:node" --install npm app
```
## Developing
Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
```sh
npm run dev
# or start the server and open the app in a new browser tab
npm run dev -- --open
```
## Building
To create a production version of your app:
```sh
npm run build
```
You can preview the production build with `npm run preview`.
> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment.
+11
View File
@@ -0,0 +1,11 @@
# Environnement applicatif de veille-ia (chargé par systemd via EnvironmentFile).
# Régénéré par les scripts du package (ynh_config_add) — ne pas éditer à la main.
# Dossier de données persistant : registre/profils YAML + dépôt git interne.
DATA_DIR=__DATA_DIR__
# Endpoint Ollama (optionnel : dégradation gracieuse si injoignable).
OLLAMA_URL=__OLLAMA_URL__
# Token Bearer protégeant POST /api/alerts (généré à l'install — secret).
ALERTS_TOKEN=__ALERTS_TOKEN__
+14
View File
@@ -0,0 +1,14 @@
#sub_path_only rewrite ^__PATH__$ __PATH__/ permanent;
location __PATH__/ {
# Reverse proxy vers le serveur Node (adapter-node).
# Pas de '/' final à proxy_pass : l'URI complète (avec le sous-chemin) est
# transmise, ce qui correspond au paths.base configuré au build de l'app.
proxy_pass http://127.0.0.1:__PORT__;
# Transmet l'identité SSO (Ynh-User…) après authentification SSOwat, et vide
# ces headers pour les requêtes client (non spoofable).
include proxy_params_with_auth;
client_max_body_size 10M;
}
+41
View File
@@ -0,0 +1,41 @@
[Unit]
Description=Veille IA — observatoire de veille sur les modèles IA (SvelteKit)
After=network.target
[Service]
Type=simple
User=__APP__
Group=__APP__
WorkingDirectory=__INSTALL_DIR__/app
Environment="PATH=__PATH_WITH_NODEJS__"
Environment="NODE_ENV=production"
Environment="HOST=127.0.0.1"
Environment="PORT=__PORT__"
Environment="ORIGIN=https://__DOMAIN____PATH__"
# DATA_DIR, OLLAMA_URL, ALERTS_TOKEN (fichier posé à l'install, chmod 400)
EnvironmentFile=__INSTALL_DIR__/app/.env
ExecStart=__NODEJS_DIR__/node build/index.js
# Logs vers journald : yunohost service log __APP__
StandardOutput=journal
StandardError=journal
SyslogIdentifier=__APP__
# Sandboxing (niveau modéré : le service doit pouvoir lancer git dans le data_dir,
# phase 1 — simple-git — et joindre Ollama en HTTP sortant).
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=full
ProtectKernelModules=yes
ProtectKernelTunables=yes
ProtectControlGroups=yes
RestrictRealtime=yes
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 AF_NETLINK
LockPersonality=yes
SystemCallArchitectures=native
CapabilityBoundingSet=
[Install]
WantedBy=multi-user.target
+17
View File
@@ -0,0 +1,17 @@
## Administration de Veille IA
### Ollama (optionnel)
L'app fonctionne sans Ollama (dégradation gracieuse). Pour activer le classifieur LLM, indiquez l'URL de votre endpoint Ollama à l'install (ou éditez `/var/www/veille-ia/app/.env` puis `systemctl restart veille-ia`). Ollama peut tourner sur une autre machine joignable en HTTP (LAN, wireguard).
### Données
Registre et profils (YAML + git interne) : `/home/yunohost.app/veille-ia`. Sauvegardés par le script de backup standard. Non supprimés à la désinstallation sauf `--purge`.
### Alertes (webhook)
`POST /api/alerts` est protégé par un token Bearer généré à l'install, visible dans `/var/www/veille-ia/app/.env` (`ALERTS_TOKEN`). À configurer côté Node-RED (flows fournis dans le dépôt source, dossier `nodered-flows/`).
### Journaux
`yunohost service log veille-ia` (journald).
+9
View File
@@ -0,0 +1,9 @@
Veille IA is a personal watchtower for generative AI models: releases, licenses, rankings, with a recommendation engine based on project profiles.
- **Model registry**: single source of truth (git-versioned YAML), anti-hallucination rule (unverified field = "to be checked")
- **Project profiles**: legal constraints per production context
- **Recommendation engine**: ranked, justified shortlist with warnings
- **Alert inbox**: events classified by a local LLM (Ollama), pushed from Node-RED
- **Markdown export**: guides and rankings regenerated from the registry
Private application (YunoHost SSO), 100% open source (AGPL-3.0), no paid API.
+9
View File
@@ -0,0 +1,9 @@
Veille IA est un observatoire personnel de veille sur les modèles IA génératifs : sorties, licences, classements, avec un moteur de recommandation par profils de projets.
- **Registre des modèles** : source de vérité unique (YAML versionné git), règle anti-hallucination (champ non vérifié = « à vérifier »)
- **Profils de projets** : contraintes juridiques par contexte de production
- **Moteur de recommandation** : shortlist classée et justifiée, avec warnings
- **Inbox d'alertes** : événements classifiés par un LLM local (Ollama), poussés depuis Node-RED
- **Export markdown** : guides et classements régénérés depuis le registre
Application privée (SSO YunoHost), 100 % open-source (AGPL-3.0), aucune API payante.
+69
View File
@@ -0,0 +1,69 @@
#:schema https://raw.githubusercontent.com/YunoHost/apps/main/schemas/manifest.v2.schema.json
packaging_format = 2
id = "veille-ia"
name = "Veille IA"
description.en = "Personal watchtower for generative AI models (releases, licenses, rankings)"
description.fr = "Observatoire personnel de veille sur les modèles IA génératifs (sorties, licences, classements)"
version = "0.1.0~ynh1"
maintainers = ["cyber-mawonaj"]
[upstream]
license = "AGPL-3.0-or-later"
code = "https://labola.o-k-i.net/cyber-mawonaj/veille-ia"
[integration]
yunohost = ">= 12.1"
helpers_version = "2.1"
architectures = "all"
multi_instance = false
ldap = false
sso = true
disk = "300M"
ram.build = "1G"
ram.runtime = "150M"
[install]
[install.domain]
type = "domain"
[install.path]
type = "path"
default = "/veille"
[install.init_main_permission]
# App privée : "all_users" = SSO requis (remplace l'ancienne question is_public).
type = "group"
default = "all_users"
[install.ollama_url]
ask.fr = "URL de l'endpoint Ollama (optionnel — l'app fonctionne sans, en mode dégradé)"
ask.en = "Ollama endpoint URL (optional — the app works without it, in degraded mode)"
type = "string"
default = "http://127.0.0.1:11434"
optional = true
[resources]
# Archive de l'app, publiée par tag sur la forge (procédure de release : README racine).
# ⚠️ sha256 à recalculer après chaque tag : sha256sum vX.Y.Z.tar.gz
[resources.sources.main]
url = "https://labola.o-k-i.net/cyber-mawonaj/veille-ia/archive/v0.1.0.tar.gz"
sha256 = "TODO_SHA256_A_CALCULER_APRES_LE_TAG_v0.1.0"
autoupdate.strategy = "latest_forgejo_tag"
[resources.system_user]
[resources.install_dir]
[resources.data_dir]
[resources.permissions]
main.url = "/"
[resources.ports]
[resources.nodejs]
version = "24"
+28
View File
@@ -0,0 +1,28 @@
#!/bin/bash
# Variables et fonctions communes aux scripts du package veille-ia_ynh.
# Normalise le chemin YNH pour paths.base de SvelteKit ("/" -> "" ; sinon "/veille").
veille_ia_base_path() {
if [ "$path" = "/" ]; then
echo ""
else
echo "$path"
fi
}
# Installe les dépendances, build l'app (avec le bon sous-chemin), puis élague
# les devDependencies pour ne garder que le runtime.
veille_ia_build_app() {
pushd "$install_dir/app"
ynh_hide_warnings ynh_exec_as_app npm ci
ynh_hide_warnings ynh_exec_as_app env BASE_PATH="$(veille_ia_base_path)" npm run build
ynh_hide_warnings ynh_exec_as_app npm prune --omit=dev
popd
}
# (Re)génère le fichier d'environnement applicatif et verrouille ses droits.
veille_ia_write_env() {
ynh_config_add --template="env" --destination="$install_dir/app/.env"
chmod 400 "$install_dir/app/.env"
chown "$app:$app" "$install_dir/app/.env"
}
+19
View File
@@ -0,0 +1,19 @@
#!/bin/bash
source ../settings/scripts/_common.sh
source /usr/share/yunohost/helpers
ynh_print_info "Déclaration des fichiers à sauvegarder..."
# Code + build + .env (reconstruisible, mais sauvegardé pour une restauration rapide).
ynh_backup "$install_dir"
# Données : registre/profils YAML + dépôt git interne.
# (Ignoré par le backup de sécurité pré-upgrade — comportement standard du cœur.)
ynh_backup "$data_dir"
ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf"
ynh_backup "/etc/systemd/system/$app.service"
ynh_print_info "Sauvegarde de veille-ia terminée"
+42
View File
@@ -0,0 +1,42 @@
#!/bin/bash
source _common.sh
source /usr/share/yunohost/helpers
#=================================================
# STOP SYSTEMD SERVICE
#=================================================
ynh_script_progression "Arrêt du service systemd de veille-ia..."
ynh_systemctl --service="$app" --action="stop"
#=================================================
# UPDATE NGINX CONFIGURATION
#=================================================
ynh_script_progression "Mise à jour de la configuration nginx de veille-ia..."
# $domain/$path pointent déjà vers les nouvelles valeurs ($old_domain/$old_path
# et $change_domain/$change_path sont disponibles si besoin).
ynh_config_change_url_nginx
#=================================================
# RE-BUILD THE APP WITH THE NEW BASE PATH
#=================================================
ynh_script_progression "Re-build de veille-ia pour le nouveau chemin..."
# paths.base est figé au build (SvelteKit) : le changement de chemin impose
# un re-build avec le nouveau BASE_PATH.
veille_ia_build_app
# .env : régénéré pour rester cohérent (ORIGIN systemd suit __DOMAIN____PATH__
# via ynh_config_change_url_nginx ; le .env ne contient pas le domaine).
veille_ia_write_env
#=================================================
# START SYSTEMD SERVICE
#=================================================
ynh_script_progression "Démarrage du service systemd de veille-ia..."
ynh_systemctl --service="$app" --action="start"
ynh_script_progression "Changement d'URL de veille-ia terminé"
+58
View File
@@ -0,0 +1,58 @@
#!/bin/bash
source _common.sh
source /usr/share/yunohost/helpers
#=================================================
# RETRIEVE ARGUMENTS FROM THE MANIFEST AND GENERATE SETTINGS
#=================================================
ynh_script_progression "Récupération des paramètres de veille-ia..."
# Token protégeant POST /api/alerts (webhook Node-RED) — secret généré à l'install.
alerts_token="$(ynh_string_random 48)"
ynh_app_setting_set --key=alerts_token --value="$alerts_token"
#=================================================
# DEPLOY APP FILES
#=================================================
ynh_script_progression "Déploiement des fichiers de veille-ia..."
# Archive du tag de la forge (ressource sources.main du manifest), pré-téléchargée.
ynh_setup_source --dest_dir="$install_dir"
# L'app SvelteKit vit dans le sous-dossier app/ du dépôt.
chown -R "$app:$app" "$install_dir"
#=================================================
# BUILD THE APP
#=================================================
ynh_script_progression "Installation des dépendances et build de veille-ia..."
veille_ia_build_app
#=================================================
# APP CONFIGURATION
#=================================================
ynh_script_progression "Ajout de la configuration de veille-ia..."
veille_ia_write_env
#=================================================
# SYSTEM CONFIGURATION
#=================================================
ynh_script_progression "Ajout de la configuration système pour veille-ia..."
ynh_config_add_nginx
ynh_config_add_systemd
yunohost service add "$app" --description="Observatoire de veille sur les modèles IA"
#=================================================
# START SYSTEMD SERVICE
#=================================================
ynh_script_progression "Démarrage du service systemd de veille-ia..."
ynh_systemctl --service="$app" --action="start"
ynh_script_progression "Installation de veille-ia terminée"
+18
View File
@@ -0,0 +1,18 @@
#!/bin/bash
source _common.sh
source /usr/share/yunohost/helpers
ynh_script_progression "Suppression de la configuration système de veille-ia..."
# Les ressources (user, dossiers, port, nodejs, permissions) sont déprovisionnées
# automatiquement par le cœur après ce script. Le data_dir est conservé sauf --purge.
if ynh_hide_warnings yunohost service status "$app" >/dev/null; then
yunohost service remove "$app"
fi
ynh_config_remove_systemd
ynh_config_remove_nginx
ynh_script_progression "Suppression de veille-ia terminée"
+54
View File
@@ -0,0 +1,54 @@
#!/bin/bash
source ../settings/scripts/_common.sh
source /usr/share/yunohost/helpers
#=================================================
# RESTORE THE APP MAIN DIRECTORY
#=================================================
ynh_script_progression "Restauration du dossier principal de veille-ia..."
# Les ressources (user, dossiers, port, nodejs) sont re-provisionnées par le cœur
# AVANT ce script. $domain, $path, $install_dir, $data_dir… sont rechargés.
ynh_restore "$install_dir"
chown -R "$app:$app" "$install_dir"
#=================================================
# RE-BUILD THE APP
#=================================================
ynh_script_progression "Réinstallation des dépendances et build de veille-ia..."
# Le build restauré est régénéré proprement (version de node, sous-chemin).
veille_ia_build_app
veille_ia_write_env
#=================================================
# RESTORE THE DATA DIRECTORY
#=================================================
ynh_script_progression "Restauration du dossier de données de veille-ia..."
ynh_restore "$data_dir"
chown -R "$app:$app" "$data_dir"
#=================================================
# RESTORE SYSTEM CONFIGURATIONS
#=================================================
ynh_script_progression "Restauration de la configuration système de veille-ia..."
ynh_restore "/etc/nginx/conf.d/$domain.d/$app.conf"
ynh_restore "/etc/systemd/system/$app.service"
systemctl enable "$app.service" --quiet
yunohost service add "$app" --description="Observatoire de veille sur les modèles IA"
#=================================================
# RELOAD NGINX AND START THE APP
#=================================================
ynh_script_progression "Rechargement de nginx et démarrage de veille-ia..."
ynh_systemctl --service="$app" --action="start"
ynh_systemctl --service=nginx --action=reload
ynh_script_progression "Restauration de veille-ia terminée"
+67
View File
@@ -0,0 +1,67 @@
#!/bin/bash
source _common.sh
source /usr/share/yunohost/helpers
#=================================================
# STOP SYSTEMD SERVICE
#=================================================
ynh_script_progression "Arrêt du service systemd de veille-ia..."
ynh_systemctl --service="$app" --action="stop"
#=================================================
# ENSURE DOWNWARD COMPATIBILITY
#=================================================
ynh_script_progression "Vérification des paramètres de veille-ia..."
# Token d'alertes : créé à l'install ; le régénère si absent (installs anciennes).
if [ -z "${alerts_token:-}" ]; then
alerts_token="$(ynh_string_random 48)"
ynh_app_setting_set --key=alerts_token --value="$alerts_token"
fi
#=================================================
# UPGRADE SOURCE FILES
#=================================================
ynh_script_progression "Mise à jour des fichiers de veille-ia..."
# Un backup de sécurité a déjà été réalisé par le cœur. Remplacement complet :
# le .env est régénéré juste après depuis les settings persistants.
ynh_setup_source --dest_dir="$install_dir" --full_replace
chown -R "$app:$app" "$install_dir"
#=================================================
# RE-BUILD THE APP
#=================================================
ynh_script_progression "Installation des dépendances et build de veille-ia..."
veille_ia_build_app
#=================================================
# UPDATE APP CONFIGURATION
#=================================================
ynh_script_progression "Mise à jour de la configuration de veille-ia..."
veille_ia_write_env
#=================================================
# UPDATE SYSTEM CONFIGURATION
#=================================================
ynh_script_progression "Mise à jour de la configuration système pour veille-ia..."
ynh_config_add_nginx
ynh_config_add_systemd
yunohost service add "$app" --description="Observatoire de veille sur les modèles IA"
#=================================================
# START SYSTEMD SERVICE
#=================================================
ynh_script_progression "Démarrage du service systemd de veille-ia..."
ynh_systemctl --service="$app" --action="start"
ynh_script_progression "Mise à jour de veille-ia terminée"
+7
View File
@@ -0,0 +1,7 @@
#:schema https://raw.githubusercontent.com/YunoHost/apps/main/schemas/tests.v1.schema.json
test_format = 1.0
# Le minimum suffit : les tests (install.root, install.subdir, backup_restore,
# upgrade, change_url…) sont déduits automatiquement du manifest.
[default]