Installation & Démarrage Local
📋 Prérequis
- Node.js 24 :
nvm uselit la version dans.nvmrc, et lepackage.jsonracine exige au moins 24.11, première LTS de la branche. Les versions antérieures ne sont pas prises en charge : sous Node 20, l'ingestion décode mal les exports windows-1252 de l'Assemblée, et sous Node 18 sa CLI plante au chargement deundici. - pnpm 8 (
packageManager: pnpm@8.15.0). - Docker et Docker Compose, pour PostgreSQL et Redis.
- (Facultatif) poppler-utils (commande
pdftotext), seulement pour ingérer les comptes rendus de réunion de commission de l'Assemblée, publiés en PDF.
⚡ Installation
Code
Les valeurs par défaut de .env.example pointent déjà vers les conteneurs locaux (postgresql://clair:clair_dev@localhost:5432/clair, redis://localhost:6379). Le frontend n'a besoin d'aucune variable en local : NEXT_PUBLIC_API_URL vaut http://localhost:3001 par défaut.
db pushet nonmigrate: l'historique de migrations du dépôt n'est pas rejouable sur une base vierge (la migration20260313_add_sujetsréférence une table créée par une migration ultérieure). Pour toute base neuve, locale ou de CI, le schéma s'applique avecdb push. Voir Modèle Prisma.Les triggers ne passent pas par
prisma db push, qui ne les connaît pas.pnpm db:pushenchaîne doncprisma db pushetpnpm db:triggers, qui joueapps/api/prisma/triggers.sql(sans psql, idempotent). Après unprisma db pushlancé à la main, rejouerpnpm db:triggers: sans ses triggers, la base ne tient pasupdated_atcomme la production (voir Suivi des modifications), etcheck-qualityle signale.
Pour ne lancer que la documentation : pnpm dev:docs (port 3002). Elle télécharge la spécification OpenAPI de l'API de production ; sans accès réseau, elle garde la dernière copie téléchargée.
🗃️ Remplir la base
La base est vide après db push. Deux possibilités :
Code
La synchronisation complète écrit des millions de lignes (voir la volumétrie sur la page Modèle Prisma) ; en production, son processus Node tourne avec 6 Go de tas (--max-old-space-size=6144). Pour démarrer plus petit, les commandes sync ciblées acceptent une limite, par exemple pnpm ingestion:sync -p (parlementaires) puis pnpm ingestion:sync -s -l 50 (50 scrutins). Voir Commandes CLI.
Sans MISTRAL_API_KEY, l'enrichissement IA est sauté avec un avertissement ; le reste de la synchronisation fonctionne.
🔍 Vérifier
- Site : http://localhost:3000
- API : http://localhost:3001/health
- Swagger UI de l'API : http://localhost:3001/docs
- Documentation : http://localhost:3002
- Qualité des données :
pnpm --filter @clair/ingestion check-quality(voir Qualité des données)