Files
veye-lalwa_ynh/scripts/_common.sh
T
Cyber MawonajandClaude Opus 5 07b349be86 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>
2026-07-25 23:33:28 -04:00

114 lines
4.2 KiB
Bash
Executable File

#!/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
}