veza/AUDIT_TECHNIQUE_INTEGRAL_2026_02_15.md
senke fef7e7fc7c feat(loadtests): audit 3.2 — tests de charge k6 complets
- loadtests: centraliser scripts (backend, stream, chat)
- backend: health, auth, tracks, uploads, playlists, marketplace
- stream: http health, healthz, readyz
- chat: WebSocket load (register -> login -> chat token -> WS)
- ci: workflow nightly load-test-nightly.yml
- docs: README loadtests
- make: load-test-smoke, load-test-backend, load-test-all
- fix: veza-backend-api Makefile load-test (scripts/load_test_uploads.js -> loadtests)
2026-02-15 15:22:48 +01:00

727 lines
35 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AUDIT TECHNIQUE INTÉGRAL — MONOREPO VEZA
**Date** : 15 février 2026
**Auditeur** : Architecte logiciel senior / Expert sécurité
**Mandataire** : Comité d'investissement
**Périmètre** : Monorepo complet — `talas/veza`
**Méthode** : Analyse statique exhaustive du code source, des configurations et de l'infrastructure
---
## EXECUTIVE SUMMARY
Veza est une **plateforme audio collaborative** (type Bandcamp/SoundCloud) avec marketplace, fonctionnalités sociales, chat temps réel et streaming audio. Le projet est techniquement ambitieux avec une stack polyglotte (Go, Rust, TypeScript/React).
### Verdict
| Critère | Score | Commentaire |
|---------|-------|-------------|
| Architecture | 6/10 | Bonne séparation des services, mais dual-patterns et pollution du repo |
| Maintenabilité | 5/10 | 470K LOC, 137 fichiers .md à la racine, dette structurelle |
| Sécurité | 6.5/10 | Fondations solides, 3 vulnérabilités critiques à corriger |
| Scalabilité | 7/10 | Architecture microservices correcte, K8s prêt |
**Peut-on lancer en production ?** Non, pas en l'état. 3 correctifs critiques requis (estimé 1-2 semaines).
**Peut-on vendre le produit ?** Le produit a de la valeur fonctionnelle. Le code nécessite une stabilisation avant due diligence.
**Faut-il réécrire ?** Non. Refactoring ciblé suffisant.
---
## TABLE DES MATIÈRES
1. [Cartographie globale](#1-cartographie-globale)
2. [Ce que le produit permet réellement](#2-ce-que-le-produit-permet-réellement)
3. [Validation fonctionnelle](#3-validation-fonctionnelle)
4. [Audit de sécurité — OWASP TOP 10](#4-audit-de-sécurité--owasp-top-10)
5. [Dette technique](#5-dette-technique)
6. [Qualité architecturale](#6-qualité-architecturale)
7. [Infra & DevOps](#7-infra--devops)
8. [Risques business](#8-risques-business)
9. [Plan d'action priorisé](#9-plan-daction-priorisé)
---
## 1. CARTOGRAPHIE GLOBALE
### 1.1 Stack complète
| Couche | Technologie | Version | Rôle |
|--------|------------|---------|------|
| **Frontend** | React + TypeScript | 18.2 / TS 5.3 | SPA |
| **Build** | Vite | 7.1.5 | Bundler |
| **State** | Zustand + TanStack Query | 4.5 / 5.17 | UI state + server state |
| **Forms** | react-hook-form + Zod | 7.49 / 3.25 | Validation |
| **Styling** | Tailwind CSS | 4.0 | Styles |
| **UI** | Radix UI + Lucide | - | Composants |
| **i18n** | i18next | 25.5 | Internationalisation |
| **Backend API** | Go + Gin | Go 1.23.8 / Gin 1.11 | REST API |
| **ORM** | GORM | 1.30 | Accès DB |
| **Chat** | Rust + Axum | Axum 0.8 | WebSocket temps réel |
| **Streaming** | Rust + Axum | Axum 0.8 | Audio HLS/WebRTC |
| **Database** | PostgreSQL | 16 | Persistance |
| **Cache** | Redis | 7 | Sessions, rate limiting, CSRF |
| **Queue** | RabbitMQ | 3 | Events async |
| **Paiement** | Hyperswitch | - | Checkout |
| **Monitoring** | Prometheus + Sentry | - | Métriques + erreurs |
| **CI/CD** | GitHub Actions | - | 12 workflows |
| **Orchestration** | Kubernetes + Turborepo | - | Déploiement + monorepo |
| **Error tracking** | Sentry | 10.32 | Frontend + backend |
### 1.2 Organisation du repo
```
veza/
├── apps/web/ # Frontend React (≈200K LOC)
│ ├── src/
│ │ ├── features/ # 25 modules fonctionnels
│ │ ├── components/ # Composants partagés + views
│ │ ├── services/api/ # Couche HTTP (Axios)
│ │ ├── stores/ # Zustand stores
│ │ ├── hooks/ # 41 hooks custom
│ │ ├── mocks/ # MSW handlers (8 fichiers)
│ │ ├── locales/ # en.json, fr.json
│ │ └── router/ # React Router v6
│ └── e2e/ # Playwright tests
├── veza-backend-api/ # Backend Go (≈150K LOC)
│ ├── cmd/api/ # Entry point
│ ├── internal/
│ │ ├── handlers/ # 88 fichiers handlers
│ │ ├── middleware/ # 49 middlewares
│ │ ├── models/ # 52 modèles
│ │ ├── services/ # Services métier
│ │ └── config/ # Configuration (découpé par domaine)
│ ├── migrations/ # 42 fichiers SQL
│ └── tests/ # Tests spécialisés
├── veza-chat-server/ # Chat Rust (≈30K LOC)
│ └── src/ # WebSocket + message store
├── veza-stream-server/ # Streaming Rust (≈50K LOC)
│ └── src/ # HLS + WebRTC + audio processing
├── veza-common/ # Bibliothèque Rust partagée
├── k8s/ # Manifestes Kubernetes
├── .github/workflows/ # 12 pipelines CI/CD
├── config/ # Prometheus, metrics
├── 137 fichiers .md à la racine # ⚠️ Pollution documentaire
└── 25 fichiers .json à la racine # ⚠️ TODOs, rapports, états
```
### 1.3 Dépendances critiques
| Dépendance | Service | Risque | Statut |
|-----------|---------|--------|--------|
| `gin-gonic/gin v1.11` | Backend | Faible | ✅ À jour |
| `gorm v1.30` | Backend | Faible | ✅ À jour |
| `golang-jwt/jwt v5.3` | Backend | Faible | ✅ À jour |
| `axum 0.8` | Chat/Stream | Faible | ✅ À jour |
| `sqlx 0.8` | Chat/Stream | Faible | ✅ À jour |
| `jsonwebtoken 10` | Chat/Stream | Faible | ✅ À jour |
| `react 18.2` | Frontend | Faible | ✅ Stable |
| `axios 1.13.5` | Frontend | Moyen | ⚠️ Vérifier CVE |
| `vite 7.1.5` | Frontend | Faible | ✅ Dernier |
### 1.4 Complexité globale
- **470 079 lignes de code** source (Go + Rust + TypeScript)
- **4 langages** de programmation en production
- **4 services** distribués
- **42 migrations SQL**
- **1 679 commits** sur l'historique
- **Couplage** : Modéré — les services communiquent via HTTP/WebSocket/RabbitMQ
- **Cohérence** : Moyenne — dual-patterns dans le frontend (views vs features/pages)
---
## 2. CE QUE LE PRODUIT PERMET RÉELLEMENT
### 2.1 Features pleinement implémentées ✅
| Feature | Backend | Frontend | Tests | MSW |
|---------|---------|----------|-------|-----|
| **Authentification** (email/password) | ✅ | ✅ | ✅ | ✅ |
| **2FA TOTP** | ✅ | ⚠️ Bug | ✅ | ✅ |
| **OAuth** | ✅ Partiel | ✅ | - | ✅ |
| **Sessions management** | ✅ | ✅ | ✅ | ✅ |
| **Upload de tracks** (chunked) | ✅ | ✅ | ✅ | ✅ |
| **CRUD tracks** | ✅ | ✅ | ✅ | ✅ |
| **Streaming HLS** | ✅ | ✅ | ✅ | ✅ |
| **Player audio** | - | ✅ | ✅ | ✅ |
| **Playlists** (CRUD + collaboration) | ✅ | ✅ | ✅ | ✅ |
| **Recherche** | ✅ | ✅ | ✅ | ✅ |
| **Profil utilisateur** | ✅ | ✅ | ✅ | ✅ |
| **Notifications** | ✅ | ✅ | ✅ | ✅ |
| **Chat temps réel** | ✅ | ✅ | ⚠️ | ✅ |
| **Marketplace** (produits, panier, checkout) | ✅ | ✅ | ✅ | ✅ |
| **Social** (feed, posts, groupes) | ✅ | ✅ | ✅ | ✅ |
| **Analytics** | ✅ | ✅ | ⚠️ | ✅ |
| **Admin dashboard** (RBAC, audit) | ✅ | ✅ | ✅ | ✅ |
| **Webhooks** | ✅ | ✅ | ✅ | ✅ |
| **Settings** | ✅ | ✅ | ✅ | ✅ |
| **Internationalisation** (FR/EN) | - | ✅ | - | - |
| **Library management** | ✅ | ✅ | ✅ | ✅ |
### 2.2 Features partiellement implémentées ⚠️
| Feature | État | Détail |
|---------|------|--------|
| **2FA Login** | ⚠️ Bug confirmé | `TwoFactorVerify.tsx:47``TODO: Fix this - twoFactorService.verify is for setup, not login verification` |
| **OAuth user lookup** | ⚠️ Non implémenté | `database.go:559``TODO: Implémenter OAuth user lookup` |
| **Live streaming** | ⚠️ Mocked | Routes backend existent, frontend mocké via MSW, intégration réelle non confirmée |
| **Inventory/Gear** | ⚠️ Mocked | MSW handlers présents, backend partiel |
### 2.3 Features fantômes (déclarées mais retirées) 👻
| Feature | Preuve | Statut |
|---------|--------|--------|
| **Education/Tutorials** | Routes backend existent (`routes_education.go`), handlers sans backend complet | Supprimée du frontend (commit `1cab7d5e`) |
| **Gamification** (achievements, leaderboard) | MSW handlers existaient | Supprimée du frontend (commit `1cab7d5e`) |
| **Studio** | Composants dans `components/studio/` | Supprimée des routes (commit `44829ea3`) |
### 2.4 Features mortes / Code mort
| Élément | Localisation | État |
|---------|-------------|------|
| `cmd/modern-server/main.go` | Backend | Serveur alternatif, code commenté |
| `cmd/backup/main.go` | Backend | Outil de backup, usage incertain |
| `pages/` directory | Frontend | Répertoire legacy, doublon de `features/*/pages/` |
| `components/education/` | Frontend | Composants pour feature retirée |
| `components/studio/` | Frontend | Composants pour feature retirée |
| 137 fichiers `.md` à la racine | Racine | 53 833 lignes de documentation accumulée |
| 25 fichiers `.json` à la racine | Racine | TODOs, rapports, états intermédiaires |
### 2.5 Incohérences produit/code
1. **Dual-pattern views** : `components/views/` ET `features/*/pages/` servent le même objectif — architecture incohérente
2. **Routes Education** : Le backend expose des routes publiques pour les tutoriels, mais la feature est retirée du frontend
3. **cmd/modern-server** : Doublon du point d'entrée serveur avec du code commenté
4. **Coverage reports** : 72 fichiers `.out` dans le backend, non gitignorés
---
## 3. VALIDATION FONCTIONNELLE
### 3.1 Couverture de tests
| Composant | Fichiers test | Type | Fiabilité |
|-----------|--------------|------|-----------|
| Frontend | 269 fichiers | Unit + Component | Seuil 80% configuré |
| Backend Go | 264 fichiers | Unit + Integration + Security + Performance | Bonne |
| Chat Rust | 18 `#[test]` | Unit | Basique |
| Stream Rust | 50+ `#[test]` | Unit | Correcte |
| E2E | 30 specs | Playwright (4 browsers) | Correcte |
| Storybook | 296 stories | Visual + Audit | Complète |
### 3.2 Points de rupture identifiés
| Scénario | Gravité | Détail |
|----------|---------|--------|
| 2FA login flow | **Élevée** | `TwoFactorVerify.tsx` appelle `twoFactorService.verify` (setup) au lieu de la vérification login |
| Redis indisponible | **Moyenne** | CSRF panic en prod si Redis down (`routes_core.go:242`) |
| OAuth callback | **Moyenne** | User lookup non implémenté (`database.go:559`) |
| `.unwrap()` en Rust | **Élevée** | 100+ appels sans gestion d'erreur → crash service |
| Chat server sans DB | **Faible** | Dégradation gracieuse, mais logs avertissement |
### 3.3 Zones non testées
- **OAuth flow complet** : Pas de tests d'intégration OAuth
- **Payment webhook** : Tests limités pour Hyperswitch callbacks
- **WebRTC streaming** : Logique complexe, tests unitaires seulement
- **Audio processing pipeline** : Tests basiques, pas de tests de performance audio
- **Multi-tenant isolation** : Pas de tests IDOR systématiques
- **Migration rollback** : Pas de tests de rollback SQL
### 3.4 Risques de production
1. **Crash du stream server** : 100+ `.unwrap()` dans du code Rust de production
2. **CSRF inutilisable** : Si Redis tombe, le backend Go panic au lieu de fallback gracieux
3. **2FA cassé** : Le flow de login 2FA appelle le mauvais endpoint
4. **HLS sans auth** : Les segments audio HLS sont accessibles publiquement sans authentification
---
## 4. AUDIT DE SÉCURITÉ — OWASP TOP 10
### A01 — Broken Access Control
| Constat | Gravité | Impact | Scénario d'exploitation | Correctif |
|---------|---------|--------|------------------------|-----------|
| HLS endpoints publics (`/hls/:track_id/*`) sur le stream server | **Élevée** | Accès non autorisé aux flux audio | Un attaquant qui connaît un `track_id` peut télécharger le contenu HLS sans authentification | Ajouter JWT ou validation par signature |
| Routes Education encore actives côté backend | **Moyenne** | Exposition de données fantômes | Les endpoints `GET /api/v1/education/*` sont publics et retournent des données | Supprimer les routes ou ajouter auth |
| `POST /api/v1/validate` sans auth | **Faible** | Abus de validation | Endpoint accessible sans limite significative | Ajouter rate limiting strict |
| `GET /api/v1/status` potentiellement informatif | **Faible** | Information disclosure | Exposition de métadonnées système | Restreindre ou filtrer les données exposées |
**Positif** :
- RBAC correctement implémenté (`RequireAdmin()`, `RequirePermission()`, `RequireOwnershipOrAdmin()`)
- Toutes les routes admin protégées
- WebSocket (Chat + Stream) requièrent JWT
- Frontend : `ProtectedRoute` appliqué systématiquement
### A02 — Cryptographic Failures
| Constat | Gravité | Impact | Scénario d'exploitation | Correctif |
|---------|---------|--------|------------------------|-----------|
| JWT secret faible dans `.env` dev | **Moyenne** | Si `.env` fuite en prod, tokens forgés | `.env` contient `JWT_SECRET=dev-secret-key-minimum-32-characters-long-for-testing-only` | ✅ `.env` gitignoré. Validation de longueur min 32 chars en prod |
| Hardcoded test JWT secrets dans le chat server | **Moyenne** | Bypass auth si config test utilisée en prod | `config.rs:216` contient des secrets de test hardcodés | Supprimer ou isoler dans des builds de test |
**Positif** :
- Bcrypt cost 12 pour les mots de passe
- SHA-256 pour le hashing des tokens de session
- Access tokens : TTL 5 min (backend), 15 min (chat)
- Refresh tokens : TTL 30 jours avec rotation
- Token versioning pour révocation immédiate
- Cookies httpOnly pour les tokens
- CSRF protection avec tokens aléatoires de 32 bytes
### A03 — Injection
| Constat | Gravité | Impact | Scénario d'exploitation | Correctif |
|---------|---------|--------|------------------------|-----------|
| ~~SQL injection dans `message_store.rs`~~ | ~~Élevée~~ | ~~Injection SQL via l'intervalle de cleanup~~ | ~~Utilisation de `%s` au lieu de `$1`~~ | **✅ Corrigé** : `make_interval(days => $1)` + `.bind()` + validation 1-3650 jours |
| `fmt.Sprintf` avec noms de tables (test utils) | **Faible** | Test-only, whitelist appliquée | `testutils/db.go:158` utilise `fmt.Sprintf("DELETE FROM %s", table)` mais `validateTableName()` est appelé | Conserver la whitelist, considérer les requêtes paramétrées |
**Positif** :
- GORM utilisé systématiquement côté Go (requêtes paramétrées)
- sqlx avec `$1/$2` côté Rust (requêtes paramétrées)
- Validation des inputs avec `go-playground/validator`
- Content filtering dans le chat (patterns XSS/SQL)
- Zod validation côté frontend
### A04 — Insecure Design
| Constat | Gravité | Impact | Correctif |
|---------|---------|--------|-----------|
| Pas de validation serveur sur les données education | **Faible** | Handlers fantômes | Supprimer les routes |
| Download de tracks public sans auth | **Moyenne** | Contenu payant potentiellement accessible | Vérifier les droits avant download |
**Positif** :
- Rate limiting multi-couche (IP, user, endpoint)
- Account lockout après tentatives échouées
- Input validation centralisée (`BindAndValidateJSON()` avec limite 10MB)
- File upload validation multi-couche (magic bytes, MIME, extension, taille, ClamAV optionnel)
### A05 — Security Misconfiguration
| Constat | Gravité | Impact | Scénario d'exploitation | Correctif |
|---------|---------|--------|------------------------|-----------|
| Bypass flags en développement | **Moyenne** | Si activés en prod, bypass de sécurité | `BYPASS_CONTENT_CREATOR_ROLE=true` et `CSRF_DISABLED=true` fonctionnent en dev/test | Ajouter une vérification explicite `APP_ENV=production` qui refuse ces flags |
| Swagger activé sauf en production | **Faible** | Exposition de la doc API | Swagger désactivé en prod (correct) | ✅ Correct |
| `CORS_ALLOWED_ORIGINS` wildcards refusés en prod | **N/A** | N/A | ✅ Validation en place | ✅ Correct |
**Positif** :
- Security headers implémentés (HSTS, CSP, X-Frame-Options)
- Config validation au démarrage (fail-fast)
- CORS strict en production
- `.env` fichiers dans `.gitignore`
- `.env` non trackés par Git (vérifié : `git ls-files --cached`)
### A06 — Vulnerable & Outdated Components
| Constat | Gravité | Correctif |
|---------|---------|-----------|
| Toutes les dépendances majeures sont à jour | **N/A** | ✅ |
| `axios 1.13.5` — à vérifier pour CVE récentes | **Faible** | Lancer `npm audit` |
| `cargo audit` non exécuté régulièrement | **Faible** | Ajouter au CI |
**Positif** :
- Dependabot configuré (`.github/dependabot.yml`)
- CI exécute `govulncheck` (Go), `npm audit` (frontend)
- Gitleaks pour la détection de secrets
### A07 — Identification & Authentication Failures
| Constat | Gravité | Impact | Scénario d'exploitation | Correctif |
|---------|---------|--------|------------------------|-----------|
| ~~2FA login flow cassé~~ | ~~Élevée~~ | ~~Utilisateurs 2FA ne peuvent pas se connecter~~ | ~~Mauvais service~~ | **✅ Corrigé** : commentaire trompeur fixé, MSW handler ajouté, erreur AuthViewContent affichée |
| OAuth user lookup non implémenté | **Moyenne** | OAuth probablement non fonctionnel | `database.go:559` — TODO non résolu | Implémenter le lookup |
**Positif** :
- Password policy : minimum 12 caractères, complexité requise
- Bcrypt cost 12
- Account lockout
- Token version checking (révocation immédiate)
- Refresh token rotation avec token family
- Session management avec détection de device
### A08 — Software & Data Integrity Failures
| Constat | Gravité | Correctif |
|---------|---------|-----------|
| CI/CD sécurisé | ✅ | Trivy scans, SBOM, cosign signing |
| Input validation | ✅ | Zod (frontend) + validator (backend) |
| Webhook signature verification | ✅ | Hyperswitch webhooks vérifiés |
**Positif** :
- CD pipeline avec Trivy vulnerability scans
- SBOM generation
- Image signing avec cosign
- Post-deploy smoke tests
### A09 — Logging & Monitoring Failures
| Constat | Gravité | Correctif |
|---------|---------|-----------|
| Logging structuré | ✅ | Zap (Go), tracing (Rust), Sentry (Frontend) |
| Audit trail | ✅ | `audit_logs` table avec triggers |
| Secret filtering dans les logs | ✅ | `WrapLoggerWithSecretFilter()` |
| Prometheus metrics | ✅ | Collecte de métriques API |
**Positif** :
- Logging structuré en JSON en production
- Rotation de logs configurée
- Filtrage de secrets dans les logs
- Audit trail complet en base de données
- Prometheus + Grafana pour le monitoring
- Loki + Promtail pour l'agrégation de logs
### A10 — SSRF
| Constat | Gravité | Correctif |
|---------|---------|-----------|
| OAuth callbacks | **Faible** | Callbacks vers des providers connus uniquement |
| Stream server → fichiers | **Faible** | Accès fichiers locaux seulement |
| Pas de fetch user-controlled URL | ✅ | Aucun pattern dangereux détecté |
**Positif** : Pas de vecteur SSRF significatif identifié.
### Résumé sécurité
| Catégorie OWASP | Gravité max | État |
|-----------------|-------------|------|
| A01 — Access Control | Élevée | ⚠️ HLS public, routes fantômes |
| A02 — Crypto | Moyenne | ⚠️ Secrets test hardcodés |
| A03 — Injection | Faible | ✅ SQL injection chat server corrigée |
| A04 — Insecure Design | Moyenne | ⚠️ Download public |
| A05 — Misconfiguration | Moyenne | ⚠️ Bypass flags |
| A06 — Outdated Components | Faible | ✅ Globalement à jour |
| A07 — Auth Failures | Moyenne | ✅ 2FA login flow corrigé |
| A08 — Integrity | N/A | ✅ CI/CD sécurisé |
| A09 — Logging | N/A | ✅ Complet |
| A10 — SSRF | N/A | ✅ RAS |
---
## 5. DETTE TECHNIQUE
### 5.1 Dette critique (bloquante)
| Problème | Localisation | Impact | Effort |
|----------|-------------|--------|--------|
| **100+ `.unwrap()` en prod Rust** | `veza-stream-server/`, `veza-chat-server/` | Crash des services en production | L |
| **`panic()` si Redis down** | `veza-backend-api/internal/api/routes_core.go:242` | Backend crash si Redis indisponible | S |
| ~~SQL injection potentielle~~ | ~~`veza-chat-server/src/message_store.rs`~~ | ~~Vulnérabilité de sécurité~~ | **✅ Corrigé** |
| ~~2FA login flow cassé~~ | ~~`TwoFactorVerify.tsx`~~ | ~~Feature inutilisable~~ | **✅ Corrigé** |
| **OAuth user lookup manquant** | `veza-backend-api/internal/database/database.go:559` | OAuth non fonctionnel | M |
### 5.2 Dette structurante
| Problème | Localisation | Impact | Effort |
|----------|-------------|--------|--------|
| **Dual-pattern views/pages** | `components/views/` vs `features/*/pages/` | Confusion architecturale, duplication | L |
| **Config Go** | `internal/config/` (découpé par domaine) | Refactoré 2.7 | - |
| **137 fichiers .md à la racine** | Racine du repo | Pollution, navigabilité nulle | M |
| **25 fichiers .json à la racine** | Racine du repo | TODOs/rapports accumulés | S |
| **72 fichiers `.out` coverage** | `veza-backend-api/` | Non gitignorés, pollution | S |
| **Code mort : Education, Studio, Gamification** | Backend routes + Frontend components | Code fantôme non nettoyé | M |
| **Serveur alternatif** | `cmd/modern-server/main.go` | Code commenté, doublon | S |
| **`pages/` directory legacy** | `apps/web/src/pages/` | Doublon de `features/*/pages/` | M |
| **Versions Tokio non alignées** | `veza-common` (1.0) vs `chat-server` (1.35) | Conflits potentiels | S |
### 5.3 Dette cosmétique
| Problème | Localisation | Impact | Effort |
|----------|-------------|--------|--------|
| **72 TODOs/FIXMEs** | Tous les services | Code inachevé documenté | Variable |
| **Fichiers HTML à la racine** | `veza_design_system_v4.html`, etc. | Pollution du repo | S |
| **Fichiers de log committés** | `frontend.log`, `typecheck_output_*.txt` | Bruit dans le repo | S |
| **Répertoire `chat_exports/`** | Racine | Données non pertinentes | S |
| **Fichier `gen_hash.py`** | Racine | Script utilitaire orphelin | S |
| **Tests result files committés** | `apps/web/e2e-results.json`, etc. | Artefacts de build | S |
### 5.4 Métriques de dette
| Indicateur | Valeur | Seuil acceptable | Verdict |
|-----------|--------|-----------------|---------|
| Fichiers à la racine | 162+ | < 20 | Critique |
| LOC config Go | 1 461 | < 500 | |
| `.unwrap()` en prod Rust | 100+ | 0 | |
| TODOs dans le code | 72+ | < 20 | |
| Dual-patterns architecturaux | 2 | 0 | |
| Features fantômes | 3 | 0 | |
---
## 6. QUALITÉ ARCHITECTURALE
### 6.1 Score d'architecture : 6/10
**Positif** :
- Séparation claire des services (API, Chat, Stream, Frontend)
- Communication inter-services via HTTP/WebSocket/RabbitMQ
- Shared library `veza-common` pour les types communs
- Feature-based architecture côté frontend
- Couche API clean avec interceptors (retry, CSRF, refresh)
**Négatif** :
- Dual-pattern `components/views/` vs `features/*/pages/` incohérence architecturale
- `pages/` directory legacy encore présent
- Config monolithique Go (1 461 lignes dans un seul fichier)
- 3 points d'entrée serveur (`cmd/api/`, `cmd/modern-server/`, `cmd/backup/`)
- Features fantômes (Education, Gamification, Studio) non nettoyées
### 6.2 Score de maintenabilité : 5/10
**Positif** :
- Tests unitaires conséquents (269 frontend, 264 backend)
- Storybook complet (296 stories)
- TypeScript strict
- Zod validation schemas
- OpenAPI spec (3 654 lignes)
- Internationalisation complète
**Négatif** :
- 470K LOC pour un MVP surengineering probable
- 137 fichiers markdown accumulés à la racine
- Complexité cyclomatique élevée dans certains handlers
- Documentation technique dispersée et redondante
- Pas de documentation d'architecture (ADR, C4 model)
- Onboarding difficile pour un nouveau développeur
### 6.3 Score de sécurité : 6.5/10
**Positif** :
- Bcrypt cost 12, JWT avec rotation, CSRF, rate limiting multi-couche
- Security headers, CORS strict en prod
- Audit trail, secret filtering dans les logs
- CI avec govulncheck, npm audit, gitleaks, Trivy
- Session management avec hashing SHA-256
**Négatif** :
- 3 vulnérabilités de gravité élevée non corrigées
- `.unwrap()` crashes en prod
- HLS endpoints publics
- 2FA login cassé
- Bypass flags non protégés contre activation en prod
### 6.4 Score de scalabilité : 7/10
**Positif** :
- Architecture microservices avec services dédiés
- Kubernetes ready avec HPA, VPA, cluster autoscaler
- PostgreSQL avec support read replicas
- Redis caching, connection pooling
- RabbitMQ pour l'event bus
- CDN support ajouté récemment
- Prometheus metrics pour l'auto-scaling
**Négatif** :
- Pas de sharding database
- Chat server : max 20 connexions DB (potentiellement limitant)
- Pas de circuit breaker entre services
- Pas de service mesh (Istio/Linkerd)
---
## 7. INFRA & DEVOPS
### 7.1 Docker
| Aspect | État | Détail |
|--------|------|--------|
| Multi-stage builds | | Tous les Dockerfiles |
| Non-root user | | UID 1001 partout |
| Health checks | | Configurés dans tous les services |
| Image minimale | | Alpine Linux |
| Build optimisé | | `-ldflags="-w -s"`, LTO en Rust |
| Secrets dans le build | | Pas de secrets dans les images |
### 7.2 Kubernetes
| Aspect | État | Détail |
|--------|------|--------|
| Deployments | | 3 replicas par service |
| Network Policies | | Default deny |
| Secrets management | | External Secrets Operator |
| TLS | | cert-manager |
| HPA | | Auto-scaling configuré |
| Monitoring | | Prometheus + Grafana + Loki |
| Ingress | | Configuré |
### 7.3 CI/CD
| Aspect | État | Détail |
|--------|------|--------|
| Tests automatisés | | 12 workflows |
| Security scanning | | Gitleaks, govulncheck, Trivy |
| Vulnerability scanning | | npm audit, cargo audit |
| Image signing | | cosign |
| SBOM | | Génération automatique |
| Deploy automation | | CD workflow avec smoke tests |
### 7.4 Points d'attention
| Problème | Gravité | Détail |
|----------|---------|--------|
| `.env` fichiers locaux non committés | | Correctement gitignorés |
| Pas de `cargo audit` dans le CI chat/stream | **Moyenne** | Ajouter au workflow |
| `docker-compose.yml` expose des ports larges | **Faible** | Acceptable en dev |
| Pas de backup automatisé DB | **Moyenne** | `cmd/backup/` existe mais usage incertain |
### 7.5 Reproductibilité du setup
- `docker-compose.yml` : Setup local complet (PostgreSQL, Redis, RabbitMQ)
- `.env.example` : Template de configuration
- `Makefile` : Commandes de commodité
- `go.work` : Workspace Go
- `rust-toolchain.toml` : Version Rust fixée
- `turbo.json` : Orchestration monorepo
**Verdict** : Le setup est reproductible mais nécessite de la documentation (pas de `GETTING_STARTED.md` clair parmi les 137 fichiers markdown).
---
## 8. RISQUES BUSINESS
### 8.1 Point de vue CTO
**Forces** :
- Stack moderne et cohérente
- Tests conséquents
- CI/CD mature
- Sécurité globalement solide
- Architecture scalable
**Faiblesses** :
- 470K LOC pour un MVP vélocité de développement compromise
- Onboarding estimé à 2-3 semaines pour un senior
- 4 langages = besoin de profils polyglots rares
- 137 fichiers de documentation non structurés
- Risque de regression élevé sans tests d'intégration E2E robustes
**Recommandation CTO** : Stabiliser avant de recruter. Nettoyer la dette cosmétique pour faciliter l'onboarding.
### 8.2 Point de vue Investisseur
**Forces** :
- Produit fonctionnellement riche (15+ features)
- Architecture technique sérieuse
- Sécurité au-dessus de la moyenne des startups
- Kubernetes-ready = scaling possible
**Faiblesses** :
- 3 vulnérabilités critiques non corrigées
- Complexité disproportionnée vs stade du produit
- Dépendance à des profils Go + Rust + React (recrutement coûteux)
- Pas de métriques produit (DAU, retention, conversion)
- Pas de tests de charge en conditions réelles
**Recommandation Investisseur** : Corriger les vulnérabilités critiques avant. Le risque technique est maîtrisable. Le risque est davantage dans la complexité opérationnelle.
### 8.3 Point de vue Acquéreur
**Forces** :
- Base de code structurée
- Pas de dette de sécurité majeure (après correctifs P0)
- Stack standard sans vendor lock-in
- OpenAPI spec existante
**Faiblesses** :
- Coût de maintenance élevé (4 langages, 4 services)
- Documentation technique inexploitable (137 fichiers non structurés)
- Pas de ADR (Architecture Decision Records)
- Difficile à intégrer dans un écosystème existant
**Recommandation Acquéreur** : Valoriser comme acquisition technologique. Prévoir 3-6 mois de stabilisation post-acquisition.
### 8.4 Réponses directes
| Question | Réponse |
|----------|---------|
| **Peut-on lancer en prod ?** | **Non**, pas en l'état. 3 correctifs P0 requis (1-2 semaines). Après correctifs : oui, avec monitoring renforcé. |
| **Peut-on le vendre ?** | **Oui**, mais nécessite stabilisation et nettoyage documentaire pour due diligence. |
| **Peut-on le maintenir ?** | **Oui**, mais coût élevé. Nécessite 2-3 développeurs seniors polyglots. |
| **Faut-il refactorer ?** | **Oui**, refactoring ciblé sur : dual-patterns frontend, config monolithique, nettoyage code mort. Estimé 4-6 semaines. |
| **Faut-il réécrire ?** | **Non**. La base est solide. Refactoring suffisant. |
---
## 9. PLAN D'ACTION PRIORISÉ
### Phase 1 — URGENT : Sécurité & Stabilité (2-3 semaines)
| # | Action | Effort | Fichier(s) | Criticité |
|---|--------|--------|-----------|-----------|
| 1.1 | ~~Corriger SQL injection dans le chat server~~ | **S** | `veza-chat-server/src/message_store.rs` | ** Fait** |
| 1.2 | ~~Corriger le flow 2FA login~~ | **S** | `TwoFactorVerify.tsx`, `AuthViewContent.tsx`, `handlers-auth.ts` | ** Fait** |
| 1.3 | ~~Ajouter auth sur les endpoints HLS~~ | **M** | `veza-stream-server/src/routes/api.rs` | ** Fait** |
| 1.4 | ~~Remplacer `panic()` par erreur gracieuse si Redis down~~ | **S** | `veza-backend-api/internal/api/routes_core.go:242` | ** Fait** |
| 1.5 | ~~Corriger les `.unwrap()` critiques en Rust (paths de production)~~ | **M** | `veza-stream-server/src/`, `veza-chat-server/src/` | ** Fait** |
| 1.6 | ~~Supprimer les secrets test hardcodés~~ | **S** | `veza-chat-server/src/config.rs:216`, `jwt_manager.rs:575` | ** Fait** |
| 1.7 | ~~Ajouter protection contre bypass flags en production~~ | **S** | `veza-backend-api/internal/middleware/auth.go`, `csrf.go` | ** Fait** |
| 1.8 | ~~Implémenter OAuth user lookup~~ | **M** | `veza-backend-api/internal/database/database.go:559` | ** Fait** |
| 1.9 | ~~Ajouter `cargo audit` au CI~~ | **S** | `.github/workflows/chat-ci.yml`, `stream-ci.yml` | ** Fait** |
### Phase 2 — STABILISATION (4-6 semaines)
| # | Action | Effort | Détail |
|---|--------|--------|--------|
| 2.1 | ~~Unifier `components/views/` et `features/*/pages/`~~ | **L** | ** Fait** pattern unique `features/*/pages/` |
| 2.2 | ~~Nettoyer les 137 fichiers .md à la racine~~ | **M** | ** Fait** archivés dans docs/archive/root-md/ |
| 2.3 | ~~Nettoyer les 25 fichiers .json à la racine~~ | **S** | ** Fait** archivés dans docs/archive/root-json/ |
| 2.4 | ~~Supprimer le code mort (Education, Studio, Gamification)~~ | **M** | ** Fait** routes backend, MSW, refs supprimés |
| 2.5 | ~~Supprimer `cmd/modern-server/`~~ | **S** | ** Fait** bascule vers cmd/api/main.go |
| 2.6 | ~~Supprimer `pages/` directory legacy~~ | **M** | ** Fait** migré vers `features/*/pages/` |
| 2.7 | ~~Découper `config.go` (1 461 LOC)~~ | **M** | ** Fait** séparé par domaine (env_helpers, db_init, redis_init, rabbitmq, rate_limit, cors, services_init, middlewares_init) |
| 2.8 | ~~Gitignorer les fichiers `.out`, test results, `.turbo/`~~ | **S** | ** Fait** .gitignore mis à jour |
| 2.9 | ~~Aligner versions Tokio dans `veza-common`~~ | **S** | ** Fait** 1.0 1.35 (veza-common, stream-server/tools) |
| 2.10 | ~~Ajouter des tests d'intégration E2E pour les flows critiques~~ | **L** | ** Fait** Auth, Upload (existants), Purchase, Chat (purchase.spec.ts, chat.spec.ts) |
### Phase 3 — AMÉLIORATION & PRÉPARATION SCALE (6-12 semaines)
| # | Action | Effort | Détail |
|---|--------|--------|--------|
| 3.1 | ~~Implémenter circuit breaker entre services~~ | **L** | ** Fait** WebhookService, Hyperswitch (Backend Go) |
| 3.2 | ~~Ajouter tests de charge~~ | **L** | ** Fait** k6 (backend, stream, chat, marketplace, playlists), CI nightly |
| 3.3 | Créer une documentation d'architecture (C4, ADR) | **M** | Pour onboarding et due diligence |
| 3.4 | Ajouter un `GETTING_STARTED.md` clair | **S** | Guide d'onboarding développeur |
| 3.5 | Mettre en place database sharding strategy | **XL** | Si > 100K utilisateurs |
| 3.6 | Considérer service mesh (Istio) | **XL** | Observabilité + sécurité réseau |
| 3.7 | Migrer React 18 → React 19 | **L** | Quand stable |
| 3.8 | Ajouter WebAuthn comme alternative 2FA | **M** | Sécurité renforcée |
| 3.9 | Implémenter IDOR testing systématique | **M** | Tests de sécurité automatisés |
| 3.10 | Ajouter métriques produit (DAU, retention) | **M** | Pour les investisseurs |
---
## CONCLUSION STRATÉGIQUE
### Ce qui est bien fait
1. **Fondations sécurité solides** : Bcrypt, JWT avec rotation, CSRF, rate limiting multi-couche, audit trail
2. **Architecture microservices cohérente** : Séparation claire des responsabilités
3. **CI/CD mature** : 12 workflows, vulnerability scanning, image signing
4. **Testing conséquent** : 569 fichiers de test, Storybook, E2E
5. **Infrastructure production-ready** : Kubernetes, monitoring, auto-scaling
6. **Stack moderne** : Pas de dette technologique sur les frameworks
### Ce qui pose problème
1. **3 vulnérabilités critiques non corrigées** avant mise en production
2. **Complexité disproportionnée** pour un MVP (470K LOC, 4 langages)
3. **Pollution documentaire massive** (137 .md, 25 .json à la racine)
4. **Code mort non nettoyé** (3 features fantômes, serveur alternatif)
5. **Stabilité Rust fragile** (100+ `.unwrap()` en production)
6. **2FA login cassé** — feature critique non fonctionnelle
### Verdict final
Le projet Veza possède une **base technique de qualité supérieure à la moyenne des startups** à ce stade. L'architecture est saine, la sécurité est prise au sérieux, et l'infrastructure est prête pour la production.
Cependant, le projet souffre d'une **dette d'accumulation** (documentation, code mort, artefacts) et de **3 vulnérabilités critiques** qui doivent être corrigées avant tout déploiement en production.
Le plan de remédiation est estimé à **2-3 semaines pour les correctifs P0**, **4-6 semaines pour la stabilisation**, et **6-12 semaines pour l'amélioration**. Ces délais sont raisonnables et ne nécessitent pas de réécriture.
**Recommandation** : Investissement viable sous condition de remédiation Phase 1 avant mise en production.
---
*Rapport généré le 15 février 2026*
*Méthode : Analyse statique exhaustive du code source*
*Périmètre : 470 079 lignes de code, 4 services, 1 679 commits*