12 KiB
TaxActe — Release Notes Phase 1 (Sécurisation + Monitoring)
Version : Phase 1 Complétée (Sécurité + DevOps) Date : 2026-05-15 Status : Prêt pour test
🎯 Résumé
Cette version apporte des améliorations critiques de sécurité et un système de monitoring professionnel pour préparer la production.
Aucune feature utilisateur visible — toutes les améliorations sont backend/infrastructure.
🔐 Nouvelles Protections Sécurité
1. Rate Limiting Anti-Brute Force
Où : Login (/api/auth/login)
Ce que ça fait :
- Limite à 5 tentatives de connexion par IP toutes les 15 minutes
- Après 5 échecs : blocage 15 minutes avec message explicite
- Headers HTTP standards (
Retry-After,X-RateLimit-*)
Test :
# Essayer 6 fois avec mauvais mot de passe
# → La 6ème fois doit retourner HTTP 429 "Too Many Requests"
2. Protection CSRF Renforcée
Où : Toutes les requêtes POST/PUT/DELETE/PATCH
Ce que ça fait :
- Cookie
sameSite: strict(au lieu delax) - Validation de l'origin/referer sur toutes les mutations
- Refuse les requêtes cross-origin malveillantes
Visible : Non (transparent pour l'utilisateur légitime)
3. Security Headers (7 nouveaux)
Où : Toutes les pages
Ce que ça fait :
- HSTS : Force HTTPS (1 an de cache navigateur)
- CSP : Content Security Policy stricte (bloque scripts externes non autorisés)
- X-Frame-Options : Empêche l'embedding en iframe (anti-clickjacking)
- X-Content-Type-Options : Empêche MIME sniffing
- Referrer-Policy : Limite les infos transmises
- Permissions-Policy : Désactive APIs non utilisées (géolocalisation, micro, caméra)
- X-XSS-Protection : Protection XSS navigateurs anciens
Test :
curl -I https://votre-domaine.com
# Vérifier présence des headers ci-dessus
# Ou sur https://securityheaders.com/ → Score attendu : B+
4. Validation Zod sur API Calculs
Où : 7 routes /api/calcul/*
Ce que ça fait :
- Validation stricte de tous les inputs (prix, département, montants, etc.)
- Reject avec HTTP 400 + détails si inputs invalides
- Empêche injections, valeurs négatives, départements inexistants
Routes protégées :
/api/calcul/vente-ancien/api/calcul/pret-hypothecaire/api/calcul/donation-immo/api/calcul/succession/api/calcul/plus-values/api/calcul/usufruit/api/calcul/vente-ancien-pret
Test :
# Envoyer un prix négatif → doit retourner HTTP 400
curl -X POST http://localhost:3000/api/calcul/vente-ancien \
-H "Content-Type: application/json" \
-d '{"prix": -50000}' \
-i
# Attendu : HTTP 400 + message d'erreur Zod
📊 Nouveau Monitoring & Logs
5. Sentry (Error Tracking)
Où : Frontend + Backend + Middleware
Ce que ça fait :
- Capture automatique de toutes les erreurs (JavaScript + API)
- Dashboard temps réel sur sentry.io
- Stack traces complètes avec contexte
- Filtrage automatique des données sensibles (passwords, tokens)
Configuration requise :
# .env.local
SENTRY_DSN=https://xxx@xxx.ingest.sentry.io/xxx
NEXT_PUBLIC_SENTRY_DSN=https://xxx@xxx.ingest.sentry.io/xxx
Test :
# Déclencher une erreur test
curl http://localhost:3000/api/test-sentry
# Vérifier sur sentry.io/issues/ → nouvelle erreur apparaît
Si pas configuré : L'app fonctionne normalement, Sentry est juste désactivé.
6. Logs Structurés (Pino)
Où : 6+ routes API critiques
Ce que ça fait :
- Logs JSON structurés en production (pour Scaleway Logs / Datadog)
- Logs colorés pretty-print en développement
- Redaction automatique des données sensibles (password, token, apiKey, etc.)
- Intégration avec Sentry (erreurs loggées + capturées)
Routes loggées :
- Login/Register
- Calculs (vente, prêt, donation)
- Healthcheck
Configuration :
LOG_LEVEL=info # debug, info, warn, error
Exemple log :
{
"level": "info",
"time": 1715817600000,
"msg": "User login successful",
"email": "test@notaire.fr",
"officeId": "xyz123"
}
En dev : Logs colorés dans le terminal (via pino-pretty)
7. Healthcheck Endpoint
Où : /api/health (route publique)
Ce que ça fait :
- Vérifie la connexion base de données (query
SELECT 1) - Retourne status JSON + temps de réponse
- HTTP 200 si OK, HTTP 503 si erreur
Utilité :
- Monitoring uptime (UptimeRobot, Pingdom)
- Kubernetes liveness/readiness probes
- Load balancer health checks
Test :
curl http://localhost:3000/api/health
# Attendu :
{
"status": "ok",
"timestamp": "2026-05-15T10:00:00Z",
"checks": {
"database": "ok"
},
"responseTime": "45ms"
}
📁 Fichiers Créés (Phase 1)
Sécurité
src/lib/rate-limit.ts # Rate limiter (Map in-memory)
src/lib/__tests__/rate-limit.test.ts # 6 tests unitaires
src/lib/api-validation.ts # Schémas Zod (7 routes)
Monitoring
sentry.client.config.ts # Sentry frontend
sentry.server.config.ts # Sentry backend
sentry.edge.config.ts # Sentry middleware
instrumentation.ts # Hooks Next.js
src/lib/logger.ts # Logger Pino
src/app/api/health/route.ts # Healthcheck
src/app/api/test-sentry/route.ts # Test erreurs
Documentation
DEVOPS-SETUP.md # Guide monitoring/logs
SECURITY-FIXES.md # Détails corrections sécurité
Documents RAG (Préparation)
scripts/documents/README.md # Inventaire documents
scripts/documents/code-commerce-a444.md # 50 pages, 25 articles
scripts/documents/cgi-art-669.md # Usufruit fiscal
scripts/documents/cgi-art-777-779.md # Donations
scripts/documents/cgi-art-790.md # Successions
DOCUMENTS-RAG-STATUS.md # Suivi conversion
📁 Fichiers Modifiés (Phase 1)
Configuration
next.config.ts # + 7 security headers + Sentry
src/middleware.ts # + CSRF validation + /api/health public
src/lib/auth.ts # Cookie sameSite: strict
.env.example # + Variables Sentry, LOG_LEVEL
package.json # + Dependencies (Sentry, Pino)
Routes API
src/app/api/auth/login/route.ts # + Rate limiting + Logger + Sentry
src/app/api/auth/register/route.ts # + Logger + Sentry
src/app/api/calcul/vente-ancien/route.ts # + Validation Zod + Logger
src/app/api/calcul/pret-hypothecaire/route.ts # + Validation Zod
src/app/api/calcul/donation-immo/route.ts # + Validation Zod
(+ 4 autres routes calcul)
🧪 Tests
| Type | Avant | Après | Ajout |
|---|---|---|---|
| Tests unitaires | 132 | 138 | +6 (rate limiting) |
| Tests E2E | 0 | 0 | 0 (Phase 3) |
| Coverage | ~60% | ~62% | +2% |
Tous les 138 tests passent ✅
⚙️ Installation sur Machine de Test
1. Copier les Fichiers
Option A : Copie complète
# Depuis cette machine (Mac)
rsync -av --exclude 'node_modules' --exclude '.next' \
/Users/vlaperrousaz/Documents/Code/TaxActe/taxactes/ \
user@machine-test:/path/to/taxactes/
Option B : Copie manuelle
- Copier tout le dossier
taxactes/vers la machine test - Exclure :
node_modules/,.next/,.env.local
2. Installer les Dépendances
ssh user@machine-test
cd /path/to/taxactes
npm install
Nouvelles dépendances installées :
@sentry/nextjs(monitoring)pino+pino-pretty(logs)-
- 169 packages de dépendances (automatique)
3. Configuration Environnement
Créer .env.local sur la machine test :
# Base de données (adapter à votre setup test)
DATABASE_URL="postgresql://user:password@localhost:5432/taxactes_test"
DIRECT_DATABASE_URL="postgresql://user:password@localhost:5432/taxactes_test"
# Auth (garder le même ou générer nouveau)
AUTH_SECRET="votre-secret-existant-ou-nouveau"
# Scaleway AI (même config que prod)
SCALEWAY_API_KEY=scw-xxx
SCALEWAY_AI_BASE_URL=https://api.scaleway.ai/v1
SCALEWAY_AI_MODEL=mistral-small-3.2-24b-instruct-2506
# Sentry (OPTIONNEL - créer projet gratuit sur sentry.io)
SENTRY_DSN=https://xxx@xxx.ingest.sentry.io/xxx
NEXT_PUBLIC_SENTRY_DSN=https://xxx@xxx.ingest.sentry.io/xxx
# Logs
LOG_LEVEL=info
4. Build & Test
# Build de production
npm run build
# Lancer les tests
npm run test
# Attendu : 138 tests passed
# Démarrer le serveur (dev)
npm run dev
# Ou production
npm run start
5. Tester les Nouvelles Features
Test 1 : Rate Limiting
# Essayer 6 logins avec mauvais password
for i in {1..6}; do
curl -X POST http://machine-test:3000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"test@test.com","password":"wrong"}' \
-i | grep "HTTP\|429"
done
# Après 5 tentatives → HTTP 429
Test 2 : Healthcheck
curl http://machine-test:3000/api/health
# Attendu : {"status":"ok",...}
Test 3 : Validation Zod
# Prix négatif → doit rejeter
curl -X POST http://machine-test:3000/api/calcul/vente-ancien \
-H "Content-Type: application/json" \
-H "Cookie: taxactes-session=xxx" \
-d '{"prix": -50000, "dept": "75"}' \
-i
# Attendu : HTTP 400 + erreur validation
Test 4 : Sentry (si configuré)
curl http://machine-test:3000/api/test-sentry
# Vérifier sur sentry.io → nouvelle erreur apparaît
Test 5 : Logs
# En dev : logs colorés apparaissent dans le terminal
# En prod : logs JSON dans stdout
npm run dev
# Ouvrir un autre terminal
curl -X POST http://machine-test:3000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"test@test.com","password":"wrong"}'
# Observer les logs dans le terminal 1
🚨 Problèmes Potentiels & Solutions
npm audit (5 vulnérabilités modérées)
Symptôme : npm install affiche "5 moderate severity vulnerabilities"
Solution :
npm audit fix
npm run test # Vérifier que tout passe
Sentry non configuré
Symptôme : Warnings Sentry dans les logs
Solution : Ignorer (non bloquant) ou créer projet gratuit sur sentry.io
Tests échouent
Symptôme : npm run test échoue
Solution :
# Supprimer cache
rm -rf .next node_modules
npm install
npm run test
Port 3000 déjà utilisé
Symptôme : Error: listen EADDRINUSE: address already in use
Solution :
# Changer le port
PORT=3001 npm run dev
📊 Métriques Avant/Après
| Métrique | Avant Phase 1 | Après Phase 1 | Amélioration |
|---|---|---|---|
| Sécurité | 3 vulnérabilités critiques | 0 vulnérabilités critiques | ✅ +100% |
| Tests | 132 | 138 | +6 tests |
| Monitoring | Aucun | Sentry + Pino + Healthcheck | ✅ Production-ready |
| Headers sécurité | 0 | 7 | ✅ Score B+ |
| Logs structurés | console.log() | Pino JSON | ✅ Professionnel |
| Build time | ~5s | ~6s | -1s (Sentry overhead) |
🔜 Prochaines Versions
Phase 2 (Semaine 3-4)
- CI/CD GitHub Actions (tests automatiques)
- Backup BDD automatique (daily)
- pgvector activé (préparation RAG)
Phase 3 (Semaine 5-7)
- Tests E2E (Playwright)
- RAG fonctionnel (ingestion 780-900 chunks)
- Chat IA avec contexte réglementaire
📞 Support
Documentation :
- DEVOPS-SETUP.md — Guide monitoring complet
- SECURITY-FIXES.md — Détails corrections sécurité
Questions :
- Ouvrir un fichier
QUESTIONS.mdà la racine - Ou demander directement aux agents
✅ Checklist Déploiement Test
- Fichiers copiés sur machine test
npm installréussi (726 packages).env.localcréé avec bonnes variablesnpm run buildréussinpm run test→ 138 tests passentnpm run devdémarre sans erreur- Healthcheck
/api/health→ HTTP 200 - Rate limiting fonctionne (6 tentatives → 429)
- Login normal fonctionne
- Calcul vente fonctionne
- Logs apparaissent dans terminal (dev)
- Optionnel : Sentry capture erreurs
Version stable, prête pour test ! 🚀