Files
veye-lalwa_ynh/doc/ADMIN.md
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

95 lines
3.4 KiB
Markdown

# Administration de Vèy Lalwa
## Où sont les choses
| Quoi | Où |
|---|---|
| Code et application construite | `__INSTALL_DIR__` |
| Base de veille, cache, export JSON | `__DATA_DIR__` |
| Configuration (identifiants compris) | `__INSTALL_DIR__/.env`, mode 600 |
| Journal de l'application web | `/var/log/__APP__/__APP__.log` |
| Journal des passages de collecte | `/var/log/__APP__/pipeline.log` |
Tout ce qui compte vit dans `__DATA_DIR__` : le répertoire d'installation est **intégralement remplacé** à chaque mise à jour.
## Le pipeline
Deux passages par jour, à 6 h et 18 h, plus un le dimanche à 9 h pour rattraper le Journal officiel de fin de semaine. Une dispersion de quinze minutes évite de frapper Légifrance en même temps que tout le monde.
```bash
# Déclencher un passage tout de suite
systemctl start __APP__-pipeline.service
# Suivre ce qu'il fait
journalctl -u __APP__-pipeline -f
# Voir la prochaine échéance
systemctl list-timers __APP__-pipeline.timer
```
### Voir ce que le pipeline changerait, sans rien écrire
```bash
cd __INSTALL_DIR__
sudo -u __APP__ bash -c 'set -a; . ./.env; set +a; \
./venv/bin/python -m pipeline.update --dry-run'
```
(`set -a` exporte automatiquement ce que le fichier définit ; `xargs` échouerait
sur les valeurs contenant des espaces.)
Le rapport liste chaque écart avec son ancienne et sa nouvelle valeur. **Commencez toujours par là** avant de soupçonner un problème.
## Identifiants Légifrance
L'application fonctionne sans. Le rapport de passage indique alors :
```
legifrance ignoré — LEGIFRANCE_CLIENT_ID absent de .env — repli sur
l'Assemblée nationale, le Sénat et le Conseil constitutionnel
```
Pour les ajouter, éditez `__INSTALL_DIR__/.env`, puis `systemctl start __APP__-pipeline.service`.
**Le piège** : une application PISTE affiche deux couples de valeurs.
| Ce que PISTE affiche | À utiliser |
|---|---|
| **Client ID** / **Client secret** | ✅ oui |
| API key / API key secret | ❌ non — `invalid_client` |
Second piège : les identifiants de production ne fonctionnent pas en bac à sable, qui exige une application distincte.
## Sauvegarde
La sauvegarde YunoHost couvre la base et la configuration. À la main :
```bash
sqlite3 __DATA_DIR__/veille.db ".backup /sauvegardes/veille-$(date +%F).db"
```
N'utilisez jamais `cp` pendant un passage : le mode WAL laisse des fichiers annexes que `.backup` gère correctement.
## Diagnostic
| Symptôme | Piste |
|---|---|
| Page blanche, 502 | `systemctl status __APP__` puis `tail /var/log/__APP__/__APP__.log` |
| « Base introuvable » | La base a disparu de `__DATA_DIR__`. Rejouez le remplissage (voir plus bas). |
| Formulaire de recherche refusé | `ORIGIN` dans `.env` ne correspond plus au domaine servi |
| Aucun texte nouveau depuis des semaines | Normal hors session parlementaire. Vérifiez avec `--dry-run`. |
| `invalid_client` dans le journal | Clé d'API utilisée au lieu du couple OAuth, ou application non abonnée à l'API Légifrance |
### Reconstruire la base depuis le corpus
Le corpus de recherche est embarqué dans l'archive : la base peut toujours être reconstruite, sans réseau.
```bash
cd __INSTALL_DIR__
sudo -u __APP__ bash -c 'set -a; . ./.env; set +a; \
./venv/bin/python -m pipeline.seed_from_research --repartir-de-zero'
systemctl restart __APP__
```
Vous perdrez l'historique des passages, pas les 52 textes du corpus.