# 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 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.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 1. **Sécurité** : JWT, bcrypt, CSRF, RBAC, rate limiting, audit trail 2. **Architecture** : Microservices, séparation claire 3. **CI/CD** : govulncheck, npm audit, cargo audit, Trivy, cosign 4. **Stack** : Moderne, à jour 5. **Chat/Stream** : Compilent correctement ### Ce qui pose problème 1. **TODOs** : 60+ dans le backend 2. **Tests frontend** : 42% échec à investiguer 3. **Mode Boot** : Services désactivés pour démarrage minimal 4. **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*