From c6caa5024fe2b674df37780e7e35002ed1a87c37 Mon Sep 17 00:00:00 2001 From: cyber-mawonaj Date: Sat, 1 Aug 2026 09:44:31 -0400 Subject: [PATCH] chore : import initial du package veille-ia-gen_ynh (packaging v2, helpers 2.1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extrait du dépôt veille-ia-gen (socle phase 0). manifest validé contre le schéma officiel manifest.v2.schema.json ; sha256 de l'archive sources en placeholder jusqu'à la release v0.1.0. --- .gitignore | 3 ++ conf/env | 11 +++++++ conf/nginx.conf | 14 +++++++++ conf/systemd.service | 41 +++++++++++++++++++++++++ doc/ADMIN_fr.md | 17 +++++++++++ doc/DESCRIPTION.md | 9 ++++++ doc/DESCRIPTION_fr.md | 9 ++++++ manifest.toml | 69 +++++++++++++++++++++++++++++++++++++++++++ scripts/_common.sh | 28 ++++++++++++++++++ scripts/backup | 19 ++++++++++++ scripts/change_url | 42 ++++++++++++++++++++++++++ scripts/install | 58 ++++++++++++++++++++++++++++++++++++ scripts/remove | 18 +++++++++++ scripts/restore | 54 +++++++++++++++++++++++++++++++++ scripts/upgrade | 67 +++++++++++++++++++++++++++++++++++++++++ tests.toml | 7 +++++ 16 files changed, 466 insertions(+) create mode 100644 .gitignore create mode 100644 conf/env create mode 100644 conf/nginx.conf create mode 100644 conf/systemd.service create mode 100644 doc/ADMIN_fr.md create mode 100644 doc/DESCRIPTION.md create mode 100644 doc/DESCRIPTION_fr.md create mode 100644 manifest.toml create mode 100644 scripts/_common.sh create mode 100755 scripts/backup create mode 100755 scripts/change_url create mode 100755 scripts/install create mode 100755 scripts/remove create mode 100755 scripts/restore create mode 100755 scripts/upgrade create mode 100644 tests.toml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4cd220a --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +README.html +*.log +.DS_Store diff --git a/conf/env b/conf/env new file mode 100644 index 0000000..d8ee1f1 --- /dev/null +++ b/conf/env @@ -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__ diff --git a/conf/nginx.conf b/conf/nginx.conf new file mode 100644 index 0000000..cf93e4f --- /dev/null +++ b/conf/nginx.conf @@ -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; +} diff --git a/conf/systemd.service b/conf/systemd.service new file mode 100644 index 0000000..2efcf61 --- /dev/null +++ b/conf/systemd.service @@ -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 diff --git a/doc/ADMIN_fr.md b/doc/ADMIN_fr.md new file mode 100644 index 0000000..0988f27 --- /dev/null +++ b/doc/ADMIN_fr.md @@ -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). diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md new file mode 100644 index 0000000..d10cdbb --- /dev/null +++ b/doc/DESCRIPTION.md @@ -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. diff --git a/doc/DESCRIPTION_fr.md b/doc/DESCRIPTION_fr.md new file mode 100644 index 0000000..dc5b113 --- /dev/null +++ b/doc/DESCRIPTION_fr.md @@ -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. diff --git a/manifest.toml b/manifest.toml new file mode 100644 index 0000000..b86ee46 --- /dev/null +++ b/manifest.toml @@ -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-gen" + +[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-gen/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" diff --git a/scripts/_common.sh b/scripts/_common.sh new file mode 100644 index 0000000..5c57015 --- /dev/null +++ b/scripts/_common.sh @@ -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" +} diff --git a/scripts/backup b/scripts/backup new file mode 100755 index 0000000..a7a3115 --- /dev/null +++ b/scripts/backup @@ -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" diff --git a/scripts/change_url b/scripts/change_url new file mode 100755 index 0000000..79f0f81 --- /dev/null +++ b/scripts/change_url @@ -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é" diff --git a/scripts/install b/scripts/install new file mode 100755 index 0000000..94e17a6 --- /dev/null +++ b/scripts/install @@ -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" diff --git a/scripts/remove b/scripts/remove new file mode 100755 index 0000000..66ca397 --- /dev/null +++ b/scripts/remove @@ -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" diff --git a/scripts/restore b/scripts/restore new file mode 100755 index 0000000..6d06bff --- /dev/null +++ b/scripts/restore @@ -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" diff --git a/scripts/upgrade b/scripts/upgrade new file mode 100755 index 0000000..499115e --- /dev/null +++ b/scripts/upgrade @@ -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" diff --git a/tests.toml b/tests.toml new file mode 100644 index 0000000..3a50838 --- /dev/null +++ b/tests.toml @@ -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]