Spécifications produit — DocApp V1
Document Product Manager — Version 1.0 — Avril 2026
1. Vision produit
Problème résolu
Les organisations (écoles, PME, administrations) gèrent leur documentation interne de façon dispersée : fichiers Word éparpillés, emails, Google Drive non structuré. Résultat : information introuvable, versions obsolètes qui circulent, aucune traçabilité.
Proposition de valeur
DocApp centralise, structure et publie la documentation interne dans une interface moderne, sécurisée et accessible depuis n'importe quel navigateur — sans installation côté utilisateur.
Positionnement
| DocApp | Confluence | Notion | SharePoint |
| Auto-hébergé | ✅ | ✅ (onprem) | ❌ | ✅ |
| RGPD natif | ✅ | ⚠️ | ❌ | ⚠️ |
| Simple à déployer | ✅ | ❌ | N/A | ❌ |
| Compositeur fragments | ✅ | ❌ | ❌ | ❌ |
| Coût | Infra seule | €€€ | €€ | €€€ |
2. Utilisateurs cibles
Persona 1 — L'Administrateur
- Qui : Directeur d'école, responsable administratif, DSI PME
- Objectif : Avoir une documentation à jour, structurée, accessible à tous
- Frustration actuelle : Passe du temps à chercher les bonnes versions, les envoie par email
- Ce qu'il gagne : Source unique de vérité, publication en un clic
Persona 2 — L'Éditeur
- Qui : Enseignant, coordinateur, responsable RH
- Objectif : Rédiger et partager ses procédures sans dépendre de l'IT
- Frustration actuelle : Doit passer par quelqu'un d'autre pour publier
- Ce qu'il gagne : Autonomie de rédaction, workflow de validation clair
Persona 3 — Le Lecteur
- Qui : Employé, élève, parent, partenaire externe
- Objectif : Trouver rapidement l'information dont il a besoin
- Frustration actuelle : Ne sait pas où chercher, reçoit des versions différentes
- Ce qu'il gagne : Recherche full-text instantanée, accès sans compte
3. Fonctionnalités — V1
Front-office (public)
| Fonctionnalité | Description | Priorité |
| Homepage | Liste des documents publiés récents | P0 |
| Recherche full-text | PostgreSQL tsvector, résultats pondérés avec surlignage | P0 |
| Navigation catégories | Arborescence 2 niveaux | P0 |
| Page document | Contenu HTML, compteur de vues | P0 |
| Navigation tags | Filtrage par étiquettes | P1 |
| Sitemap XML | Indexation SEO automatique | P1 |
Back-office (authentifié)
| Fonctionnalité | Description | Rôle |
| CRUD Documents | Création, édition, publication, archivage | ADMIN + EDITOR |
| Éditeur TipTap | WYSIWYG riche : titres, listes, tableaux, images, code | ADMIN + EDITOR |
| Auto-sauvegarde | Brouillons sauvés toutes les 30s | ADMIN + EDITOR |
| Fragments réutilisables | Marquage de documents comme blocs réutilisables | ADMIN + EDITOR |
| Compositeur | Assemblage drag & drop de fragments en nouveau document | ADMIN |
| Gestion catégories | CRUD + ordonnancement | ADMIN |
| Gestion tags | CRUD + association documents | ADMIN |
| Gestion utilisateurs | CRUD + rôles + soft delete RGPD | ADMIN |
| Upload images | jpg/png/gif/webp, 5MB max | ADMIN + EDITOR |
4. Architecture technique
┌─────────────────────────────────────────────────────┐
│ INTERNET │
└──────────────────────┬──────────────────────────────┘
│ HTTPS
┌──────────────────────▼──────────────────────────────┐
│ Nginx Proxy Manager (port 80/443) │
│ SSL Let's Encrypt auto-renew │
└──────────────────────┬──────────────────────────────┘
│ HTTP :3001
┌──────────────────────▼──────────────────────────────┐
│ Next.js 14 — Standalone │
│ ┌─────────────────┐ ┌─────────────────────────┐ │
│ │ App Router │ │ API Routes │ │
│ │ Server Compon. │ │ /api/documents │ │
│ │ Middleware auth│ │ /api/search │ │
│ └─────────────────┘ │ /api/upload │ │
│ └─────────────────────────┘ │
│ ┌────────────────────────────────────────────────┐ │
│ │ NextAuth.js v4 — JWT — Sessions 8h │ │
│ └────────────────────────────────────────────────┘ │
└──────────────────────┬──────────────────────────────┘
│ Prisma ORM
┌──────────────────────▼──────────────────────────────┐
│ PostgreSQL 16 │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────────┐ │
│ │ documents│ │ users │ │ categories / tags │ │
│ │ tsvector │ │ soft del.│ │ consent_logs │ │
│ │ GIN index│ │ bcrypt │ └──────────────────────┘ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────┘
Stack
| Couche | Technologie | Choix justifié |
| Framework | Next.js 14 App Router | SSR natif, API routes intégrées, output standalone pour Docker |
| ORM | Prisma 5.x | Migrations versionnées, typage TypeScript, compatible Next.js 14 |
| Base de données | PostgreSQL 16 | Full-text search natif (tsvector), robustesse, ACID |
| Auth | NextAuth.js v4 | Credentials provider, JWT, sessions courtes RGPD |
| Éditeur | TipTap v3 | WYSIWYG extensible, output HTML propre |
| UI | shadcn/ui v4 + Base UI | Composants accessibles, pas de dépendance Radix |
| CSS | Tailwind CSS v3 | CSS variables, design system cohérent |
| Infra | Docker + NPM | Portabilité, isolation, SSL automatique |
5. Modèle de données
users
├── id (uuid)
├── email (unique)
├── password (bcrypt)
├── name
├── role (ADMIN | EDITOR)
├── createdAt
└── deletedAt (soft delete RGPD)
categories
├── id (uuid)
├── name / slug
├── description
├── order
└── parentId (max 2 niveaux)
documents
├── id (uuid)
├── title / slug (unique)
├── content (HTML)
├── excerpt
├── status (DRAFT | PUBLISHED | ARCHIVED)
├── isFragment (bool)
├── categoryId → categories
├── authorId → users
├── views
├── publishedAt
└── search_vector (tsvector GENERATED — GIN index)
tags
└── relation M-M avec documents via _DocumentTags
consent_logs
├── userId? → users
├── ipHash (SHA-256 — jamais d'IP brute)
├── action
└── createdAt
6. Sécurité & RGPD
| Mesure | Implémentation |
| Authentification | JWT signé, expiration 8h |
| Mots de passe | bcrypt salt 10 |
| Sessions | Courtes (8h) — conformité RGPD |
| Soft delete | Jamais de DELETE physique sur users |
| IPs | SHA-256 uniquement dans consent_logs |
| Uploads | Validation type + taille, stockage volume Docker |
| HTML | Sanitisation DOMPurify côté serveur |
| Headers HTTP | X-Frame-Options, X-Content-Type-Options, Referrer-Policy |
| Rate limiting | lib/rateLimit.ts sur les routes sensibles |
| Transport | HTTPS forcé via NPM + Let's Encrypt |
7. Déploiement
LOCAL (dev) VPS (prod)
┌──────────────────┐ ┌──────────────────────────────┐
│ npm run dev │ │ Docker Compose │
│ :3000 │ ──► │ ┌────────────┐ ┌──────────┐ │
│ │ build │ │ docapp │ │postgres │ │
│ Docker │ image │ │ :3001 │ │ :5432 │ │
│ postgres:5432 │ + │ └────────────┘ └──────────┘ │
│ pgadmin:5050 │ deploy │ │
└──────────────────┘ │ Nginx Proxy Manager │
│ docs.dedobbeleer.online │
│ SSL Let's Encrypt │
└──────────────────────────────┘
Workflow de déploiement :
① docker buildx build --platform linux/amd64 -t docapp:latest .
② docker save | gzip | ssh | docker load
③ scp docker-compose.prod.yml → VPS
④ docker compose up -d --remove-orphans
└── migrations auto au démarrage
8. Roadmap
| Version | Fonctionnalités | Statut |
| V1.0 | CRUD documents, recherche, catégories, tags, users, fragments, compositeur | ✅ Livré |
| V1.1 | Notifications email (validation documents), workflow de révision formalisé | 📋 Planifié |
| V1.2 | Export PDF, historique des versions de documents | 📋 Planifié |
| V2.0 | Multi-organisation, permissions granulaires, API publique | 🔭 Vision |
9. KPIs de succès
- Adoption : % de documents migrés depuis l'ancien système dans les 30 jours
- Usage : Nombre de recherches / semaine
- Contenu : Nombre de documents publiés / mois
- Qualité : Ratio documents PUBLISHED vs DRAFT
- Performance : Time to first byte < 200ms