Application de dépôt automatisé de documents métier.
Le projet est initialisé en monorepo avec pnpm et Turbo. Il contient actuellement :
apps/api: API NestJS ;apps/web: frontend Angular ;apps/worker: workers BullMQ ;packages/database: schéma, migrations, seed et client Prisma partagés ;docs: documentation VitePress ;sso: simulateur SSO local avec Keycloak SAML et OpenLDAP ;turbo.json: configuration des tâches monorepo ;pnpm-workspace.yaml: déclaration des workspaces pnpm.
- Node.js, via
nvm. - pnpm
11.8.0. - Docker et Docker Compose, pour les services techniques locaux.
La version Node attendue est indiquée dans .nvmrc.
nvm useSi la version n'est pas installée :
nvm installDepuis la racine du dépôt :
pnpm installSi pnpm demande d'approuver des scripts de build :
pnpm approve-buildsPuis relancer :
pnpm installInstaller les hooks Git locaux avec Lefthook :
pnpm exec lefthook installLa commande pnpm install exécute aussi le script prepare, qui installe Lefthook automatiquement. La commande ci-dessus reste utile si les hooks ne sont pas présents après un clone ou un changement d'environnement.
Créer les fichiers d'environnement locaux :
cp .env.example .env
cp apps/api/.env.example apps/api/.env
cp packages/database/.env.example packages/database/.env
cp apps/worker/.env.example apps/worker/.envLe fichier racine configure PostgreSQL, Redis, MinIO et le simulateur SSO local
Keycloak/OpenLDAP/phpLDAPadmin. Le fichier de l'API définit API_PORT et NODE_ENV, celui de Prisma
fournit DATABASE_URL, et celui du worker définit WORKER_PORT et NODE_ENV. Ces fichiers ne
doivent pas être commités.
Le développement local utilise deux terminaux afin de séparer les services Docker des applications.
Dans un premier terminal, démarrer les services techniques et attendre leur disponibilité :
pnpm infra:devDans un second terminal, lancer toutes les tâches de développement déclarées dans les workspaces :
pnpm devpnpm infra:dev lance PostgreSQL, Redis, MinIO, OpenLDAP, phpLDAPadmin et Keycloak avec Docker
Compose. pnpm dev lance l'API, le frontend, le worker et la documentation avec Turbo.
Pour lancer l'API NestJS, le frontend Angular et le worker BullMQ sans démarrer l'infrastructure Docker ni la documentation :
pnpm apps:devServices exposés en développement :
- API NestJS :
http://localhost:3000 - Frontend Angular :
http://localhost:4200
Le projet utilise en développement un simulateur SSO SAML local. OpenLDAP contient l'annuaire de test
avec les utilisateurs, leurs rôles et leur rattachement métier (bureauIGC). Keycloak est configuré
comme fournisseur d'identité SAML et expose ces attributs à l'application.
Les rôles applicatifs simulés sont :
DEPOT_NUMERIQUE:ADMINISTRATEUR_GENERALDEPOT_NUMERIQUE:ADMINISTRATEUR_REGIONALDEPOT_NUMERIQUE:ADMINISTRATEUR_LOCALDEPOT_NUMERIQUE:AGENT
L'arborescence LDAP locale simule notamment la DSJ, les cours d'appel, les tribunaux judiciaires, les CPH au niveau des cours d'appel et les tribunaux de proximité sous leur tribunal judiciaire. Les comptes de test et les attributs SAML exposés sont documentés dans docs/keycloak.md, avec le détail du simulateur dans sso/README.md.
API NestJS :
pnpm api:devFrontend Angular :
pnpm web:devDocumentation VitePress :
pnpm docs:devWorker BullMQ :
pnpm worker:devLes commandes suivent une nomenclature simple :
pnpm <tâche>lance la tâche sur tous les workspaces concernés via Turbo.pnpm <workspace>:<tâche>lance la même tâche sur un workspace précis.- Les workspaces disponibles sont
api,web,worker,docsetdatabase. - Les commandes
devsont des serveurs persistants et ne sont pas mises en cache par Turbo.
Exemples :
pnpm build
pnpm api:build
pnpm web:build
pnpm docs:build
pnpm database:build
pnpm worker:buildLister les packages du workspace :
pnpm -r list --depth -1Compiler tous les packages qui exposent une tâche build :
pnpm buildCompiler un workspace précis :
pnpm api:build
pnpm web:build
pnpm docs:buildLancer les tests :
pnpm testLancer les tests d'un workspace précis :
pnpm api:test
pnpm web:test
pnpm worker:testLe test du worker couvre le processor de la queue de démonstration sans nécessiter Redis. Il n'y a
pas de commande docs:test, car la documentation n'expose pas de script de test.
Lancer le lint Biome :
pnpm lintLancer le lint sur un workspace précis :
pnpm api:lint
pnpm web:lint
pnpm docs:lint
pnpm database:lint
pnpm worker:lintFormater le code avec Biome :
pnpm formatFormater un workspace précis :
pnpm api:format
pnpm web:format
pnpm docs:format
pnpm database:format
pnpm worker:formatVérifier le formatage sans modifier les fichiers :
pnpm format:checkVérifier le formatage d'un workspace précis :
pnpm api:format:check
pnpm web:format:check
pnpm docs:format:check
pnpm database:format:check
pnpm worker:format:checkVérifier le formatage, le lint et les règles Biome :
pnpm checkVérifier un workspace précis :
pnpm api:check
pnpm web:check
pnpm docs:check
pnpm database:check
pnpm worker:checkVérifier les types TypeScript :
pnpm typecheckVérifier les types d'un workspace précis :
pnpm api:typecheck
pnpm web:typecheck
pnpm database:typecheck
pnpm worker:typecheckIl n'y a pas de commande docs:typecheck, car VitePress est vérifié via pnpm docs:build.
Corriger automatiquement ce qui peut l'être :
pnpm check:fixCorriger automatiquement un workspace précis :
pnpm api:check:fix
pnpm web:check:fix
pnpm docs:check:fix
pnpm database:check:fix
pnpm worker:check:fixDétecter les dépendances inutilisées et le code mort :
pnpm knipLancer tous les contrôles qualité avant une PR ou un push important :
pnpm verifyCette commande enchaîne pnpm check, pnpm knip, pnpm typecheck et pnpm test.
Le workspace @depot-numerique/database centralise Prisma pour l'API et les futurs workers.
PostgreSQL stocke les métadonnées métier et les références MinIO ; les fichiers binaires restent
dans MinIO.
Commandes principales :
pnpm database:build
pnpm database:lint
pnpm database:format
pnpm database:format:check
pnpm database:check
pnpm database:check:fix
pnpm database:typecheck
pnpm database:generate
pnpm database:validate
pnpm database:migrate:create --name description
pnpm database:migrate:dev --name description
pnpm database:migrate:deploy
pnpm database:migrate:status
pnpm database:seed
pnpm database:studioLe script pnpm database:studio force Prisma Studio sur http://localhost:5555.
Le workspace database n'a pas encore de commande de test dédiée.
Les migrations créées en développement sont versionnées dans
packages/database/prisma/migrations. En recette et en production, la CI/CD applique ces mêmes
migrations avec pnpm database:migrate:deploy sur la base de l'environnement concerné.
pnpm database:migrate:create --name description génère et permet de relire le SQL sans l'appliquer.
Le modèle Prisma représente les utilisateurs SSO et les structures judiciaires hiérarchisées :
la cour d'appel, ses juridictions et leurs éventuelles sous-juridictions. Les services sont rattachés
à une structure et sont créés localement par les administrateurs autorisés. Un utilisateur distingue
sa structure de travail (workStructureId) de son éventuel périmètre d'administration
(adminStructureId) ; son service est rattaché à sa structure de travail. Chaque document référence
obligatoirement son utilisateur créateur. Les comptes sont désactivés plutôt que supprimés afin de
conserver cet historique. Le périmètre d'administration est déduit du rôle et du niveau de la
structure administrée : un administrateur régional voit la cour d'appel et ses descendants, tandis
qu'un administrateur local placé sur une cour d'appel ne gère que les services de cette cour.
Le seed crée la cour d'appel de Douai, les tribunaux judiciaires de Lille, Arras et Douai, ainsi que
le tribunal de proximité de Tourcoing rattaché à Lille. La cour d'appel et les trois tribunaux
judiciaires reçoivent les services baj, bog, jaf et jap, identifiés par leur slug et
accompagnés d'un libellé complet. Les structures utilisent des codes SSO uniques sur huit chiffres,
par exemple 00000001 pour la cour et 00000002 pour le tribunal de Lille. Ce jeu de données est
destiné au développement et aux tests.
La documentation détaillée se trouve dans docs/database.md.
Le projet utilise une configuration centralisée à la racine du monorepo.
- Biome : formatage et lint.
- Knip : détection des dépendances inutilisées, exports inutilisés et fichiers morts.
- Lefthook : hooks Git locaux.
- Commitlint : validation des messages de commit au format Conventional Commits.
Avant de commit, Lefthook lance Biome sur les fichiers staged et réajoute automatiquement les fichiers corrigés.
Au commit, Lefthook lance aussi Commitlint sur le message de commit.
Avant un push, Lefthook lance en parallèle pnpm check, pnpm knip, pnpm typecheck et pnpm test.
Tester le dernier commit :
pnpm commitlintCommandes principales :
pnpm format
pnpm format:check
pnpm lint
pnpm check
pnpm check:fix
pnpm verify
pnpm typecheck
pnpm knip
pnpm prepareDocker Compose lance les services techniques utilisés en développement local.
Services disponibles :
- PostgreSQL : base de données métier ;
- Redis : cache et backend BullMQ ;
- MinIO : stockage des documents ;
- OpenLDAP : annuaire local simulant les utilisateurs et rattachements SRJ ;
- phpLDAPadmin : interface graphique locale pour inspecter l'annuaire LDAP ;
- Keycloak : fournisseur d'identité SAML local branché sur OpenLDAP ;
- plus tard, images séparées pour l'API, le frontend et les workers.
Les versions d'images sont volontairement fixées dans docker-compose.yml. Ne pas utiliser latest pour les services d'infrastructure.
Versions locales actuelles :
- PostgreSQL :
postgres:17.10-bookworm - Redis :
redis:7.4.9-bookworm - MinIO :
minio/minio:RELEASE.2025-09-07T16-13-09Z - OpenLDAP :
osixia/openldap:1.5.0 - phpLDAPadmin :
osixia/phpldapadmin:0.9.0 - Keycloak :
quay.io/keycloak/keycloak:26.6.4
Dependabot surveille les mises à jour Docker Compose, GitHub Actions et npm/pnpm via .github/dependabot.yml.
Créer un fichier .env local à partir de l'exemple si nécessaire :
cp .env.example .envLe fichier .env ne doit pas être commit. Il est ignoré par Git.
Lancer tous les services techniques :
pnpm infra:devLancer uniquement PostgreSQL :
docker compose up -d postgresLancer uniquement Redis :
docker compose up -d redisLancer uniquement MinIO :
docker compose up -d minioLancer uniquement Keycloak et attendre sa disponibilité :
docker compose up -d --wait keycloakLancer uniquement l'annuaire LDAP et son interface graphique :
docker compose up -d --wait openldap phpldapadminKeycloak importe le realm depot-numerique depuis sso/keycloak/realm.json et lit les utilisateurs
dans OpenLDAP. Les données LDAP locales sont initialisées depuis sso/openldap/schema et
sso/openldap/ldif. Après une modification du realm, forcer la recréation du conteneur :
docker compose up -d --force-recreate --wait keycloakAprès une modification du schéma ou du LDIF OpenLDAP, il faut recréer les volumes OpenLDAP locaux pour
réimporter l'annuaire. Cette instance utilise start-dev, HTTP, une base H2 éphémère et des mots de
passe publics de démonstration. Elle est strictement réservée au développement local. Consulter la
documentation SSO SAML local pour les comptes, rôles, attributs SAML et
procédures de test.
Vérifier leur état :
docker compose psAfficher les logs :
docker compose logs -fArrêter les services :
docker compose downSupprimer aussi les volumes locaux :
docker compose down -vAttention : docker compose down -v supprime les données PostgreSQL, Redis et MinIO locales. Les
données Keycloak sont éphémères et sont recréées depuis le fichier du realm.
Accès locaux par défaut :
- PostgreSQL :
localhost:5432 - Redis :
localhost:6379 - MinIO API :
http://localhost:9000 - MinIO Console :
http://localhost:9001 - Keycloak :
http://localhost:8080 - OpenLDAP :
ldap://localhost:389 - phpLDAPAdmin :
http://localhost:8081
Les identifiants locaux sont définis dans .env.
La documentation technique est dans docs/ et utilise VitePress.
Commandes disponibles :
pnpm docs:dev
pnpm docs:build
pnpm docs:previewLe package documentation est déclaré comme workspace @depot-numerique/docs dans docs/package.json.
La configuration VitePress utilise base: '/depot-numerique/' pour une publication GitHub Pages sur ce dépôt.
apps/
api/ # API NestJS
web/ # Frontend Angular
docs/ # Documentation VitePress
packages/
database/ # Schéma, migrations, seed et client Prisma
- Monorepo :
Turbo - Gestionnaire de paquets :
pnpm - Backend :
NestJS - Frontend :
Angular - Documentation projet :
VitePress - Base de données :
PostgreSQL - ORM :
Prisma - Queue et cache :
BullMQ,Redis - Stockage fichiers :
MinIO - SSO local :
Keycloak,OpenLDAP,phpLDAPAdmin - Automatisation web :
Playwright - Documentation API :
Swagger / OpenAPI - Conteneurisation :
Docker,Docker Compose - Qualité de code :
Biome,Knip,Lefthook,Commitlint - CI/CD :
GitHub Actions - Secrets :
Vault - Supervision :
Prometheus,Grafana