- 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)
35 KiB
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
- Cartographie globale
- Ce que le produit permet réellement
- Validation fonctionnelle
- Audit de sécurité — OWASP TOP 10
- Dette technique
- Qualité architecturale
- Infra & DevOps
- Risques business
- Plan d'action 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
- Dual-pattern views :
components/views/ETfeatures/*/pages/servent le même objectif — architecture incohérente - Routes Education : Le backend expose des routes publiques pour les tutoriels, mais la feature est retirée du frontend
- cmd/modern-server : Doublon du point d'entrée serveur avec du code commenté
- Coverage reports : 72 fichiers
.outdans 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
- Crash du stream server : 100+
.unwrap()dans du code Rust de production - CSRF inutilisable : Si Redis tombe, le backend Go panic au lieu de fallback gracieux
- 2FA cassé : Le flow de login 2FA appelle le mauvais endpoint
- 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 :
ProtectedRouteappliqué 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 |
|---|---|---|---|---|
message_store.rs |
%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/$2cô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
.envfichiers dans.gitignore.envnon 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 |
|---|---|---|---|---|
| ✅ 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 |
veza-chat-server/src/message_store.rs |
✅ Corrigé | ||
TwoFactorVerify.tsx |
✅ 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-commonpour les types communs - Feature-based architecture côté frontend
- Couche API clean avec interceptors (retry, CSRF, refresh)
Négatif :
- Dual-pattern
components/views/vsfeatures/*/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 configurationMakefile: Commandes de commoditégo.work: Workspace Gorust-toolchain.toml: Version Rust fixéeturbo.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 | S | veza-chat-server/src/message_store.rs |
✅ Fait | |
| 1.2 | S | TwoFactorVerify.tsx, AuthViewContent.tsx, handlers-auth.ts |
✅ Fait | |
| 1.3 | M | veza-stream-server/src/routes/api.rs |
✅ Fait | |
| 1.4 | panic() par erreur gracieuse si Redis down |
S | veza-backend-api/internal/api/routes_core.go:242 |
✅ Fait |
| 1.5 | .unwrap() critiques en Rust (paths de production) |
M | veza-stream-server/src/, veza-chat-server/src/ |
✅ Fait |
| 1.6 | S | veza-chat-server/src/config.rs:216, jwt_manager.rs:575 |
✅ Fait | |
| 1.7 | S | veza-backend-api/internal/middleware/auth.go, csrf.go |
✅ Fait | |
| 1.8 | M | veza-backend-api/internal/database/database.go:559 |
✅ Fait | |
| 1.9 | 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 | components/views/ et features/*/pages/ |
L | ✅ Fait — pattern unique features/*/pages/ |
| 2.2 | M | ✅ Fait — archivés dans docs/archive/root-md/ | |
| 2.3 | S | ✅ Fait — archivés dans docs/archive/root-json/ | |
| 2.4 | M | ✅ Fait — routes backend, MSW, refs supprimés | |
| 2.5 | cmd/modern-server/ |
S | ✅ Fait — bascule vers cmd/api/main.go |
| 2.6 | pages/ directory legacy |
M | ✅ Fait — migré vers features/*/pages/ |
| 2.7 | 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 | .out, test results, .turbo/ |
S | ✅ Fait — .gitignore mis à jour |
| 2.9 | veza-common |
S | ✅ Fait — 1.0 → 1.35 (veza-common, stream-server/tools) |
| 2.10 | 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 | L | ✅ Fait — WebhookService, Hyperswitch (Backend Go) | |
| 3.2 | 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
- Fondations sécurité solides : Bcrypt, JWT avec rotation, CSRF, rate limiting multi-couche, audit trail
- Architecture microservices cohérente : Séparation claire des responsabilités
- CI/CD mature : 12 workflows, vulnerability scanning, image signing
- Testing conséquent : 569 fichiers de test, Storybook, E2E
- Infrastructure production-ready : Kubernetes, monitoring, auto-scaling
- Stack moderne : Pas de dette technologique sur les frameworks
Ce qui pose problème
- 3 vulnérabilités critiques non corrigées avant mise en production
- Complexité disproportionnée pour un MVP (470K LOC, 4 langages)
- Pollution documentaire massive (137 .md, 25 .json à la racine)
- Code mort non nettoyé (3 features fantômes, serveur alternatif)
- Stabilité Rust fragile (100+
.unwrap()en production) - 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