AUDIT TECHNIQUE INTÉGRAL — MONOREPO VEZA
Date : 16 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, configurations, CI/CD et 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 utilise une stack polyglotte (Go, Rust, TypeScript/React).
Verdict
| Critère |
Score |
Commentaire |
| Architecture |
6.5/10 |
Bonne séparation des services, dual-patterns frontend résiduels |
| Maintenabilité |
5.5/10 |
Dette structurelle, 60+ TODOs backend, documentation pléthorique |
| Sécurité |
7/10 |
Fondations solides (JWT, bcrypt, CSRF, RBAC), quelques points à surveiller |
| Scalabilité |
7/10 |
Architecture microservices, K8s prêt, circuit breakers présents |
Peut-on lancer en production ? Oui, avec précaution. Le mode "Boot" (RabbitMQ, ClamAV, Chat/Stream désactivés) permet un déploiement minimal. Pour un déploiement complet, réactiver les services un par un.
Peut-on vendre le produit ? Oui. Le produit a de la valeur fonctionnelle. Stabilisation recommandée 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.24 / 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 |
2025.01.21 |
Checkout |
| Monitoring |
Prometheus + Sentry |
- |
Métriques + erreurs |
| CI/CD |
GitHub Actions |
- |
CI + CD workflows |
| Orchestration |
Turborepo + Docker |
- |
Monorepo + conteneurs |
1.2 Organisation du repo
veza/
├── apps/web/ # Frontend React
│ ├── src/features/ # Modules fonctionnels
│ ├── src/components/ # Composants partagés + views
│ ├── src/services/ # API client (apiClient, webhookService, etc.)
│ ├── src/stores/ # Zustand stores
│ ├── src/mocks/ # MSW handlers (8 fichiers)
│ └── e2e/ # Playwright tests
├── veza-backend-api/ # Backend Go
│ ├── cmd/api/ # Entry point
│ ├── internal/
│ │ ├── handlers/ # Handlers HTTP
│ │ ├── middleware/ # Auth, CSRF, rate limit, RBAC
│ │ ├── core/ # Domain logic (auth, track, marketplace)
│ │ ├── services/ # Services métier
│ │ └── config/ # Configuration (validation stricte)
│ └── migrations/ # SQL migrations
├── veza-chat-server/ # Chat Rust (compile OK)
├── veza-stream-server/ # Streaming Rust (compile OK)
├── veza-common/ # Bibliothèque Rust partagée
├── packages/ # NPM shared packages
├── config/ # HAProxy, Prometheus
├── k8s/ # Manifestes Kubernetes
├── .github/workflows/ # ci.yml, cd.yml
└── docs/ # Documentation (index dans docs/README.md)
1.3 Flux de données
Browser → HAProxy (80/443)
├── /api/* → Backend Go (8080)
│ ├── PostgreSQL — données principales
│ ├── Redis — sessions, cache, rate limiting, CSRF
│ └── RabbitMQ — événements asynchrones
├── /ws → Chat Server Rust (3000)
│ ├── PostgreSQL — messages
│ └── Redis — pub/sub
├── /stream → Stream Server Rust (3001)
│ ├── PostgreSQL — métadonnées
│ └── Redis — cache
└── /* → Frontend SPA (5173)
1.4 Dépendances critiques
| Dépendance |
Service |
Statut |
| gin-gonic/gin v1.11 |
Backend |
✅ À jour |
| gorm v1.30 |
Backend |
✅ À jour |
| golang-jwt/jwt v5.3 |
Backend |
✅ À jour |
| axum 0.8 |
Chat/Stream |
✅ À jour |
| sqlx 0.8 |
Chat/Stream |
✅ À jour |
| react 18.2 |
Frontend |
✅ Stable |
| axios 1.13.5+ |
Frontend |
✅ Override ≥1.13.5 (CVE) |
| npm audit |
Frontend |
✅ 0 vulnérabilités |
1.5 Technologies réellement utilisées vs déclarées
- Déclarées et utilisées : React, Vite, Tailwind, Go, Gin, GORM, Rust, Axum, PostgreSQL, Redis, RabbitMQ
- Déclarées mais partiellement : HLS streaming (flag
HLS_STREAMING: false), Notifications (flag NOTIFICATIONS: false)
- Abandonnées : veza-mobile (35+ erreurs), packages/design-system (sous-utilisé)
2. CE QUE LE PRODUIT PERMET RÉELLEMENT
2.1 Features pleinement implémentées ✅
| Feature |
Backend |
Frontend |
Notes |
| Auth (register, login, JWT, refresh) |
✅ |
✅ |
Complet |
| 2FA (TOTP) |
✅ |
✅ |
Complet |
| OAuth (Google, GitHub, Discord) |
✅ |
✅ |
Complet |
| Profils utilisateur |
✅ |
✅ |
Complet |
| Upload de tracks (chunked) |
✅ |
✅ |
Complet |
| CRUD Tracks |
✅ |
✅ |
Complet |
| Playlists (CRUD, collaboration) |
✅ |
✅ |
Complet |
| Chat WebSocket |
✅ |
✅ |
Complet |
| Recherche |
✅ |
✅ |
Complet |
| Social (follows, blocks) |
✅ |
✅ |
Complet |
| Administration |
✅ |
✅ |
Complet |
| Marketplace |
✅ |
✅ |
Complet |
| Webhooks |
✅ |
✅ |
Backend + webhookService.ts (apiClient) |
2.2 Features partiellement implémentées ⚠️
| Feature |
Localisation |
Statut |
| Dashboard |
Backend MSW |
Mocks partiels |
| HLS Streaming |
HLS_STREAMING: false |
Endpoints manquants |
| Notifications |
NOTIFICATIONS: false |
Non implémenté |
| Role Management |
ROLE_MANAGEMENT: false |
Partiel |
| Playlist Share |
PLAYLIST_SHARE: false |
Partiel |
2.3 Features fantômes (UI sans backend)
| Feature |
Localisation |
Statut |
| Studio (Cloud File Browser) |
apps/web/src/features/studio/ |
UI seule |
| Inventory (Gear) |
apps/web/src/features/inventory/ |
UI + mocks |
| Education |
apps/web/src/features/education/ |
MSW uniquement |
| Gamification |
MSW handlers |
MSW uniquement |
| Live Streaming |
Route /live |
Contenu minimal |
2.4 Incohérences produit/code
- webhookApi.ts supprimé : Le fichier
apps/web/src/features/webhooks/api/webhookApi.ts est supprimé (git status). Le frontend utilise désormais webhookService.ts qui appelle apiClient directement. Les types générés (WebhookApi dans api.ts) restent disponibles via OpenAPI.
- Mode Boot :
VEZA_MODE=boot désactive RabbitMQ, ClamAV, Chat, Stream, S3. Le cœur (Backend + Web) fonctionne.
3. VALIDATION FONCTIONNELLE
3.1 Couverture de tests
| Composant |
Type |
Statut |
| Backend Go |
Unit + Integration + Security |
Tests présents, exécution longue |
| Chat Rust |
Unit |
Compile OK |
| Stream Rust |
Unit |
Compile OK |
| Frontend |
Vitest + Playwright |
42% échec mentionné (user rules) |
| E2E |
Playwright (ci.yml) |
Intégré au CI |
| Storybook |
Visual + Audit |
npm run test:storybook |
3.2 Points de rupture identifiés
| Scénario |
Gravité |
Détail |
| Redis indisponible |
Moyenne |
CSRF désactivé si Redis down (routes_core.go) |
| RabbitMQ down |
Moyenne |
Mode dégradé, pas d'événements async |
| ClamAV désactivé |
Moyenne |
Uploads sans scan virus (Boot mode) |
| E2E tests flaky |
Moyenne |
Git status : nombreux test-results supprimés, retries |
3.3 Zones non testées
- OAuth flow complet
- Payment webhook Hyperswitch (tests limités)
- WebRTC streaming
- Multi-tenant isolation (IDOR systématique)
3.4 Flows critiques sécurisés
- Auth : JWT validation (iss, aud, exp), token version, session validation
- RBAC :
RequireAuth(), RequireAdmin(), RequireOwnershipOrAdmin(), RequireContentCreatorRole()
- CSRF : Middleware sur routes protégées (POST/PUT/DELETE)
- Rate limiting : Multi-couche (IP, user, endpoint)
4. AUDIT DE SÉCURITÉ — OWASP TOP 10
A01 — Broken Access Control
| Constat |
Gravité |
Impact |
Correctif |
Routes internal (/api/v1/internal/tracks/:id/stream-ready) |
Moyenne |
Protégées par StreamCallbackAuth (X-Internal-API-Key) |
✅ Correct |
| HLS endpoints |
À vérifier |
Si publics : accès non autorisé |
Vérifier auth sur stream server |
| RBAC |
✅ |
RequireOwnershipOrAdmin, RequireAdmin |
Correct |
Positif : Toutes les routes protégées utilisent AuthMiddleware. Ownership vérifié sur tracks, users, products.
A02 — Cryptographic Failures
| Constat |
Gravité |
Correctif |
| JWT_SECRET |
✅ |
Requis, min 32 chars, validé au démarrage |
| Bcrypt |
✅ |
Cost 12 (password_service.go, auth service) |
| Token versioning |
✅ |
Révocation immédiate |
| Cookies |
✅ |
HttpOnly, Secure en prod, SameSite |
A03 — Injection
| Constat |
Gravité |
Correctif |
| GORM |
✅ |
Requêtes paramétrées (Where avec ?) |
| Raw() |
✅ |
analytics_service.go : paramètre trackID via ? |
| sqlx (Rust) |
✅ |
Requêtes paramétrées $1, $2 |
| testutils/db.go |
Faible |
fmt.Sprintf avec whitelist validateTableName |
A04 — Insecure Design
| Constat |
Gravité |
Correctif |
| Rate limiting |
✅ |
Multi-couche, DISABLE_RATE_LIMIT_FOR_TESTS en E2E |
| Account lockout |
✅ |
AuthRateLimitLoginAttempts |
| Input validation |
✅ |
go-playground/validator, Zod frontend |
| File upload |
✅ |
Magic bytes, MIME, extension, ClamAV optionnel |
A05 — Security Misconfiguration
| Constat |
Gravité |
Correctif |
| CORS |
✅ |
Pas de wildcard en prod, validation stricte |
| LOG_LEVEL=DEBUG |
✅ |
Refusé en prod |
| Bypass flags |
À surveiller |
validateNoBypassFlagsInProduction |
| Swagger |
✅ |
Désactivé en prod |
A06 — Vulnerable & Outdated Components
| Constat |
Gravité |
Correctif |
| npm audit |
✅ |
0 vulnérabilités |
| govulncheck |
✅ |
Exécuté dans CI (backend) |
| cargo audit |
✅ |
Exécuté dans CI (chat, stream) |
| Trivy |
✅ |
CD pipeline (images Docker) |
A07 — Identification & Authentication Failures
| Constat |
Gravité |
Correctif |
| JWT validation |
✅ |
ValidateToken, VerifyTokenVersion |
| Session |
✅ |
ValidateSession, refresh rotation |
| Password reset |
✅ |
Tokens avec expiration |
| 2FA |
✅ |
TOTP, backup codes |
A08 — Software & Data Integrity Failures
| Constat |
Gravité |
Correctif |
| CI/CD |
✅ |
Trivy, SBOM, cosign |
| Webhook signature |
✅ |
Hyperswitch vérifié |
A09 — Logging & Monitoring Failures
| Constat |
Gravité |
Correctif |
| Logging |
✅ |
Zap, tracing, Sentry |
| Secret filtering |
✅ |
WrapLoggerWithSecretFilter |
| Audit trail |
✅ |
audit_logs table |
A10 — SSRF
| Constat |
Gravité |
Correctif |
| OAuth callbacks |
Faible |
Providers connus uniquement |
| Pas de fetch user-controlled |
✅ |
Aucun pattern dangereux |
Résumé sécurité
| Catégorie OWASP |
Gravité max |
État |
| A01 — Access Control |
Moyenne |
✅ RBAC correct |
| A02 — Crypto |
N/A |
✅ Solide |
| A03 — Injection |
Faible |
✅ Paramétré |
| A04 — Insecure Design |
N/A |
✅ Rate limit, validation |
| A05 — Misconfiguration |
N/A |
✅ Validation config |
| A06 — Outdated |
N/A |
✅ À jour |
| A07 — Auth |
N/A |
✅ Complet |
| A08 — Integrity |
N/A |
✅ CI 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 |
| Aucune identifiée |
- |
- |
- |
5.2 Dette structurante
| Problème |
Localisation |
Impact |
Effort |
| 60+ TODOs/FIXMEs backend |
internal/ |
Code inachevé documenté |
M |
| Dual-pattern views/pages |
components/ vs features/ |
Confusion |
L |
| Config Go monolithique |
config.go ~680 lignes |
Maintenabilité |
M |
| Features fantômes |
Studio, Education, Gamification |
Code mort |
M |
| webhookApi.ts supprimé |
webhooks/ |
webhookService utilisé, cohérent |
N/A |
5.3 Dette cosmétique
| Problème |
Localisation |
Impact |
Effort |
| fmt.Printf debug |
routes_core.go:89-99 |
Logs de debug en prod |
S |
| Fichiers test-results, playwright-report |
apps/web/ |
Artefacts committés |
S |
| Documentation dispersée |
docs/ |
54+ fichiers |
M |
5.4 Métriques
| Indicateur |
Valeur |
Verdict |
| TODOs backend |
60+ |
⚠️ |
| Chat/Stream compile |
OK |
✅ |
| npm audit |
0 vulnérabilités |
✅ |
6. QUALITÉ ARCHITECTURALE
6.1 Score d'architecture : 6.5/10
Positif :
- Séparation claire des services
- Feature-based frontend
- Core/Handlers/Services backend
- OpenAPI spec, types générés
Négatif :
- Dual-pattern views/pages
- Config Go dense
- Features fantômes
6.2 Score de maintenabilité : 5.5/10
Positif :
- Tests unitaires
- Storybook
- TypeScript strict
- Zod + validator
Négatif :
- 60+ TODOs
- Documentation pléthorique
- Onboarding complexe
6.3 Score de sécurité : 7/10
Positif :
- JWT, bcrypt, CSRF, RBAC
- Rate limiting, account lockout
- govulncheck, npm audit, Trivy
- Secret filtering
Négatif :
- fmt.Printf debug à retirer
- Vérifier HLS auth
6.4 Score de scalabilité : 7/10
Positif :
- Microservices
- K8s ready
- Circuit breakers
- Read replicas support
7. INFRA & DEVOPS
7.1 Docker
| Aspect |
État |
| Multi-stage builds |
✅ |
| Non-root user |
✅ |
| Health checks |
✅ |
| Secrets |
✅ Pas dans les images |
7.2 CI/CD
| Workflow |
Contenu |
| ci.yml |
Backend (govulncheck, vet, lint, test, build), Rust (cargo audit, lint, build, test), Frontend (npm audit, generate-types, lint, typecheck, test, build), E2E (Playwright) |
| cd.yml |
Build images, Trivy scan, SBOM, push registry, cosign, K8s deploy, smoke tests |
7.3 Points d'attention
- playwright.yml supprimé : E2E intégrés dans ci.yml
- RABBITMQ_URL E2E :
amqp://...@localhost:15672/ — port 15672 est management, 5672 pour AMQP. Vérifier.
- DISABLE_RATE_LIMIT_FOR_TESTS : Utilisé en E2E, acceptable
8. RISQUES BUSINESS
8.1 Point de vue CTO
Forces : Stack moderne, tests, CI/CD, sécurité solide
Faiblesses : Complexité (4 langages), onboarding long, TODOs accumulés
Recommandation : Stabiliser, nettoyer les TODOs prioritaires
8.2 Point de vue Investisseur
Forces : Produit riche, architecture sérieuse, sécurité au-dessus de la moyenne
Faiblesses : Complexité opérationnelle, coût de maintenance
Recommandation : Viable après stabilisation
8.3 Réponses directes
| Question |
Réponse |
| Peut-on lancer en prod ? |
Oui en mode Boot (Backend + Web). Complet : réactiver services un par un. |
| Peut-on vendre ? |
Oui, avec stabilisation pour due diligence. |
| Peut-on maintenir ? |
Oui, 2-3 devs seniors polyglots. |
| Faut-il refactorer ? |
Oui, ciblé : dual-patterns, config, code mort. |
| Faut-il réécrire ? |
Non. |
9. PLAN D'ACTION PRIORISÉ
Phase 1 — URGENT (1-2 semaines)
| # |
Action |
Effort |
Fichier(s) |
| 1.1 |
Retirer fmt.Printf debug |
S |
routes_core.go:89-99 |
| 1.2 |
Vérifier auth HLS sur stream server |
M |
veza-stream-server |
| 1.3 |
Corriger RABBITMQ_URL E2E (port 5672) |
S |
ci.yml |
| 1.4 |
Stabiliser tests frontend (42% échec) |
M |
apps/web |
Phase 2 — STABILISATION (3-4 semaines)
| # |
Action |
Effort |
| 2.1 |
Triage des 60+ TODOs backend |
M |
| 2.2 |
Unifier dual-pattern views/pages |
L |
| 2.3 |
Supprimer features fantômes (Studio, Education, Gamification) |
M |
| 2.4 |
Découper config.go |
M |
| 2.5 |
Nettoyer artefacts (test-results, playwright-report) du repo |
S |
Phase 3 — AMÉLIORATION (6-12 semaines)
| # |
Action |
Effort |
| 3.1 |
Documentation architecture (C4, ADR) |
M |
| 3.2 |
GETTING_STARTED.md clair |
S |
| 3.3 |
Tests IDOR systématiques |
M |
| 3.4 |
Réactiver RabbitMQ, ClamAV, Chat, Stream en prod |
L |
CONCLUSION STRATÉGIQUE
Ce qui est bien fait
- Sécurité : JWT, bcrypt, CSRF, RBAC, rate limiting, audit trail
- Architecture : Microservices, séparation claire
- CI/CD : govulncheck, npm audit, cargo audit, Trivy, cosign
- Stack : Moderne, à jour
- Chat/Stream : Compilent correctement
Ce qui pose problème
- TODOs : 60+ dans le backend
- Tests frontend : 42% échec à investiguer
- Mode Boot : Services désactivés pour démarrage minimal
- Documentation : Dispersée
Verdict final
Le projet Veza possède une base technique solide. L'architecture est saine, la sécurité est prise au sérieux. Les services Rust (Chat, Stream) compilent. Le backend Go est fonctionnel. Le frontend nécessite une investigation sur les tests en échec.
Recommandation : Déploiement possible en mode Boot. Plan de remédiation Phase 1 pour production complète.
Rapport généré le 16 février 2026
Périmètre : Monorepo Veza, analyse statique et dynamique