veza/sub_task_agents/full_monorepo/FULL_MONOREPO_AUDIT.md

590 lines
28 KiB
Markdown
Raw Normal View History

I'll conduct this comprehensive audit by systematically exploring every layer of the monorepo. Let me start by mapping the entire codebase in parallel.
[4 tools called]
Now let me dive deeper into specific critical areas that need more examination.
[2 tools called]
Now let me verify a few critical remaining items before writing the final report.
[10 tools called]
I now have comprehensive data across all layers. Let me compile the complete audit report.
---
# RAPPORT D'AUDIT TECHNIQUE INTÉGRAL — MONOREPO VEZA
**Date :** 13 février 2026
**Auditeur :** Architecte logiciel senior / Expert sécurité
**Périmètre :** Monorepo `talas/veza` — Branche `main`
**Licence :** AGPL-3.0
**Dernière mise à jour du document :** 13 février 2026
---
## EXECUTIVE SUMMARY
Veza est une plateforme audio collaborative (type SoundCloud/Bandcamp) avec marketplace, chat temps réel, streaming audio, et fonctionnalités sociales. Le monorepo contient 4 services (Go backend, 2 serveurs Rust, frontend React) et une infrastructure Docker/K8s mature.
**Verdict global : Le produit est un MVP avancé avec une base technique solide mais des failles critiques qui interdisent un déploiement production en l'état.**
| Dimension | Score | Verdict |
|-----------|-------|---------|
| Architecture | 7/10 | Bonne structure, monorepo sous-exploité |
| Maintenabilité | 6/10 | Fichiers trop longs, features fantômes |
| Sécurité | 5/10 | Fondations OK, failles critiques présentes |
| Scalabilité | 7/10 | K8s prêt, mais services Rust incomplets |
**Risques bloquants immédiats (mis à jour 13/02/2026) :**
1. Fichiers `.env` : présents en local mais `.env` est dans `.gitignore` — vérifier quaucun secret nest dans lhistorique git.
2. ~~SSRF webhook~~ : **Corrigé**`webhook_service.go` implémente `IsURLSafe()` (blockedHostnames, isPrivateIP, schéma https/http uniquement).
3. ~~Contrôle daccès tracks~~ : **Corrigé**`validate_track_access()` dans `veza-stream-server` vérifie DB (is_public, owner, orders).
4. Pipeline CD : steps de build actifs (Backend, Frontend, Rust) ; seuls les tags registry sont commentés.
5. Services Rust : à valider (compilation).
---
## 1. CARTOGRAPHIE GLOBALE
### 1.1 Stack technique
| Couche | Technologie | Version |
|--------|------------|---------|
| **Frontend** | React + Vite + TypeScript + TailwindCSS 4 | React 18.2, Vite 7, TS 5.3 |
| **Backend API** | Go + Gin + GORM + PostgreSQL | Go 1.23.8, Gin 1.11 |
| **Chat Server** | Rust + Axum + SQLx + WebSocket | Axum 0.8, SQLx 0.8 |
| **Stream Server** | Rust + Axum + Symphonia (audio) | Axum 0.8 |
| **Base de données** | PostgreSQL 16 | 16-alpine |
| **Cache** | Redis 7 | 7-alpine |
| **Message Queue** | RabbitMQ 3 | 3-management-alpine |
| **Reverse Proxy** | HAProxy 2.8 | 2.8-alpine |
| **CI/CD** | GitHub Actions | v4/v5 actions |
| **Monitoring** | Prometheus + Grafana + Loki | K8s manifests |
| **Orchestration** | Docker Compose (dev/staging/prod) + Kubernetes | |
| **Tests** | Vitest, Playwright, Go testing, Cargo test | |
| **Documentation** | Docusaurus | |
### 1.2 Organisation du monorepo
```
veza/
├── apps/web/ # Frontend React (npm workspace)
├── packages/design-system/ # Design system (npm workspace, INUTILISÉ)
├── veza-backend-api/ # Backend Go
├── veza-chat-server/ # Chat Rust
├── veza-stream-server/ # Stream Rust
├── veza-common/ # Lib Rust partagée
├── veza-docs/ # Documentation Docusaurus
├── config/ # Config Docker/HAProxy/Incus
├── docker/ # Certificats Docker
├── k8s/ # Manifests Kubernetes
├── infra/ # Configs infrastructure
├── migrations/ # Migrations SQL
├── scripts/ # Scripts utilitaires (55+)
├── make/ # Modules Makefile
├── fixtures/ # Données de test
├── tests/ # Tests E2E/intégration
└── .github/ # CI/CD + templates
```
**Gestion monorepo :** npm workspaces uniquement. Pas de Turborepo/Nx/Lerna. Les services Go et Rust sont gérés indépendamment (pas de `go.work` root, pas de `Cargo.toml` workspace). C'est un **poly-repo déguisé en monorepo** — le seul lien réel est le npm workspace pour `apps/web` et `packages/design-system`.
### 1.3 Dépendances critiques
| Dépendance | Service | Risque |
|------------|---------|--------|
| `go-clamd v0.0.0-20170520113014` | Backend Go | **Abandonnée** — dernière mise à jour 2017 |
| `redis 0.27` vs `redis 0.32` | Stream vs Chat | **Incohérence** de version entre services |
| `packages/design-system` | Frontend | **Non utilisé** — 0 imports détectés |
| `@sentry/react 10.32.1` | Frontend | OK mais heavy (impact bundle) |
### 1.4 Flux de données
```
Browser → HAProxy → Backend Go API → PostgreSQL
→ Chat Server Rust → PostgreSQL + Redis
→ Stream Server Rust → PostgreSQL + Redis
← RabbitMQ (inter-service messaging)
```
---
## 2. CE QUE LE PRODUIT PERMET RÉELLEMENT
### 2.1 Features validées (implémentées front + back)
| Feature | Backend | Frontend | Tests | MSW |
|---------|---------|----------|-------|-----|
| Auth (login/register/logout) | OK | OK | OK | OK |
| Auth 2FA (TOTP) | OK | OK | Partiel | OK |
| OAuth (Google, GitHub, etc.) | OK | OK | Non | Non |
| Gestion profil utilisateur | OK | OK | OK | OK |
| Upload de tracks (chunked) | OK | OK | Partiel | Partiel |
| Lecture de tracks | OK | OK | OK | OK |
| Recherche de tracks | OK | OK | OK | OK |
| Playlists (CRUD) | OK | OK | OK | OK |
| Chat WebSocket | OK | OK | Partiel | OK |
| Marketplace (produits) | OK | OK | Partiel | Partiel |
| Social (feed, posts) | OK | Partiel | Partiel | Partiel |
| Notifications | OK | OK | Non | OK |
| Webhooks | OK | OK | Non | Partiel |
| Analytics | OK | OK | Non | OK |
| Dashboard | OK | OK | OK | OK |
| Settings (sessions, sécurité) | OK | OK | OK | OK |
| Admin (rôles, modération) | OK | OK | Partiel | OK |
| CSRF protection | OK | OK | OK | OK |
### 2.2 Features partiellement implémentées
| Feature | Statut | Détail |
|---------|--------|--------|
| **Streaming audio HLS** | Backend endpoints existent, flag `HLS_STREAMING: false` côté front | Transcoding queue existe en DB mais non connecté |
| **Social groups** | Mocks MSW existent, pas d'endpoint backend | `CreateGroupModal.tsx` existe, aucun backend |
| **Marketplace wishlist** | Frontend + mocks, pas d'endpoint backend | `WishlistView` rendu, données mockées |
| **Marketplace panier** | Frontend + mocks, pas d'endpoint backend | `cartStore` Zustand, données mockées |
| **Commentaires avec réponses** | Frontend supporte replies, backend = CRUD plat | Pas d'endpoint `/comments/:id/replies` |
| **Export playlist** | Service frontend a `exportPlaylist()` marqué TODO | Non implémenté |
| **Duplication playlist** | Service frontend a `duplicatePlaylist()` marqué TODO | Non implémenté |
### 2.3 Features fantômes (déclarées, non fonctionnelles)
| Feature | Route frontend | Backend | Statut réel |
|---------|---------------|---------|-------------|
| **Gear Inventory** | `/gear` → ComingSoon | Aucun endpoint | UI vide |
| **Live Streaming** | `/live` → ComingSoon | Aucun endpoint | UI vide |
| **Education/Courses** | `/education` → ComingSoon | Aucun endpoint | Mocks MSW seulement |
| **Queue de lecture** | `/queue` → ComingSoon | Aucun endpoint | UI vide |
| **Developer Dashboard** | `/developer` → ComingSoon | Aucun endpoint | Mocks MSW seulement |
| **Gamification** | Pas de route | Aucun endpoint | Mocks MSW existent (`/api/v1/gamification/*`) |
| **Contests** | Tables DB existent | Tables `contests`, `contest_entries`, etc. en migration | Aucun handler Go |
### 2.4 Features mortes
| Feature | Localisation | Statut |
|---------|-------------|--------|
| `packages/design-system` | npm workspace | **0 imports** dans le frontend — complètement inutilisé |
| PWA Install Banner | `App.tsx` ligne 209 | Commenté : "too intrusive" |
| Storybook tests | `vitest.config.ts` lignes 49-170 | **Entièrement commenté** |
| Playlist version history | `playlistService.ts` | TODO, test exclu (`T0509`) |
| WebRTC dans stream-server | `src/streaming/webrtc.rs` | Structure présente, **aucune lib WebRTC intégrée** |
### 2.5 Incohérences produit/code
1. **~30 endpoints backend n'ont pas de mock MSW** — impossible de tester en Storybook/dev mode
2. **10+ mocks MSW n'ont aucun backend** — les features apparaissent fonctionnelles en dev mais crasheront en production
3. **Le search frontend utilise `/api/v1/search` générique** alors que le backend a des endpoints séparés `/tracks/search`, `/playlists/search`, `/users/search`
4. **Tables DB pour contests/gamification** existent dans les migrations mais aucun code applicatif ne les utilise
---
## 3. VALIDATION FONCTIONNELLE
### 3.1 Points de rupture identifiés
| Flow critique | Risque | Impact |
|---------------|--------|--------|
| **Chat en production** | Le fallback JWT (ligne 415, `jwt_manager.rs`) crée un utilisateur "user" avec rôle "user" si l'utilisateur n'est pas trouvé en DB | Un utilisateur supprimé garde un token valide avec un username/rôle forgé |
| **Streaming audio** | ~~`validate_track_access()` = placeholder~~ | **Corrigé** : vérification DB (is_public, owner, orders) dans `token_validator.rs` |
| **Webhook dispatch** | ~~Pas de validation SSRF~~ | **Corrigé** : `IsURLSafe()` dans `webhook_service.go` (IP privées, hostnames bloqués, schéma) |
| **Marketplace en prod** | Wishlist, panier, paiement = mocks seulement | Crash immédiat en environnement sans MSW |
| **Social groups** | `CreateGroupModal.tsx` appelle un endpoint inexistant | Erreur 404 silencieuse en production |
### 3.2 Scénarios de crash évidents
1. **Accès marketplace sans MSW** : Le cartStore appelle `/api/v1/commerce/cart` — endpoint inexistant. En prod = erreur 404.
2. **Accès wishlist sans MSW** : Appels vers `/api/v1/marketplace/wishlist` — endpoint inexistant.
3. **Upload > 5GB** : Le chunked upload a des endpoints backend mais le MSW mock est simplifié. Pas de tests d'intégration.
4. **Perte de connexion Redis** : Le rate limiter a un fallback, mais le CSRF store (Redis) n'en a pas clairement défini.
5. **Session 100ms delay** : `App.tsx` introduit un délai de 100ms à l'initialisation auth — possible race condition avec des requêtes précoces.
### 3.3 Couverture de tests
| Zone | Fichiers test | Qualité | Verdict |
|------|--------------|---------|---------|
| **Backend Go** | 261 fichiers `*_test.go` | Table-driven, mocks, security tests | **Bonne** |
| **Frontend composants** | 186 `.test.tsx` | Testing Library, userEvent, a11y | **Bonne** |
| **Frontend services** | 94 `.test.ts` | Mocks Axios, edge cases | **Correcte** |
| **Chat Server Rust** | Quelques unit tests | Beaucoup `#[ignore]` | **Faible** |
| **Stream Server Rust** | Quelques unit tests | Beaucoup `#[ignore]` | **Faible** |
| **E2E** | Playwright configuré | Config présente, peu de tests visibles | **Insuffisante** |
| **Storybook tests** | 324 stories | Tests d'interaction commentés dans vitest | **Désactivés** |
---
## 4. AUDIT DE SÉCURITÉ — OWASP TOP 10
### A01 — Broken Access Control
| Vulnérabilité | Gravité | Impact | Scénario |
|---------------|---------|--------|----------|
| ~~`validate_track_access()` = placeholder~~ | **Corrigé** | — | Implémentation réelle dans `veza-stream-server` (is_public, owner, orders) |
| JWT fallback dans chat server : user non trouvé → username="user", role="user" | **ÉLEVÉE** | Usurpation d'identité | Un utilisateur supprimé conserve un accès chat avec un token valide et un username forgé |
| Query params non validés (pagination) | **MOYENNE** | DoS potentiel | `page=-1&limit=999999` — pas de bounds checking dans `playlist_handler.go:145`, `profile_handler.go:205`, `track/handler.go:814` |
**Correctifs :**
1. ~~Implémenter `validate_track_access()`~~**Fait** (token_validator.rs)
2. Rejeter le refresh token si l'utilisateur n'existe plus en DB
3. Ajouter validation bounds sur tous les query params de pagination
### A02 — Cryptographic Failures
| Vulnérabilité | Gravité | Impact | Scénario |
|---------------|---------|--------|----------|
| `.env` avec secrets committés dans git | **CRITIQUE** | Compromission de tous les secrets | `JWT_SECRET`, `DB_PASSWORD`, `RABBITMQ_URL` exposés dans l'historique git |
| Developer API keys stockées en localStorage (chiffrées Web Crypto) | **MOYENNE** | Vol de clés si XSS | Même chiffré, le localStorage est accessible via JavaScript |
| SSL désactivé en dev (`sslmode=disable`) | **FAIBLE** | Interception en dev | Acceptable en développement uniquement |
**Points positifs :**
- JWT HS256 avec validation d'algorithme
- Tokens httpOnly cookies (pas de localStorage)
- CSRF tokens stockés en mémoire
- Refresh tokens avec rotation et version checking
- Bcrypt/Argon2 pour hashing mots de passe
- Access token TTL court (5 minutes)
### A03 — Injection
| Vulnérabilité | Gravité | Impact |
|---------------|---------|--------|
| SQL LIKE wildcard non échappé dans `message_repository.rs:563` | **FAIBLE** | Résultats de recherche inattendus (pas d'injection SQL) |
| `dangerouslySetInnerHTML` dans le chat | **MOYENNE** | XSS si DOMPurify mal configuré |
**Points positifs :**
- GORM (Go) : requêtes paramétrées partout
- SQLx (Rust) : `.bind()` systématique
- DOMPurify pour sanitization HTML côté frontend
- `SanitizeText` utilitaire côté backend
### A04 — Insecure Design
| Vulnérabilité | Gravité | Impact |
|---------------|---------|--------|
| Pas de validation d'URL webhook (SSRF) | **ÉLEVÉE** | Scan réseau interne, accès à metadata cloud |
| Features mockées en dev qui crashent en prod | **ÉLEVÉE** | Dégradation UX en production |
| Pas de feature flag system | **MOYENNE** | Features fantômes exposées aux utilisateurs |
### A05 — Security Misconfiguration
| Vulnérabilité | Gravité | Impact |
|---------------|---------|--------|
| Hardcoded passwords dans `docker-compose.yml` | **ÉLEVÉE** | Réutilisation accidentelle en prod |
| `docker-compose.prod.yml` requiert variables `DB_PASS`, `JWT_SECRET` | **OK** | Bien configuré avec `?` operator |
| CORS validé en production, wildcard bloqué | **OK** | Correctement implémenté |
| Rate limiting désactivé en dev | **FAIBLE** | Acceptable |
| Stack traces en production | **MOYENNE** | Potentielle fuite d'information — vérifier `includeStackTrace` |
### A06 — Vulnerable & Outdated Components
| Composant | Version | Risque |
|-----------|---------|--------|
| `go-clamd` | 2017 (pseudo-version) | **ÉLEVÉE** — Aucune maintenance depuis 7 ans |
| Redis incohérent | 0.27 vs 0.32 | **MOYENNE** — Comportements divergents possibles |
| Go 1.23.8 | Récent | OK |
| Vite 7 | Récent | OK |
| React 18.2 | Stable | OK |
**Points positifs :**
- `govulncheck` dans CI
- `cargo audit` dans CI
- `npm audit --audit-level=high` dans CI
### A07 — Identification & Authentication Failures
| Aspect | Statut |
|--------|--------|
| JWT algorithme validé (HS256 only) | **OK** |
| Token version checking | **OK** |
| Refresh token rotation | **OK** |
| Session management (Redis) | **OK** |
| 2FA (TOTP) | **OK** |
| Password reset flow | **OK** |
| OAuth providers | **OK** |
| Rate limiting sur login | **OK** |
| Account lockout | **OK** (via admin unlock endpoint) |
**Verdict : Implémentation auth robuste.** Seul point faible : le fallback JWT du chat server.
### A08 — Software & Data Integrity Failures
| Vulnérabilité | Gravité | Impact |
|---------------|---------|--------|
| Pipeline CD commenté — aucun déploiement automatique réel | **ÉLEVÉE** | Pas de déploiement vérifié |
| Pas de signature des builds Docker | **MOYENNE** | Intégrité des images non vérifiable |
| Pas de SBOM (Software Bill of Materials) | **FAIBLE** | Conformité limitée |
**Points positifs :**
- CI avec lint, typecheck, tests, security audit
- Zod validation des inputs côté frontend
- Go validator côté backend
- Dependabot configuré
### A09 — Logging & Monitoring Failures
| Aspect | Statut |
|--------|--------|
| Structured logging (Go: Zap, Rust: tracing, Front: Sentry) | **OK** |
| Request ID correlation | **OK** |
| Audit trail | **OK** (backend audit endpoints) |
| Slow request detection | **OK** (frontend 1000ms threshold) |
| Error tracking (Sentry) | **OK** |
| Prometheus metrics | **OK** |
| K8s monitoring (Prometheus/Grafana/Loki) | **OK** (manifests prêts) |
| Log rotation | **OK** (scripts/rotate\_logs.sh) |
**Verdict : Bonne couverture monitoring.**
### A10 — SSRF
| Vulnérabilité | Gravité | Impact | Localisation |
|---------------|---------|--------|-------------|
| ~~**Webhook URL non validée**~~ | **Corrigé** | `IsURLSafe()` dans webhook_service.go (IPs privées, hostnames, schéma) | — |
| OAuth redirect validation | **OK** | `isAllowedRedirectOrigin()` vérifie les origines | `oauth_handlers.go:124-150` |
| Status handler URLs | **OK** | URLs depuis config, pas user input | `status_handler.go` |
**Correctif webhook :** Implémenté (IsURLSafe : IPs privées, hostnames bloqués, schémas http/https).
---
## 5. DETTE TECHNIQUE
### 5.1 Dette critique (bloquante)
| Item | Localisation | Impact |
|------|-------------|--------|
| **Secrets dans git** | `.env` est dans `.gitignore` ; fichiers .env présents en local — vérifier historique git | Rotation des secrets si jamais committés |
| **CD pipeline** | `.github/workflows/cd.yml` — builds actifs (Backend, Frontend, Rust) ; tags registry commentés | Déploiement partiel possible |
| **CI paths** | `chat-ci.yml` utilise `veza-chat-server/**` (vérifié 13/02/2026) | OK |
| **Migration UUID incomplète** | `migrations/001_migrate_ids_to_uuid_up.sql` ajoute `new_id` mais ne migre pas les PKs/FKs | Migration impossible à compléter |
| ~~**Stream server validate_track_access**~~ | **Corrigé** | Implémentation réelle dans `token_validator.rs` |
### 5.2 Dette structurante
| Item | Localisation | Impact |
|------|-------------|--------|
| `interceptors.ts` = 1204 lignes | `apps/web/src/services/api/interceptors.ts` | Maintenance difficile, logique CSRF dupliquée |
| `handlers.ts` MSW = 1700+ lignes | `apps/web/src/mocks/handlers.ts` | Impossible à maintenir, features fantômes mélangées |
| Features fantômes exposées | 5 routes ComingSoon + 10+ mocks sans backend | Confusion produit, dette de maintenance |
| Design system inutilisé | `packages/design-system/` | Workspace npm pollué, duplication avec `src/components/ui/` |
| Tables DB sans code | `contests`, `contest_*`, `equipment`, `hardware_sales` | Schema DB pollué, migrations fragiles |
| Redis version mismatch | Chat `0.32` vs Stream `0.27` | Comportements divergents, maintenance complexe |
| Absence de workspace Rust | Pas de `Cargo.toml` root | Pas de build/test unifié des services Rust |
| Absence de workspace Go | Pas de `go.work` actif | Services Go isolés |
### 5.3 Dette cosmétique
| Item | Localisation |
|------|-------------|
| Code commenté dans vitest.config.ts (120+ lignes) | `apps/web/vitest.config.ts:49-170` |
| Debug fetch calls commentés | `OfflineIndicator.tsx` |
| TODOs non résolus dans services | `playlistService.ts:236,255,291,299` |
| `dist_verification` comme nom de build output | `vite.config.ts` |
| Scripts archivés non nettoyés | `scripts/archive/` |
| HACK comment | `PlayerExpanded.tsx:132` |
---
## 6. QUALITÉ ARCHITECTURALE
### Score d'architecture : 7/10
**Justification :**
- (+) Clean architecture côté Go (handlers/services/repositories/middleware)
- (+) Feature-based structure côté React
- (+) Séparation microservices claire (API, Chat, Stream)
- (+) Shared library Rust (veza-common)
- (-) Monorepo sans orchestrateur (pas de Turborepo/Nx)
- (-) Pas de workspace Rust/Go unifié
- (-) Design system package inutilisé
- (-) Couplage frontend/mocks trop fort (features fantômes)
### Score de maintenabilité : 6/10
**Justification :**
- (+) TypeScript strict, Go avec linting, Rust avec clippy
- (+) 541 fichiers de tests au total
- (+) i18n (en/fr)
- (+) Storybook avec 324 stories
- (-) Fichiers critiques trop longs (interceptors 1204L, handlers MSW 1700L)
- (-) Features fantômes créant confusion
- (-) Tests Storybook désactivés
- (-) Tests Rust largement `#[ignore]`
- (-) 30+ endpoints backend sans mock MSW correspondant
### Score de sécurité : 5/10
**Justification :**
- (+) Auth JWT solide (rotation, versioning, httpOnly)
- (+) CSRF implémenté (Redis + memory)
- (+) Rate limiting multi-couche
- (+) CORS validé en production
- (+) XSS sanitization (DOMPurify)
- (+) Vulnerability scanning en CI (govulncheck, cargo audit, npm audit)
- (-) **Secrets** : .env dans .gitignore — vérifier historique git (critique si committés)
- (✓) ~~SSRF via webhooks~~ **Corrigé** (IsURLSafe)
- (✓) ~~Track access = always true~~ **Corrigé** (validate_track_access réel)
- (-) **JWT fallback user** dans chat server (élevé)
- (-) Dépendance abandonnée (go-clamd 2017)
### Score de scalabilité : 7/10
**Justification :**
- (+) Architecture microservices
- (+) K8s manifests complets (HPA, VPA, monitoring)
- (+) Docker Compose pour dev/staging/prod
- (+) HAProxy reverse proxy
- (+) Redis pour cache/sessions
- (+) RabbitMQ pour messaging inter-services
- (+) Code splitting frontend (vendor chunks)
- (-) Stream server incomplet (pas de WebRTC réel)
- (-) Pas de CDN configuré pour les assets audio
- (-) Connection pooling DB à valider sous charge
---
## 7. INFRA & DEVOPS
### 7.1 Docker
| Aspect | Statut | Détail |
|--------|--------|--------|
| Multi-stage builds | **OK** | Tous les Dockerfiles |
| Non-root user | **OK** | `USER app` partout |
| Health checks | **OK** | Tous les services |
| Alpine base images | **OK** | Taille minimale |
| Secrets en build args | **OK** | Pas de secrets dans les Dockerfiles |
| Healthcheck path mismatch | **KO** | `Dockerfile.production` backend utilise `/health` au lieu de `/api/v1/health` |
### 7.2 Configuration
| Aspect | Statut |
|--------|--------|
| Dev compose | **OK** mais passwords hardcodées |
| Prod compose | **OK** — variables requises avec `?` operator |
| Staging compose | **OK** — variables séparées |
| Test compose | **OK** — tmpfs pour performance |
| K8s manifests | **OK** — complets avec External Secrets, monitoring |
| HAProxy | **OK** — config référencée mais non auditée en profondeur |
### 7.3 Secrets exposés
**État 13/02/2026 :** Le fichier `.env` est listé dans `.gitignore` (racine). Les fichiers `.env` peuvent exister en local (non suivis). **À faire :** vérifier quaucun `.env` avec secrets na été committé dans lhistorique git (`git log -p -- .env`). Si oui, rotation obligatoire des secrets.
### 7.4 Reproductibilité du setup
- `docker-compose.yml` fournit un setup dev complet
- `.env.example` existe mais les `.env` réels sont aussi committés
- Scripts de setup dans `scripts/` et `make/`
- **Score : 7/10** — fonctionnel mais pollué par les .env committés
---
## 8. RISQUES BUSINESS
### En tant que CTO
**Peut-on lancer ce produit en prod ?**
**Non, pas en l'état.** Raisons :
1. Secrets exposés → rotation obligatoire avant tout déploiement
2. Stream server = placeholder → les tracks payantes sont accessibles à tous
3. Pipeline CD non fonctionnel → déploiement manuel uniquement
4. Features mockées en dev qui crasheront en prod (wishlist, cart, groups)
**Peut-on le maintenir ?**
**Oui, avec effort modéré.** La base de code est bien structurée, les conventions sont claires. Les fichiers trop longs et les features fantômes sont le principal frein. L'équipe doit maîtriser Go, Rust, TypeScript et l'infrastructure K8s — compétence rare.
**Faut-il le refactorer ?**
**Oui, partiellement.** Les fondations sont saines. Le refactoring doit se concentrer sur :
- Nettoyage des features fantômes
- Split des fichiers > 300 lignes
- Complétion du stream server
- Activation du pipeline CD
**Faut-il le réécrire ?**
**Non.** La codebase est de qualité suffisante. Réécrire serait un gaspillage.
### En tant qu'investisseur
**La technologie supporte-t-elle le business ?**
Partiellement. Le core (auth, tracks, playlists, chat) fonctionne. La marketplace et le streaming sont incomplets. Le ratio features implémentées / features annoncées est d'environ **60%**.
**Quel est le time-to-market restant ?**
- Pour un MVP fonctionnel (core features) : **2-4 semaines** (corrections sécurité + nettoyage)
- Pour un produit complet (marketplace + streaming) : **3-6 mois**
**Risque d'investissement :**
- Stack multi-langage (Go + Rust + TS) = coût d'embauche élevé
- Seul développeur visible → **bus factor = 1**
- Licence AGPL-3.0 → implications pour les clients SaaS
### En tant qu'acquéreur
**Peut-on le vendre en l'état ?**
**Non.** Les failles de sécurité et les features fantômes constituent un risque réputationnel.
**Valeur technique :**
- Architecture solide et extensible
- Bonne couverture de tests (541 fichiers)
- Infrastructure K8s prête
- Base technique saine pour un build-out
---
## 9. PLAN D'ACTION PRIORISÉ
### Phase 1 — Urgent (sécurité & stabilité) — 1-2 semaines
| Action | Effort | Priorité |
|--------|--------|----------|
| Vérifier historique git pour .env + rotation de secrets si nécessaire | S | P0 |
| ~~Implémenter validation URL webhook (anti-SSRF)~~ | — | **Fait** (IsURLSafe) |
| ~~Implémenter `validate_track_access()` réel dans stream server~~ | — | **Fait** (token_validator.rs) |
| Supprimer le JWT fallback user dans chat server (rejeter si user non trouvé) | S | P0 |
| ~~Corriger les paths CI pour Rust~~ | — | **Fait** (veza-chat-server utilisé) |
| Ajouter validation bounds sur query params pagination | S | P1 |
| Fixer le healthcheck path dans `Dockerfile.production` backend | S | P1 |
### Phase 2 — Stabilisation — 2-4 semaines
| Action | Effort | Priorité |
|--------|--------|----------|
| Supprimer ou isoler les features fantômes (ComingSoon routes, mocks sans backend) | M | P1 |
| Supprimer `packages/design-system` inutilisé | S | P1 |
| Splitter `interceptors.ts` en modules (CSRF, retry, validation, cache) | M | P1 |
| Splitter `handlers.ts` MSW par domaine | M | P1 |
| Compléter les mocks MSW pour les 30+ endpoints backend manquants | L | P2 |
| Réactiver les tests Storybook | M | P2 |
| Standardiser la version Redis entre services Rust | S | P2 |
| Remplacer `go-clamd` (2017) par une alternative maintenue | M | P2 |
| Activer le pipeline CD (décommenter, configurer registry) | M | P2 |
| Nettoyer les tables DB fantômes (contests, equipment) ou les migrer | M | P2 |
### Phase 3 — Amélioration & refonte — 2-3 mois
| Action | Effort | Priorité |
|--------|--------|----------|
| Implémenter le streaming WebRTC réel dans stream server | XL | P2 |
| Implémenter la marketplace complète (panier, paiement, wishlist) | XL | P2 |
| Ajouter un orchestrateur monorepo (Turborepo recommandé) | L | P3 |
| Créer un workspace Rust unifié | M | P3 |
| Ajouter E2E Playwright pour les flows critiques | L | P3 |
| Implémenter un système de feature flags | M | P3 |
| Compléter la migration UUID (PKs + FKs) | XL | P3 |
| Ajouter SBOM et signature des builds Docker | M | P3 |
| Configurer un CDN pour les assets audio | L | P3 |
| Réduire le bundle frontend (analyser et optimiser) | M | P3 |
---
## CONCLUSION STRATÉGIQUE
**Veza est un projet techniquement ambitieux avec une base de code de qualité correcte, mais qui souffre de son sur-scope.** Le développeur a construit une infrastructure impressionnante (4 services, K8s, CI/CD, monitoring) mais a dispersé ses efforts sur trop de features, laissant des placeholders dangereux dans des zones critiques (contrôle d'accès, streaming).
**Les 3 actions les plus impactantes :**
1. **Sécurité immédiate** : SSRF webhook et `validate_track_access()` **corrigés** (13/02/2026). Reste : rotation des secrets si .env jamais committés.
2. **Nettoyage du scope** : supprimer les features fantômes → clarifie le produit et réduit la dette de 40%
3. **Pipeline CD fonctionnel** : builds actifs ; décommenter les tags registry pour déploiement complet.
**Score global de maturité technique : 6/10** — MVP avancé. Corrections sécurité majeures en place ; 2-4 semaines de travail ciblé restant avant lancement production (secrets, JWT chat, pagination, healthcheck). Mise à jour 13/02/2026.