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:
Executable
+113
@@ -0,0 +1,113 @@
|
||||
#!/bin/bash
|
||||
|
||||
#=================================================
|
||||
# FONCTIONS COMMUNES AUX SCRIPTS DU PAQUET
|
||||
#=================================================
|
||||
|
||||
# Description affichée dans la liste des services YunoHost.
|
||||
readonly DESCRIPTION_SERVICE="Vèy Lalwa — veille législative Gwadloup"
|
||||
|
||||
#=================================================
|
||||
# CONSTRUCTION DE L'APPLICATION WEB
|
||||
#=================================================
|
||||
construire_application_web() {
|
||||
pushd "$install_dir/web" || ynh_die "Répertoire web/ absent de l'archive"
|
||||
|
||||
# `npm ci` respecte le verrou de versions ; `npm install` ne le
|
||||
# garantit pas et rendrait deux installations non reproductibles.
|
||||
ynh_hide_warnings ynh_exec_as_app npm ci
|
||||
|
||||
# Les polices Archivo et Inter sont copiées depuis node_modules vers
|
||||
# static/. Sans cette étape, la page appellerait des polices absentes —
|
||||
# et la politique de sécurité de contenu interdit tout hôte tiers, donc
|
||||
# aucun repli n'est possible.
|
||||
ynh_hide_warnings ynh_exec_as_app npm run polices
|
||||
|
||||
ynh_hide_warnings ynh_exec_as_app npm run build
|
||||
|
||||
# Les dépendances de développement pèsent l'essentiel de node_modules et
|
||||
# ne servent plus une fois le build produit. On garde better-sqlite3,
|
||||
# qui est une dépendance d'exécution.
|
||||
ynh_hide_warnings ynh_exec_as_app npm prune --omit=dev
|
||||
popd || true
|
||||
}
|
||||
|
||||
#=================================================
|
||||
# ENVIRONNEMENT PYTHON DU PIPELINE
|
||||
#=================================================
|
||||
construire_environnement_python() {
|
||||
# Environnement virtuel dédié : on n'installe jamais dans le Python système
|
||||
# d'une machine YunoHost, qui sert aussi à YunoHost lui-même.
|
||||
ynh_exec_as_app python3 -m venv "$install_dir/venv"
|
||||
|
||||
ynh_hide_warnings ynh_exec_as_app "$install_dir/venv/bin/pip" install \
|
||||
--upgrade pip setuptools wheel
|
||||
|
||||
# Installation depuis le pyproject embarqué, sans les extras de
|
||||
# développement : ni pytest ni ruff n'ont leur place en production.
|
||||
pushd "$install_dir" || ynh_die "Répertoire d'installation introuvable"
|
||||
ynh_hide_warnings ynh_exec_as_app "$install_dir/venv/bin/pip" install .
|
||||
popd || true
|
||||
}
|
||||
|
||||
#=================================================
|
||||
# BASE DE DONNÉES
|
||||
#=================================================
|
||||
|
||||
# Vrai si la base existe déjà et contient des textes.
|
||||
base_deja_remplie() {
|
||||
[ -s "$data_dir/veille.db" ] &&
|
||||
[ "$(sqlite3 "$data_dir/veille.db" \
|
||||
"SELECT COUNT(*) FROM textes" 2>/dev/null || echo 0)" -gt 0 ]
|
||||
}
|
||||
|
||||
# Remplit la base depuis le corpus de recherche embarqué dans l'archive.
|
||||
# Idempotent : relancer le seed ne duplique rien.
|
||||
remplir_la_base() {
|
||||
pushd "$install_dir" || ynh_die "Répertoire d'installation introuvable"
|
||||
ynh_exec_as_app env \
|
||||
VEILLE_RACINE="$install_dir" \
|
||||
VEILLE_DB="$data_dir/veille.db" \
|
||||
VEILLE_CACHE="$data_dir/cache_http" \
|
||||
VEILLE_DUMP_JSON="$data_dir/textes.json" \
|
||||
"$install_dir/venv/bin/python" -m pipeline.seed_from_research
|
||||
popd || true
|
||||
}
|
||||
|
||||
# Applique les migrations en attente, sans toucher aux données.
|
||||
migrer_la_base() {
|
||||
pushd "$install_dir" || ynh_die "Répertoire d'installation introuvable"
|
||||
ynh_exec_as_app env \
|
||||
VEILLE_RACINE="$install_dir" \
|
||||
VEILLE_DB="$data_dir/veille.db" \
|
||||
"$install_dir/venv/bin/python" -m pipeline.db
|
||||
popd || true
|
||||
}
|
||||
|
||||
#=================================================
|
||||
# UNITÉS SYSTEMD SUPPLÉMENTAIRES
|
||||
#=================================================
|
||||
# `ynh_config_add_systemd` ne gère que l'unité principale `$app.service`. Le
|
||||
# passage de collecte et son minuteur sont donc posés à la main.
|
||||
|
||||
installer_le_minuteur() {
|
||||
ynh_config_add --template="pipeline.service" \
|
||||
--destination="/etc/systemd/system/$app-pipeline.service"
|
||||
ynh_config_add --template="pipeline.timer" \
|
||||
--destination="/etc/systemd/system/$app-pipeline.timer"
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable "$app-pipeline.timer" --quiet
|
||||
systemctl start "$app-pipeline.timer"
|
||||
}
|
||||
|
||||
retirer_le_minuteur() {
|
||||
if systemctl list-unit-files "$app-pipeline.timer" --quiet >/dev/null 2>&1; then
|
||||
systemctl stop "$app-pipeline.timer" 2>/dev/null || true
|
||||
systemctl disable "$app-pipeline.timer" --quiet 2>/dev/null || true
|
||||
fi
|
||||
|
||||
ynh_safe_rm "/etc/systemd/system/$app-pipeline.timer"
|
||||
ynh_safe_rm "/etc/systemd/system/$app-pipeline.service"
|
||||
systemctl daemon-reload
|
||||
}
|
||||
Executable
+44
@@ -0,0 +1,44 @@
|
||||
#!/bin/bash
|
||||
|
||||
#=================================================
|
||||
# IMPORT GENERIC HELPERS
|
||||
#=================================================
|
||||
|
||||
source _common.sh
|
||||
source /usr/share/yunohost/helpers
|
||||
|
||||
ynh_print_info "Déclaration des fichiers à sauvegarder…"
|
||||
|
||||
#=================================================
|
||||
# BACKUP THE APP MAIN DIR
|
||||
#=================================================
|
||||
|
||||
ynh_backup "$install_dir"
|
||||
|
||||
#=================================================
|
||||
# BACKUP THE DATA DIR
|
||||
#=================================================
|
||||
# C'est ici que vit tout le travail de veille accumulé : la base, son historique
|
||||
# de passages et son cache. Le reste se reconstruit, pas ça.
|
||||
#
|
||||
# Le cache HTTP est volontairement exclu : il se régénère seul, se périme en
|
||||
# six heures, et alourdirait l'archive pour rien.
|
||||
|
||||
ynh_backup "$data_dir/veille.db"
|
||||
[ -f "$data_dir/textes.json" ] && ynh_backup "$data_dir/textes.json"
|
||||
|
||||
#=================================================
|
||||
# BACKUP SYSTEM CONFIGURATION
|
||||
#=================================================
|
||||
|
||||
ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf"
|
||||
ynh_backup "/etc/systemd/system/$app.service"
|
||||
ynh_backup "/etc/systemd/system/$app-pipeline.service"
|
||||
ynh_backup "/etc/systemd/system/$app-pipeline.timer"
|
||||
ynh_backup "/etc/logrotate.d/$app"
|
||||
|
||||
#=================================================
|
||||
# END OF SCRIPT
|
||||
#=================================================
|
||||
|
||||
ynh_print_info "Sauvegarde de $app déclarée. (YunoHost copie maintenant ces fichiers dans l'archive.)"
|
||||
Executable
+49
@@ -0,0 +1,49 @@
|
||||
#!/bin/bash
|
||||
|
||||
#=================================================
|
||||
# IMPORT GENERIC HELPERS
|
||||
#=================================================
|
||||
|
||||
source _common.sh
|
||||
source /usr/share/yunohost/helpers
|
||||
|
||||
#=================================================
|
||||
# STOP SYSTEMD SERVICE
|
||||
#=================================================
|
||||
ynh_script_progression "Arrêt de $app…"
|
||||
|
||||
ynh_systemctl --service="$app" --action="stop" --log_path="/var/log/$app/$app.log"
|
||||
|
||||
#=================================================
|
||||
# MODIFY URL IN NGINX CONF
|
||||
#=================================================
|
||||
ynh_script_progression "Mise à jour de la configuration NGINX…"
|
||||
|
||||
ynh_config_change_url_nginx
|
||||
|
||||
#=================================================
|
||||
# UPDATE THE CONFIGURATION
|
||||
#=================================================
|
||||
ynh_script_progression "Mise à jour de la configuration de $app…"
|
||||
|
||||
# $domain porte désormais le nouveau domaine. Deux valeurs en dépendent :
|
||||
# ORIGIN, sans lequel adapter-node refuserait les soumissions de formulaire, et
|
||||
# le user-agent des collecteurs, qui annonce l'adresse du site aux services
|
||||
# publics interrogés.
|
||||
ynh_config_add --template="env" --destination="$install_dir/.env"
|
||||
chown "$app:$app" "$install_dir/.env"
|
||||
chmod 600 "$install_dir/.env"
|
||||
|
||||
#=================================================
|
||||
# START SYSTEMD SERVICE
|
||||
#=================================================
|
||||
ynh_script_progression "Démarrage de $app…"
|
||||
|
||||
ynh_systemctl --service="$app" --action="start" --wait_until="Listening" \
|
||||
--log_path="/var/log/$app/$app.log"
|
||||
|
||||
#=================================================
|
||||
# END OF SCRIPT
|
||||
#=================================================
|
||||
|
||||
ynh_script_progression "Changement d'URL de $app terminé"
|
||||
Executable
+80
@@ -0,0 +1,80 @@
|
||||
#!/bin/bash
|
||||
|
||||
#=================================================
|
||||
# IMPORT GENERIC HELPERS
|
||||
#=================================================
|
||||
|
||||
source _common.sh
|
||||
source /usr/share/yunohost/helpers
|
||||
|
||||
#=================================================
|
||||
# DOWNLOAD, CHECK AND UNPACK SOURCE
|
||||
#=================================================
|
||||
ynh_script_progression "Mise en place des fichiers…"
|
||||
|
||||
ynh_setup_source --dest_dir="$install_dir"
|
||||
|
||||
chown -R "$app:$app" "$install_dir"
|
||||
chown -R "$app:$app" "$data_dir"
|
||||
|
||||
#=================================================
|
||||
# APP INITIAL CONFIGURATION
|
||||
#=================================================
|
||||
ynh_script_progression "Écriture de la configuration de $app…"
|
||||
|
||||
# Le fichier .env est écrit AVANT la construction : les deux services le
|
||||
# lisent, et le pipeline en tire l'emplacement de la base.
|
||||
ynh_config_add --template="env" --destination="$install_dir/.env"
|
||||
chown "$app:$app" "$install_dir/.env"
|
||||
chmod 600 "$install_dir/.env"
|
||||
|
||||
#=================================================
|
||||
# BUILD THE APP
|
||||
#=================================================
|
||||
ynh_script_progression "Construction de l'application web (quelques minutes)…"
|
||||
|
||||
construire_application_web
|
||||
|
||||
ynh_script_progression "Installation de l'environnement Python du pipeline…"
|
||||
|
||||
construire_environnement_python
|
||||
|
||||
#=================================================
|
||||
# SEED THE DATABASE
|
||||
#=================================================
|
||||
ynh_script_progression "Remplissage de la base depuis le corpus de recherche…"
|
||||
|
||||
remplir_la_base
|
||||
|
||||
#=================================================
|
||||
# SYSTEM CONFIGURATION
|
||||
#=================================================
|
||||
ynh_script_progression "Configuration système…"
|
||||
|
||||
mkdir -p "/var/log/$app"
|
||||
chown -R "$app:$app" "/var/log/$app"
|
||||
|
||||
ynh_config_add_nginx
|
||||
|
||||
ynh_config_add_systemd
|
||||
yunohost service add "$app" --description="$DESCRIPTION_SERVICE" \
|
||||
--log="/var/log/$app/$app.log"
|
||||
|
||||
# Passage de collecte et son minuteur — deux fois par jour, plus le dimanche.
|
||||
installer_le_minuteur
|
||||
|
||||
ynh_config_add_logrotate
|
||||
|
||||
#=================================================
|
||||
# START SYSTEMD SERVICE
|
||||
#=================================================
|
||||
ynh_script_progression "Démarrage de $app…"
|
||||
|
||||
ynh_systemctl --service="$app" --action="start" --wait_until="Listening" \
|
||||
--log_path="/var/log/$app/$app.log"
|
||||
|
||||
#=================================================
|
||||
# END OF SCRIPT
|
||||
#=================================================
|
||||
|
||||
ynh_script_progression "Installation de $app terminée"
|
||||
Executable
+35
@@ -0,0 +1,35 @@
|
||||
#!/bin/bash
|
||||
|
||||
#=================================================
|
||||
# IMPORT GENERIC HELPERS
|
||||
#=================================================
|
||||
|
||||
source _common.sh
|
||||
source /usr/share/yunohost/helpers
|
||||
|
||||
#=================================================
|
||||
# REMOVE SYSTEM CONFIGURATION
|
||||
#=================================================
|
||||
ynh_script_progression "Retrait de la configuration système de $app…"
|
||||
|
||||
# Le minuteur d'abord : inutile de déclencher un passage de collecte pendant
|
||||
# qu'on démonte le reste.
|
||||
retirer_le_minuteur
|
||||
|
||||
ynh_config_remove_logrotate
|
||||
|
||||
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_safe_rm "/var/log/$app"
|
||||
|
||||
#=================================================
|
||||
# END OF SCRIPT
|
||||
#=================================================
|
||||
|
||||
ynh_script_progression "Suppression de $app terminée"
|
||||
Executable
+71
@@ -0,0 +1,71 @@
|
||||
#!/bin/bash
|
||||
|
||||
#=================================================
|
||||
# IMPORT GENERIC HELPERS
|
||||
#=================================================
|
||||
|
||||
source _common.sh
|
||||
source /usr/share/yunohost/helpers
|
||||
|
||||
#=================================================
|
||||
# RESTORE THE APP MAIN DIR
|
||||
#=================================================
|
||||
ynh_script_progression "Restauration des fichiers de $app…"
|
||||
|
||||
ynh_restore "$install_dir"
|
||||
|
||||
chown -R "$app:$app" "$install_dir"
|
||||
|
||||
#=================================================
|
||||
# RESTORE THE DATA DIR
|
||||
#=================================================
|
||||
ynh_script_progression "Restauration de la base de veille…"
|
||||
|
||||
ynh_restore "$data_dir/veille.db"
|
||||
ynh_restore "$data_dir/textes.json"
|
||||
|
||||
mkdir -p "$data_dir/cache_http"
|
||||
chown -R "$app:$app" "$data_dir"
|
||||
|
||||
# Le schéma peut avoir évolué entre la sauvegarde et la restauration : les
|
||||
# migrations sont rejouées, elles sont idempotentes.
|
||||
migrer_la_base
|
||||
|
||||
#=================================================
|
||||
# RESTORE SYSTEM CONFIGURATION
|
||||
#=================================================
|
||||
ynh_script_progression "Restauration de la configuration système…"
|
||||
|
||||
ynh_restore "/etc/nginx/conf.d/$domain.d/$app.conf"
|
||||
|
||||
ynh_restore "/etc/systemd/system/$app.service"
|
||||
systemctl enable "$app.service" --quiet
|
||||
|
||||
ynh_restore "/etc/systemd/system/$app-pipeline.service"
|
||||
ynh_restore "/etc/systemd/system/$app-pipeline.timer"
|
||||
systemctl daemon-reload
|
||||
systemctl enable "$app-pipeline.timer" --quiet
|
||||
systemctl start "$app-pipeline.timer"
|
||||
|
||||
yunohost service add "$app" --description="$DESCRIPTION_SERVICE" \
|
||||
--log="/var/log/$app/$app.log"
|
||||
|
||||
mkdir -p "/var/log/$app"
|
||||
chown -R "$app:$app" "/var/log/$app"
|
||||
ynh_restore "/etc/logrotate.d/$app"
|
||||
|
||||
#=================================================
|
||||
# RELOAD NGINX AND START THE APP SERVICE
|
||||
#=================================================
|
||||
ynh_script_progression "Rechargement de NGINX et démarrage de $app…"
|
||||
|
||||
ynh_systemctl --service="$app" --action="start" --wait_until="Listening" \
|
||||
--log_path="/var/log/$app/$app.log"
|
||||
|
||||
ynh_systemctl --service=nginx --action=reload
|
||||
|
||||
#=================================================
|
||||
# END OF SCRIPT
|
||||
#=================================================
|
||||
|
||||
ynh_script_progression "Restauration de $app terminée"
|
||||
Executable
+97
@@ -0,0 +1,97 @@
|
||||
#!/bin/bash
|
||||
|
||||
#=================================================
|
||||
# IMPORT GENERIC HELPERS
|
||||
#=================================================
|
||||
|
||||
source _common.sh
|
||||
source /usr/share/yunohost/helpers
|
||||
|
||||
#=================================================
|
||||
# STOP SYSTEMD SERVICE
|
||||
#=================================================
|
||||
ynh_script_progression "Arrêt de $app…"
|
||||
|
||||
# Le minuteur est arrêté aussi : un passage de collecte qui démarrerait pendant
|
||||
# le remplacement des fichiers travaillerait sur un arbre à moitié écrit.
|
||||
systemctl stop "$app-pipeline.timer" 2>/dev/null || true
|
||||
|
||||
ynh_systemctl --service="$app" --action="stop" --log_path="/var/log/$app/$app.log"
|
||||
|
||||
#=================================================
|
||||
# DOWNLOAD, CHECK AND UNPACK SOURCE
|
||||
#=================================================
|
||||
ynh_script_progression "Mise à jour des fichiers…"
|
||||
|
||||
# --full_replace efface intégralement $install_dir. C'est sans risque ici : la
|
||||
# base, le cache et l'export vivent dans $data_dir, qui n'est pas touché.
|
||||
ynh_setup_source --dest_dir="$install_dir" --full_replace
|
||||
|
||||
chown -R "$app:$app" "$install_dir"
|
||||
chown -R "$app:$app" "$data_dir"
|
||||
|
||||
#=================================================
|
||||
# UPDATE CONFIGURATION
|
||||
#=================================================
|
||||
ynh_script_progression "Mise à jour de la configuration…"
|
||||
|
||||
ynh_config_add --template="env" --destination="$install_dir/.env"
|
||||
chown "$app:$app" "$install_dir/.env"
|
||||
chmod 600 "$install_dir/.env"
|
||||
|
||||
#=================================================
|
||||
# REBUILD
|
||||
#=================================================
|
||||
ynh_script_progression "Reconstruction de l'application web (quelques minutes)…"
|
||||
|
||||
construire_application_web
|
||||
|
||||
ynh_script_progression "Reconstruction de l'environnement Python…"
|
||||
|
||||
construire_environnement_python
|
||||
|
||||
#=================================================
|
||||
# DATABASE
|
||||
#=================================================
|
||||
if base_deja_remplie; then
|
||||
ynh_script_progression "Application des migrations, données conservées…"
|
||||
migrer_la_base
|
||||
else
|
||||
# Cas d'une base perdue ou d'une première mise à jour depuis une version
|
||||
# qui la rangeait ailleurs : on repart du corpus plutôt que de laisser
|
||||
# l'application sans données.
|
||||
ynh_script_progression "Base absente : remplissage depuis le corpus…"
|
||||
remplir_la_base
|
||||
fi
|
||||
|
||||
#=================================================
|
||||
# REAPPLY SYSTEM CONFIGURATION
|
||||
#=================================================
|
||||
ynh_script_progression "Mise à jour de la configuration système…"
|
||||
|
||||
mkdir -p "/var/log/$app"
|
||||
chown -R "$app:$app" "/var/log/$app"
|
||||
|
||||
ynh_config_add_nginx
|
||||
|
||||
ynh_config_add_systemd
|
||||
yunohost service add "$app" --description="$DESCRIPTION_SERVICE" \
|
||||
--log="/var/log/$app/$app.log"
|
||||
|
||||
installer_le_minuteur
|
||||
|
||||
ynh_config_add_logrotate
|
||||
|
||||
#=================================================
|
||||
# START SYSTEMD SERVICE
|
||||
#=================================================
|
||||
ynh_script_progression "Démarrage de $app…"
|
||||
|
||||
ynh_systemctl --service="$app" --action="start" --wait_until="Listening" \
|
||||
--log_path="/var/log/$app/$app.log"
|
||||
|
||||
#=================================================
|
||||
# END OF SCRIPT
|
||||
#=================================================
|
||||
|
||||
ynh_script_progression "Mise à jour de $app terminée"
|
||||
Reference in New Issue
Block a user