# Cahier des Charges Techniques (CDC) > Specification technique complete : stack, choix, contraintes, NFR, architecture, roadmap. > Version : 1.0 — Date : 2026-05-07. > Statut : draft, a valider Yan/Ludo avant industrialisation. ## 1. Identification | Champ | Valeur | |-------|--------| | Nom du projet | formation-hub | | Owner technique | Corentin JOGUET (DevOps/AdminSys, bras droit Yan) | | Validateurs | Yan (resp tech), Ludo (direction) | | Sponsor metier | Direction Acadenice | | Type | Outil interne — Notion-like self-host pour CFA + Agence dev | | Date debut | 2026-05-07 | | Date cible MVP | T+1 mois (Phase 1 — stack vanilla + setup metier) | | Date cible v1.0 | T+3 mois (Phase 2 — bridge UX unifie) | ## 2. Contexte metier Acadenice = double activite **CFA + Agence dev** (cf doc fondateur "Vision Acadenice"). Les formateurs sont aussi developpeurs sur projets clients : leur capacite annuelle se split entre les deux activites. Le projet formation-hub fournit l'outil interne pour : - Wiki collaboratif (SOPs, supports, doc technique) - Suivi heures formation (CFA) - Suivi projets et taches Agence - Vue 360 capacite par personne (formation + agence) - Acces guests clients (lien partage) - Spaces personnels etudiants (libres, non modelises) ## 3. Objectifs | Objectif | Mesure | |----------|--------| | Centraliser la documentation | 100% des SOPs et supports formation dans l'outil | | Tracer les heures formateurs | Saisie reguliere par 100% des formateurs | | Tracer les heures projets clients | Saisie reguliere par 100% des devs | | Calcul automatique heures restantes | Tableau de bord temps reel par formation, par formateur, par projet | | Reduire le couplage outils externes | Remplacer 0 a 3 outils actuels (Excel, Trello legers ?) | | Self-host illimite users | Aucun cout de licence par seat, juste l'infra | | Ouvert aux etudiants | Spaces personnels libres, beneficient des templates | ## 4. Perimetre fonctionnel Couvert : - Wiki Docmost avec mermaid/drawio/excalidraw natifs - Bases de donnees Baserow (CFA + Agence) - Permissions hierarchiques (workspace, space, page) - Share links avec password / expiration - Acces guests clients Non couvert (out of scope v1) : - Modelisation formelle des etudiants (inscriptions, suivi pedagogique) - Generation factures clients - ATS / recrutement - Messagerie integree - Application mobile native (UI mobile-friendly via responsive web) ## 5. Stack technique ### 5.1 Diagramme architecture cible ```mermaid flowchart TB User([Utilisateur final
Admin/Formateur/Dev/Etudiant/Client]) subgraph "Edge / Reverse Proxy" Traefik[Traefik
TLS Let's Encrypt
routing par sous-domaine] end User -->|HTTPS| Traefik Traefik -->|wiki.acadenice.fr| Docmost Traefik -->|baserow.acadenice.fr| Baserow Traefik -->|bridge.acadenice.fr| Bridge subgraph "Application services" Docmost[Docmost
NestJS + React + Tiptap] Baserow[Baserow
Django + Caddy interne] Bridge[Bridge service
Node 22 + Hono
Phase 2] end subgraph "Storage" DocmostDB[(Postgres
docmost)] DocmostRedis[(Redis
docmost)] BaserowDB[(Postgres
baserow embedded)] BaserowRedis[(Redis
baserow embedded)] FS[Local FS / MinIO
docmost files] end Docmost --> DocmostDB Docmost --> DocmostRedis Docmost --> FS Baserow --> BaserowDB Baserow --> BaserowRedis Bridge -->|API REST| Baserow Bridge --> DocmostRedis Bridge -->|API REST| Docmost subgraph "Infra ops" CronBackup[Cron host
backups quotidiens] Monitoring[Uptime monitoring
a definir] end CronBackup -->|pg_dump + tar| DocmostDB CronBackup -->|pg_dump + tar| BaserowDB CronBackup -->|tar| FS ``` ### 5.2 Composants | Composant | Role | Techno | Version cible | License | |-----------|------|--------|--------------|---------| | **Docmost** | Wiki + collab + share + diagrammes natifs | NestJS, React, Tiptap, Postgres | latest stable (>= v0.8.2 mai 2026) | AGPL-3.0 | | **Baserow** | DBs structurees + multi-vues + rollups + formules | Django, Postgres, Redis, Celery, Caddy | 1.30.x pinned | MIT (core) | | **Bridge** (Phase 2) | API entre Docmost (Tiptap nodes custom) et Baserow | Node 22, Hono, zod, ofetch | 1.0 (a developper) | MIT (interne) | | **PostgreSQL** | DB pour Docmost + DB pour Baserow (containers separes) | Postgres 16 alpine | 16.x | PostgreSQL License | | **Redis** | Cache et queues (Docmost + Bridge) | Redis 7 alpine | 7.x | RSAL (free pour notre usage) | | **MinIO** ou **local FS** | Storage attachments Docmost | MinIO | latest stable | AGPL-3.0 | | **Traefik** | Reverse proxy, TLS auto | Traefik 3.x (deja deploye) | latest | MIT | | **Docker / Compose** | Containerisation, orchestration | Docker 25+, compose v2 | latest | Apache 2.0 | | **GitHub Actions** | CI/CD | GitHub Actions | — | — | ### 5.3 Versions pinning - Docmost : `docmost/docmost:latest` initialement, **pinned** sur version mineure stable apres tests (ex: v0.8.2) - Baserow : `baserow/baserow:1.30.1` (deja pinne) - Postgres : `postgres:16-alpine` - Redis : `redis:7-alpine` - Node Bridge : `node:22-alpine` - Bumps version : decision manuelle apres test staging ## 6. Choix de stack — justifications | Choix | Alternatives ecartees | Raison | |-------|-----------------------|--------| | **Docmost** comme wiki | AFFiNE (10-seat limit), AppFlowy (1-user limit), Outline (BSL + pas de bidirec), SiYuan/Trilium (single-user), HedgeDoc (pas de DB ni bidirec) | Seul wiki AGPL avec users illimites, team workspaces, share links et diagrammes natifs (Mermaid + Draw.io + Excalidraw) integres | | **Baserow** comme moteur DB | NocoDB (license non-OSI Sustainable Use), Teable (jeune, pas mature), Airtable (cloud paye), construire un moteur DB dans Docmost (4-6 mois) | MIT, mature, real-time collab, rollups+formules natifs, multi-vues completes, users illimites | | **Stack composite** vs unifie | AFFiNE Team paid (~2200€/an) ou tout custom | Zero recurrent + Stack mainstream + decouple = remplaceable | | **Bridge custom Node TS** | Embed iframe Baserow ou reecrire UI complete | UX unifie sans Tiptap reverse engineering Docmost. Effort 2-3 mois acceptable. | | **Postgres separe** par service | Postgres partage avec 2 databases | Isolation versions, migrations independantes, dump/restore propres | | **Hono** pour le bridge | Express, Fastify, NestJS, Bun | Leger, TypeScript-first, performance Edge-ready, simple a deployer | | **Path B** (UX quasi-unified) vs Path A (deux mondes) | Cross-link URL externe entre Docmost et Baserow | UX unifie evite jonglage 2 onglets pour les utilisateurs | (Voir `02-decision-record.md` pour les ADR detailles.) ## 7. Specifications non-fonctionnelles (NFR) ### 7.1 Performance | Metrique | Cible | Mesure | |----------|-------|--------| | Latence saisie heures (UC-13, UCA-07) | < 2s p95 | Bridge endpoint timing | | Latence chargement page wiki | < 1s p95 | Lighthouse | | Recalcul rollups Baserow | < 5s | Baserow-side timing | | Recherche full-text Docmost | < 500ms p95 | Docmost search timing | ### 7.2 Securite | Aspect | Specification | |--------|---------------| | Auth Docmost | Email + password, SSO OIDC en option (Phase 3) | | Auth Baserow | Email + password, JWT | | Auth Bridge | API tokens longue duree pour service-to-service | | TLS | Let's Encrypt via Traefik, renouvellement auto | | Backup encryption | AES-256 sur backups distants (MinIO/S3 distant) | | Secrets | Variables d'environnement docker-compose, fichier `.env` exclu de git | | Audit log | Log toutes operations sensibles (suppression, archivage, partage externe) | | RGPD | Suppression de donnees personnelles sur demande, retention etudiants/clients selon loi | ### 7.3 Disponibilite | Aspect | Cible | Justification | |--------|-------|---------------| | Disponibilite stack | 99% (= 3.65j down/an) | Outil interne, pas critique | | RPO (Recovery Point Objective) | 24h max | Backup quotidien | | RTO (Recovery Time Objective) | 4h max | Restauration manuelle assistee | | MTTR | < 1h pour bugs critiques, < 24h pour bugs mineurs | Bug critique = bloquant pour une activite | ### 7.4 Scalabilite Cible v1 : ~30 users simultanes peak, 100 users total — **hors-perf** sur un VPS 4 vCPU/8 Go. Croissance an 5 prevue : ~150 users total, ~50 simultanes peak. **Pas de refactor stack prevu** — juste un upsizing VPS si besoin. ### 7.5 Backup / Disaster recovery | Aspect | Strategie | |--------|-----------| | Frequence | Quotidienne, 03:00 UTC | | Targets | Postgres docmost (pg_dump.gz), Postgres baserow embedded (pg_dump.gz), Docmost FS (tar.gz), Baserow data (tar.gz) | | Retention | 30 jours sur disque local, 90 jours sur stockage distant (S3 / Backblaze) | | Test restauration | Mensuel, sur un environnement test isole | | RPO | 24h | | RTO | 4h | ## 8. Contraintes | Contrainte | Justification | |-----------|---------------| | Self-host obligatoire | Souverainete des donnees, pas de SaaS payant | | Stack OSS (AGPL/MIT/Apache acceptable) | Eviter lock-in vendor | | Docker + Compose | Stack ops existante d'Acadenice | | Traefik reverse proxy | Stack ops existante (labels TOML) | | GitHub pour le code | Workflow standard equipe | | Budget recurrent : 0 (hors infra ~30€/mois) | Decision direction | | Equipe dev : Corentin solo + freelance ponctuel pour Tiptap | Pas d'embauche dediee | ## 9. Hypotheses / dependances - Le hardware serveur (VPS Hetzner ou equivalent) est commande / disponible avant deploiement staging - Un nom de domaine `acadenice.com` ou `acadenice.fr` est disponible pour les sous-domaines wiki/baserow/bridge - Traefik tourne deja en prod chez Acadenice — on s'integre dans le reseau Docker existant - L'API Outline reste accessible pendant la phase de validation (push docs depuis local pour relecture) - Docmost et Baserow continuent d'etre maintenus activement par leur upstream pendant la duree du projet ## 10. Risques et mitigations | Risque | Probabilite | Impact | Mitigation | |--------|-------------|--------|-----------| | Docmost upstream change ses API publiques | Faible | Moyen | Pinning de versions, tests staging avant bump | | Baserow change son data model en breaking | Moyenne | Eleve | Backups frequents, migration test avant bump | | Tiptap node-views complexe pour AdminSys solo | **Eleve** | Moyen | Freelance senior fullstack TS pour 2-3 jours pair-programming | | AGPL conformite (publication code source si SaaS public) | Faible | Eleve | Outil reste interne — pas SaaS public, AGPL OK | | Charge depasse capacite VPS 4 vCPU | Faible | Moyen | Upsizing simple, cloud-native | | Perte de cle API Outline ou Baserow | Faible | Faible | Rotation manuelle simple, secrets dans .env | | Manque adoption metier (saisie heures non faite) | Moyenne | Eleve | Onboarding etalonne + UX simple + relances admin | ## 11. Roadmap technique ### Phase 0 — Conception (en cours, fini fin mai) - [x] Discovery + decisions - [x] Data dictionary, MCD, MLD, UML use cases, state diagrams, MCT, MOT, class diagram, activity diagrams - [x] CDC technique (ce doc) - [ ] MPD Baserow (table-par-table) - [ ] Validation metier (Yan + Ludo + admin pedagogique) ### Phase 1 — MVP vanilla (T+1 mois) - [ ] Setup stack Docker compose locale → staging - [ ] Configuration Docmost (workspace, spaces, share links) - [ ] Configuration Baserow (4 BDDs CFA + 4 BDDs Agence) - [ ] Migration data initiale (formations existantes, formateurs, clients, projets en cours) - [ ] Onboarding 5-10 power users - [ ] Backup + monitoring de base ### Phase 2 — Bridge UX unifie (T+3 mois) - [ ] Bridge service skeleton + premier Tiptap node-view custom (mention `@formateur`, `@projet`) - [ ] Routes /personne/:id, /projet/:id, /formation/:id en page Docmost-style - [ ] Saisie heures formateur + intervention dev en bridge UI mobile-friendly - [ ] Webhook Baserow → bridge → cache Redis pour mentions - [ ] Migration progressive utilisateurs (formateurs + devs ouvrent le bridge plutot que Baserow direct) ### Phase 3 — Maturite (T+6 mois) - [ ] Bidirec backlinks dans Docmost (custom) - [ ] Workflow approbation heures realisees (review admin) - [ ] Notifications avancees (Slack/Teams) - [ ] Rapports PDF (formation + formateur + projet) - [ ] SSO OIDC pour gros volume users ### Phase 4 — Optimisation & extensions (T+9 mois) - [ ] Modelisation etudiants si besoin metier - [ ] Integration calendrier (iCal export) - [ ] API publique limitee pour clients (auto-service projets) - [ ] Multi-langue UI (EN en plus de FR) ## 12. Estimations couts ### Infra (recurrent) | Element | Cout | |---------|------| | VPS Hetzner CPX31 ou CCX23 (4 vCPU/8 Go) | 13-30€/mois | | Stockage backup distant (Backblaze B2 / OVH Object Storage) | 5-10€/mois | | Domaine + sous-domaines | 15€/an | | **Total recurrent** | **~30€/mois = ~360€/an** | ### Dev (one-shot) | Phase | Effort | Cout estime | |-------|--------|-------------| | Phase 0 — Conception | ~10h Corentin | Inclus salaire | | Phase 1 — MVP vanilla | ~80h Corentin | Inclus salaire | | Phase 2 — Bridge | ~200-300h Corentin + 2-3j freelance Tiptap | Salaire + ~2k€ freelance | | Phase 3 — Maturite | ~150h Corentin | Inclus salaire | | **Total externe** | | **~2-3k€** (freelance ponctuel) | ## 13. Glossaire | Terme | Definition | |-------|------------| | CFA | Centre de Formation des Apprentis | | RNCP | Repertoire National des Certifications Professionnelles (les blocs de competences) | | Bloc de competences | Ensemble homogene et coherent de competences validees ensemble | | Module | Lecon individuelle au sein d'un bloc | | Attribution | Affectation d'un module a un formateur avec heures | | Intervention | Travail d'un developpeur sur une tache projet client (avec heures) | | Formation pedagogique | Cas ou un projet client sert de support de formation pour des etudiants | | Bridge | Service intermediaire qu'on construit entre Docmost et Baserow | | Tiptap | Editor framework utilise par Docmost (extension de ProseMirror) | | Node-view | Composant React custom integre dans un editeur Tiptap | | Rollup | Calcul d'agregation Baserow (sum, count, avg) sur une relation | | Path A / Path B | Strategies d'integration Docmost-Baserow (cf ADR-002) | ## 14. References - Doc fondateur Vision Acadenice : [KxvipVcxNV](https://wiki.acadenice.com/doc/vision-acadenice-document-fondateur-KxvipVcxNV) - Discovery recap : `01-discovery-recap.md` - Decision records : `02-decision-record.md` - Data dictionary : `05-data-dictionary.md` - MCD : `06-merise-mcd.md` - MLD : `07-merise-mld.md` - Sources externes verifiees : - [Docmost AGPL pricing](https://docmost.com/pricing) - [Docmost v0.3.0 release Mermaid+Drawio+Excalidraw](https://github.com/docmost/docmost/releases/tag/v0.3.0) - [AFFiNE 10-seat limit](https://docs.affine.pro/self-host-affine/features/basic-user-quota) - [AppFlowy 1-user limit](https://github.com/AppFlowy-IO/AppFlowy-Cloud/issues/1570) - [Baserow vs NocoDB comparison](https://www.softr.io/blog/baserow-vs-nocodb)