veza/AUDIT_EXHAUSTIF_2025_01_27.md

1148 lines
43 KiB
Markdown
Raw Normal View History

# 🔍 AUDIT EXHAUSTIF — PROJET VEZA
**Date** : 2025-01-27
**Auditeur** : Audit technique senior (sécurité + architecture + performance)
**Repository** : `/home/senke/Documents/veza`
**Objectif** : Cartographier l'état actuel du projet et proposer un plan de remédiation réaliste
---
## 📋 TABLE DES MATIÈRES
1. [Vue d'ensemble du projet](#1-vue-densemble-du-projet)
2. [Cartographie détaillée du code](#2-cartographie-détaillée-du-code)
3. [État fonctionnel : ce qui marche / est partiel / est cassé](#3-état-fonctionnel)
4. [Sécurité : failles et surfaces d'attaque](#4-sécurité)
5. [Performance & architecture technique](#5-performance--architecture-technique)
6. [Guide d'utilisation du projet (mode actuel réel)](#6-guide-dutilisation)
7. [Axes d'amélioration (sécurité, qualité, features)](#7-axes-damélioration)
8. [Synthèse finale](#8-synthèse-finale)
---
## 1. VUE D'ENSEMBLE DU PROJET
### 1.1 Résumé exécutif
**Veza** est une plateforme audio collaborative en développement, organisée en monorepo avec une architecture micro-services. Le projet vise à fournir un service de streaming audio avec fonctionnalités collaboratives (chat, playlists partagées, transcodage).
**État global** : **"PoC prometteur mais fragile"**
Le projet présente :
-**Backend Go** : Fonctionnel et relativement stable (92% coverage selon l'audit de stabilité)
- ⚠️ **Chat Server (Rust)** : Compile avec warnings, mais présente des problèmes de race conditions et de gestion d'erreurs
- ⚠️ **Stream Server (Rust)** : Compile avec de nombreux warnings, code partiellement implémenté
-**Frontend React** : Erreurs TypeScript bloquantes (42% échec de tests selon les règles)
**Points positifs** :
- Architecture claire (monorepo bien structuré)
- Documentation présente (docs/, veza-docs/)
- Système de migrations DB cohérent
- Authentification JWT implémentée
- Tests présents (même si partiellement fonctionnels)
**Points fragiles** :
- Incohérences entre services (pas de transaction distribuée)
- Code mort / partiellement implémenté (notamment dans stream-server)
- Erreurs TypeScript non résolues dans le frontend
- Gestion d'erreurs incomplète dans plusieurs composants
- Race conditions identifiées dans le chat server
**Utilisabilité actuelle** :
- **Backend Go** : Utilisable avec précautions (nécessite PostgreSQL, Redis, variables d'env)
- **Chat Server** : Utilisable en dev, mais nécessite attention aux race conditions
- **Stream Server** : Partiellement fonctionnel, code expérimental présent
- **Frontend** : Non utilisable sans corrections TypeScript
### 1.2 Stack technique identifiée
#### Langages principaux
- **Backend** : Go 1.23.8
- **Chat Server** : Rust (édition 2021)
- **Stream Server** : Rust (édition 2021)
- **Frontend** : TypeScript/React (Vite)
- **Scripts** : Bash, Python (outils)
#### Frameworks et bibliothèques clés
**Backend Go** :
- `gin-gonic/gin` : Framework HTTP
- `gorm.io/gorm` : ORM
- `golang-jwt/jwt/v5` : JWT
- `go.uber.org/zap` : Logging
- `github.com/redis/go-redis/v9` : Client Redis
- `github.com/rabbitmq/amqp091-go` : RabbitMQ
**Chat Server (Rust)** :
- `axum` : Framework web async
- `tokio` : Runtime async
- `sqlx` : SQL async
- `jsonwebtoken` : JWT
- `lapin` : RabbitMQ client
- `tracing` : Logging structuré
**Stream Server (Rust)** :
- `axum` : Framework web
- `tokio` : Runtime async
- `sqlx` : SQL async
- `symphonia`, `hound`, `minimp3` : Traitement audio
- `m3u8-rs` : HLS streaming
- `tracing` : Logging
**Frontend** :
- `react` 18.2.0
- `vite` 7.1.5
- `typescript` 5.3.3
- `tailwindcss` 4.0.0
- `zustand` : State management
- `@tanstack/react-query` : Data fetching
- `playwright` : E2E tests
#### Bases de données et systèmes de stockage
- **PostgreSQL 15** : Base principale (backend, chat, stream)
- **Redis 7** : Cache et sessions
- **RabbitMQ 3.12** : Event bus inter-services
#### Services externes / API
- **Sentry** : Monitoring d'erreurs (configuré mais optionnel)
- **Prometheus** : Métriques (exposées via `/metrics`)
#### Organisation du repo
**Monorepo** avec structure claire :
```
veza/
├── apps/web/ # Frontend React
├── veza-backend-api/ # Backend Go
├── veza-chat-server/ # Chat Server Rust
├── veza-stream-server/ # Stream Server Rust
├── veza-desktop/ # Wrapper Electron
├── veza-common/ # Code partagé Rust
├── veza-rust-common/ # Utilitaires Rust
├── docs/ # Documentation
├── scripts/ # Scripts de déploiement/test
├── docker/ # Config Docker
└── migrations/ # Migrations globales
```
---
## 2. CARTOGRAPHIE DÉTAILLÉE DU CODE
### 2.1 Structure du repository
#### `veza-backend-api/` (Go)
- **Rôle** : API REST principale, gestion utilisateurs, playlists, tracks, analytics
- **Langage** : Go 1.23.8
- **Niveau de maturité** : ✅ **Stable** (92% coverage, migrations structurées)
- **Structure** :
- `cmd/api/main.go` : Point d'entrée principal
- `internal/handlers/` : Handlers HTTP
- `internal/services/` : Logique métier
- `internal/models/` : Modèles GORM
- `internal/middleware/` : Middleware (auth, RBAC, metrics)
- `internal/database/` : Gestion DB et migrations
- `migrations/` : Migrations SQL (12 fichiers)
#### `veza-chat-server/` (Rust)
- **Rôle** : Serveur WebSocket pour chat en temps réel
- **Langage** : Rust (édition 2021)
- **Niveau de maturité** : ⚠️ **Partiel** (compile mais warnings, race conditions)
- **Structure** :
- `src/main.rs` : Point d'entrée
- `src/websocket/` : Gestion WebSocket
- `src/repository/` : Accès DB
- `src/security/` : Permissions, CSRF
- `src/typing_indicator.rs` : Indicateurs de frappe
- `migrations/` : Migrations SQL (11 fichiers)
#### `veza-stream-server/` (Rust)
- **Rôle** : Streaming audio (HLS, WebSocket), transcodage
- **Langage** : Rust (édition 2021)
- **Niveau de maturité** : ⚠️ **Partiel / Expérimental** (compile avec warnings, code mort)
- **Structure** :
- `src/main.rs` : Point d'entrée
- `src/core/` : Traitement audio, encoding, sync
- `src/codecs/` : Codecs audio (MP3, AAC, FLAC, Opus)
- `src/streaming/` : HLS, WebSocket transport
- `src/routes/` : Routes HTTP
- `migrations/` : Migrations SQL (2 fichiers)
#### `apps/web/` (React/TypeScript)
- **Rôle** : Interface utilisateur web
- **Langage** : TypeScript/React
- **Niveau de maturité** : ❌ **Cassé** (erreurs TypeScript bloquantes)
- **Structure** :
- `src/app/` : Point d'entrée React
- `src/features/` : Features par domaine (auth, player, chat, etc.)
- `src/components/` : Composants réutilisables
- `src/services/` : Clients API
- `e2e/` : Tests Playwright
#### `scripts/` (Bash)
- **Rôle** : Automatisation (déploiement, tests, migrations)
- **Fichiers clés** :
- `start-veza.sh` : Démarrage complet
- `migrate-db.sh` : Migrations DB
- `run-tests.sh` : Tests
- `lab/` : Scripts pour environnement lab
#### `docs/` (Markdown)
- **Rôle** : Documentation technique
- **Fichiers clés** :
- `AUDIT_STABILITY.md` : Audit de stabilité existant
- `DB_MIGRATIONS_STRATEGY_FINAL.md` : Stratégie migrations
- `TODO_TRIAGE_VEZA.md` : Tâches en cours
### 2.2 Points d'entrée
#### Backend Go
**Fichier principal** : `veza-backend-api/cmd/api/main.go`
**Commande de lancement** :
```bash
cd veza-backend-api
go run ./cmd/api
```
**Dépendances** :
- PostgreSQL (via `DATABASE_URL`)
- Redis (via `REDIS_URL`)
- Variables d'environnement :
- `JWT_SECRET` (requis)
- `DB_PASSWORD` (requis)
- `APP_PORT` (défaut: 8080)
- `APP_ENV` (défaut: development)
**Port** : 8080 (configurable)
#### Chat Server (Rust)
**Fichier principal** : `veza-chat-server/src/main.rs`
**Commande de lancement** :
```bash
cd veza-chat-server
cargo run --release
```
**Dépendances** :
- PostgreSQL (via `DATABASE_URL`)
- Redis (optionnel, via `REDIS_URL`)
- RabbitMQ (optionnel, via `RABBITMQ_URL`)
- Variables d'environnement :
- `JWT_SECRET` (requis, min 32 caractères)
- `CHAT_SERVER_PORT` (défaut: 8081)
**Port** : 8081 (configurable)
#### Stream Server (Rust)
**Fichier principal** : `veza-stream-server/src/main.rs`
**Commande de lancement** :
```bash
cd veza-stream-server
cargo run --release
```
**Dépendances** :
- PostgreSQL (via `DATABASE_URL`)
- Redis (via `REDIS_URL`)
- Variables d'environnement :
- `JWT_SECRET` (requis)
- `STREAM_PORT` (défaut: 8082)
- `SECRET_KEY` (requis, 32 bytes)
**Port** : 8082 (configurable)
#### Frontend React
**Fichier principal** : `apps/web/src/main.tsx`
**Commande de lancement** :
```bash
cd apps/web
npm install
npm run dev
```
**Dépendances** :
- Node.js 18+
- Variables d'environnement :
- `VITE_API_URL` (défaut: http://localhost:8080/api)
- `VITE_WS_URL` (défaut: ws://localhost:8081/ws)
- `VITE_STREAM_URL` (défaut: ws://localhost:8082/stream)
**Port** : 5173 (Vite dev server)
#### Docker Compose (tous services)
**Fichier** : `docker-compose.yml`
**Commande de lancement** :
```bash
docker-compose up -d
```
**Services** :
- `postgres` : PostgreSQL 15
- `redis` : Redis 7
- `rabbitmq` : RabbitMQ 3.12
- `backend-api` : Backend Go
- `chat-server` : Chat Server Rust
- `stream-server` : Stream Server Rust
- `frontend` : Frontend React (Nginx)
- `haproxy` : Reverse proxy
### 2.3 Tests & qualité
#### Backend Go
**Types de tests** : Unitaires, intégration, transactions
**Commande** :
```bash
cd veza-backend-api
go test ./... -v
```
**Résultat** : ✅ **Fonctionnel** (92% coverage selon AUDIT_STABILITY.md)
**Linters** : Pas de linter configuré explicitement (gofmt standard)
#### Chat Server (Rust)
**Types de tests** : Unitaires (certains marqués `#[ignore]` car nécessitent DB)
**Commande** :
```bash
cd veza-chat-server
cargo test
```
**Résultat** : ⚠️ **Partiel** (tests nécessitant DB ignorés)
**Linters** : `cargo clippy` (non exécuté dans l'audit)
#### Stream Server (Rust)
**Types de tests** : Unitaires (peu présents)
**Commande** :
```bash
cd veza-stream-server
cargo test
```
**Résultat** : ⚠️ **Partiel** (peu de tests)
**Linters** : `cargo clippy` (non exécuté dans l'audit)
#### Frontend React
**Types de tests** : Unitaires (Vitest), E2E (Playwright)
**Commande** :
```bash
cd apps/web
npm test # Unitaires
npm run test:e2e # E2E
```
**Résultat** : ❌ **Cassé** (42% échec selon règles, erreurs TypeScript)
**Linters** : ESLint configuré (`npm run lint`)
#### CI/CD
**Fichiers** : `.github/workflows/`
- `backend-ci.yml` : Tests Go
- `chat-ci.yml` : Tests Rust (chat)
- `stream-ci.yml` : Tests Rust (stream)
- `frontend-ci.yml` : Tests React
- `ci.yml` : Pipeline global
**Status** : Configuré mais non validé dans cet audit
---
## 3. ÉTAT FONCTIONNEL
### 3.1 Tableau de synthèse
| Composant / Module | Rôle | Langage / Tech | État | Commentaire technique | Commande(s) |
|-------------------|------|---------------|------|---------------------|-------------|
| **Backend API** | API REST principale | Go 1.23 / Gin | ✅ | Fonctionnel, 92% coverage. Gestion JSON robuste. | `go run ./cmd/api` |
| **Chat Server** | WebSocket chat | Rust / Axum | ⚠️ | Compile mais race conditions (TypingIndicatorManager). Warnings. | `cargo run --release` |
| **Stream Server** | Streaming audio | Rust / Axum | ⚠️ | Compile avec warnings. Code mort présent. FFmpeg monitoring fragile. | `cargo run --release` |
| **Frontend Web** | Interface utilisateur | React / Vite | ❌ | Erreurs TypeScript bloquantes. Imports manquants. | `npm run dev` (ne démarre pas proprement) |
| **Database Migrations** | Schéma DB | SQL | ✅ | Migrations structurées (12 backend, 11 chat, 2 stream). UUID-first. | `scripts/migrate-db.sh` |
| **Docker Compose** | Orchestration | Docker | ✅ | Configuration complète. Health checks présents. | `docker-compose up` |
| **Authentication** | JWT + Sessions | Go/Rust | ✅ | JWT HS256, refresh tokens, sessions validées. | Intégré |
| **RBAC** | Permissions | Go | ✅ | Service PermissionService, middleware RequirePermission. | Intégré |
| **Event Bus** | Communication inter-services | RabbitMQ | ⚠️ | Implémenté mais optionnel (mode dégradé si absent). | Via RabbitMQ |
| **Health Checks** | Monitoring | HTTP | ✅ | `/health` (stateless), `/status` (avec DB check). | Intégré |
### 3.2 Détail par composant
#### 3.2.1 Backend Go (`veza-backend-api`)
**Description** : API REST pour gestion utilisateurs, playlists, tracks, analytics, chat (legacy).
**Implémentation actuelle** :
- **Fichiers clés** :
- `cmd/api/main.go` : Point d'entrée avec graceful shutdown
- `internal/api/router.go` : Configuration routes
- `internal/handlers/` : Handlers HTTP (auth, social, playlists, etc.)
- `internal/services/` : Services métier (auth, playlist, RBAC, etc.)
- `internal/middleware/auth.go` : Middleware JWT + sessions
- `internal/middleware/rbac_auth_middleware.go` : RBAC
- `internal/database/database.go` : Gestion DB + migrations
- **Endpoints importants** :
- `POST /api/v1/auth/login` : Authentification
- `POST /api/v1/auth/register` : Inscription
- `GET /api/v1/playlists` : Liste playlists
- `GET /api/v1/tracks` : Liste tracks
- `GET /health` : Health check
- `GET /status` : Status avec DB check
- **Couverture de tests** : 92% (selon AUDIT_STABILITY.md)
**État réel** :
-**Marche bien** : Compilation OK, démarrage OK, endpoints principaux fonctionnels
- ⚠️ **Points de fragilité** :
- Erreurs silencieuses dans certains handlers (résolu partiellement avec `BindAndValidateJSON`)
- Absence de transactions dans certaines opérations multi-étapes
- Race condition dans workers retries
- Timing attack potentiel sur password reset
**Points de fragilité** :
- **Hypothèses implicites** : DB toujours disponible (pas de circuit breaker)
- **Gestion d'erreur** : Certaines erreurs DB non wrappées avec contexte
- **Couplage** : Dépendance forte à PostgreSQL (pas de fallback)
- **Legacy** : Code chat legacy présent (`internal/api/` vs `internal/handlers/`)
#### 3.2.2 Chat Server (`veza-chat-server`)
**Description** : Serveur WebSocket pour chat en temps réel avec gestion des conversations, typing indicators, read receipts.
**Implémentation actuelle** :
- **Fichiers clés** :
- `src/main.rs` : Point d'entrée avec Axum
- `src/websocket/handler.rs` : Handler WebSocket
- `src/repository/message_store.rs` : Repository messages
- `src/typing_indicator.rs` : Gestion typing indicators
- `src/read_receipts.rs` : Read receipts
- `src/security/permission.rs` : Vérifications permissions
- **Endpoints** :
- `GET /ws` : WebSocket upgrade
- `GET /api/messages/:conversation_id` : Récupération messages
- `POST /api/messages` : Envoi message
- `GET /health` : Health check
**État réel** :
- ⚠️ **Marche mais avec limitations** :
- Compile avec warnings (unused imports, variables)
- Race condition dans `TypingIndicatorManager` (RwLock vs Mutex)
- Race conditions dans `DeliveredStatusManager` et `ReadReceiptManager`
- Pas de panic boundary dans `handle_socket`
- Tasks orphelins possibles (monitoring typing indicators)
- Pas de heartbeat timeout pour détecter connexions zombies
**Points de fragilité** :
- **Race conditions** : TypingIndicatorManager, DeliveredStatusManager, ReadReceiptManager
- **Gestion d'erreur** : 31 fichiers avec `unwrap()` ou `expect()` (panics possibles)
- **Tasks** : Pas de mécanisme de shutdown propre pour certaines tasks
- **Permissions** : Risque de bypass si PermissionService échoue (fail-secure non garanti)
#### 3.2.3 Stream Server (`veza-stream-server`)
**Description** : Serveur de streaming audio avec transcodage (HLS, WebSocket), gestion des segments, synchronisation multi-clients.
**Implémentation actuelle** :
- **Fichiers clés** :
- `src/main.rs` : Point d'entrée
- `src/core/processing/processor.rs` : Traitement audio
- `src/core/processing/segment_tracker.rs` : Suivi segments
- `src/core/processing/ffmpeg_monitor.rs` : Monitoring FFmpeg
- `src/streaming/hls.rs` : HLS streaming
- `src/streaming/websocket.rs` : WebSocket transport
- `src/routes/encoding.rs` : Routes transcodage
**État réel** :
- ⚠️ **Partiellement fonctionnel** :
- Compile avec de nombreux warnings (unused imports, variables, champs)
- Code mort présent (champs non lus, méthodes non utilisées)
- Tasks non cancellées proprement en cas d'erreur (`abort()` brutal)
- Erreurs FFmpeg non propagées correctement (loggées mais job continue)
- DB pas toujours sync en cas de crash (segments non persistés)
- Corruption d'état concurrent possible dans SegmentTracker
- Regex non robustes dans FFmpegMonitor (pas de fallback)
**Points de fragilité** :
- **Code mort** : Nombreux champs/méthodes non utilisés (refactoring nécessaire)
- **Gestion d'erreur** : Erreurs FFmpeg loggées mais non fatales
- **Concurrence** : SegmentTracker peut avoir des problèmes d'ordre
- **Monitoring** : FFmpegMonitor fragile (regex, IO errors incomplètes)
#### 3.2.4 Frontend React (`apps/web`)
**Description** : Interface utilisateur web pour la plateforme Veza (player audio, chat, playlists, recherche).
**Implémentation actuelle** :
- **Fichiers clés** :
- `src/app/App.tsx` : Point d'entrée React
- `src/features/player/` : Player audio
- `src/features/chat/` : Chat
- `src/features/auth/` : Authentification
- `src/services/api.ts` : Client API
**État réel** :
-**Cassé** :
- Erreurs TypeScript bloquantes (50+ erreurs)
- Imports manquants (`@/hooks/use-toast`, `@/components/ui/scroll-area`, etc.)
- Propriétés manquantes sur types (`Track.url`, `Track.cover_url`)
- Tests échouent (42% selon règles)
**Points de fragilité** :
- **TypeScript** : Types incomplets, imports manquants
- **Paths aliases** : Configuration `@/` peut être incorrecte
- **Tests** : Échecs nombreux
---
## 4. SÉCURITÉ
### 4.1 Vue d'ensemble sécurité
#### Authentification
-**JWT** : Implémenté (HS256) dans backend Go et services Rust
-**Sessions** : Validation côté serveur (backend Go)
-**Refresh tokens** : Implémentés avec version checking
-**Token revocation** : Blacklist Redis partielle
#### Autorisation / Rôles
-**RBAC** : Implémenté (`PermissionService`, middleware `RequirePermission`)
-**Rôles** : Admin, Moderator, User, Premium, Artist, Guest
-**Permissions** : Granulaires (StreamAudio, UploadAudio, ManageUsers, etc.)
#### Gestion des mots de passe
-**Hashing** : bcrypt (cost 12) dans backend Go
-**Validation** : Force minimale (8 caractères)
-**Password reset** : Protégé contre énumération (toujours retourne succès)
#### Utilisation de secrets
-**Stockage** : Variables d'environnement (`.env` non commité)
- ⚠️ **Gestion** : Pas de gestionnaire de secrets centralisé (Vault, etc.)
-**Masquage** : Secrets masqués dans les logs (`MaskSecret`)
**Niveau général** : **"Minimalement acceptable pour un labo / dev"**
### 4.2 Failles et mauvaises pratiques
#### P0 Critique (doit être corrigé avant déploiement)
1. **Backend Go : Erreurs JSON non traitées silencieusement**
- **Localisation** : Résolu partiellement (`BindAndValidateJSON` créé)
- **Description** : Certains handlers dans `internal/api/` n'utilisent pas encore `BindAndValidateJSON`
- **Impact** : Erreurs JSON peuvent passer silencieusement
- **Piste de correction** : Refactoriser tous les handlers pour utiliser `BindAndValidateJSON`
2. **Backend Go : Absence de transactions dans opérations critiques**
- **Localisation** : `internal/core/marketplace/service.go:134-136` et autres services
- **Description** : Opérations multi-étapes non transactionnelles
- **Impact** : Incohérence DB en cas d'erreur partielle
- **Piste de correction** : Wrapper opérations multi-étapes dans transactions
3. **Chat Server : Race condition dans TypingIndicatorManager**
- **Localisation** : `src/typing_indicator.rs:34-48`
- **Description** : RwLock peut causer des inversions de timestamps
- **Impact** : Broadcasts dans le mauvais ordre
- **Piste de correction** : Utiliser Mutex ou canal sérialisé
4. **Chat Server : Panics possibles (31 fichiers avec `unwrap()`)**
- **Localisation** : 31 fichiers identifiés
- **Description** : `unwrap()` et `expect()` peuvent causer des panics
- **Impact** : Crash du serveur
- **Piste de correction** : Remplacer par `?` ou gestion d'erreur explicite
5. **Stream Server : Tasks non cancellées proprement**
- **Localisation** : `src/core/processing/processor.rs:168-169`
- **Description** : `abort()` tue brutalement les tasks
- **Impact** : Transactions DB non commitées, handles orphelins
- **Piste de correction** : Utiliser `CancellationToken`, attendre fin des tasks
6. **Global : Pas de transaction distribuée**
- **Localisation** : Tous les services
- **Description** : Pas de garantie de cohérence inter-services
- **Impact** : Données incohérentes entre services
- **Piste de correction** : Pattern Saga ou Event Sourcing
7. **Global : Manque de tests unitaires critiques**
- **Localisation** : Tous les services
- **Description** : Beaucoup de tests `#[ignore]` ou absents
- **Impact** : Pas de validation automatique
- **Piste de correction** : Utiliser mocks ou containers Docker pour tests
8. **Global : Jobs/messages/segments peuvent être incohérents**
- **Localisation** : Tous les services
- **Description** : Pas de cleanup des données orphelines
- **Impact** : DB contient des données incohérentes
- **Piste de correction** : Jobs de cleanup périodiques
#### P1 Important
1. **Backend Go : Erreurs silencieuses, validation input incomplète**
- **Localisation** : `internal/handlers/`
- **Description** : Certains handlers retournent erreurs génériques
- **Impact** : Debugging difficile
- **Piste de correction** : Utiliser systématiquement `RespondWithAppError`
2. **Backend Go : Race condition dans workers retries**
- **Localisation** : `internal/workers/job_worker.go:127-135`
- **Description** : `Retries` peut être incrémenté plusieurs fois
- **Impact** : Jobs retry plus que `maxRetries`
- **Piste de correction** : Mutex ou atomic operations
3. **Backend Go : Timing attack password reset**
- **Localisation** : `internal/services/password_reset_service.go:70-125`
- **Description** : Temps de traitement diffère selon existence email
- **Impact** : Détection d'emails existants via timing
- **Piste de correction** : Délai artificiel pour égaliser temps
4. **Chat Server : Race conditions dans DeliveredStatusManager/ReadReceiptManager**
- **Localisation** : `src/delivered_status.rs`, `src/read_receipts.rs`
- **Description** : Updates DB peuvent se chevaucher
- **Impact** : Statuts incohérents
- **Piste de correction** : Queue sérialisée ou transaction DB
5. **Chat Server : Pas de panic boundary dans WebSocket handler**
- **Localisation** : `src/websocket/handler.rs:77-163`
- **Description** : Panic peut faire crasher la task Tokio
- **Impact** : Client malveillant peut faire crasher le serveur
- **Piste de correction** : Wrapper dans `std::panic::catch_unwind`
6. **Chat Server : Tasks orphelins, pas de heartbeat timeout**
- **Localisation** : `src/typing_indicator.rs`, `src/websocket/handler.rs`
- **Description** : Tasks continuent après arrêt, pas de détection connexions zombies
- **Impact** : Fuites ressources
- **Piste de correction** : `CancellationToken`, heartbeat ping/pong
7. **Stream Server : Erreurs FFmpeg non propagées, DB pas toujours sync**
- **Localisation** : `src/core/processing/processor.rs:154-156`, `src/core/processing/processor.rs:238-243`
- **Description** : Erreurs loggées mais non fatales, segments non persistés en cas de crash
- **Impact** : Jobs se terminent en "succès" alors que FFmpeg a échoué, incohérence DB
- **Piste de correction** : Détecter erreurs fatales, persister immédiatement chaque segment
8. **Stream Server : Corruption d'état concurrent dans SegmentTracker**
- **Localisation** : `src/core/processing/segment_tracker.rs:59-78`
- **Description** : Ordre d'insertion peut varier
- **Impact** : Segments persistés dans le mauvais ordre
- **Piste de correction** : Canal sérialisé ou mutex global
9. **Stream Server : Regex non robustes, IO errors incomplètes**
- **Localisation** : `src/core/processing/ffmpeg_monitor.rs:22-24`, `src/core/processing/ffmpeg_monitor.rs:90-94`
- **Description** : Regex peut ne plus matcher, IO errors non propagées
- **Impact** : Segments non détectés, monitoring s'arrête silencieusement
- **Piste de correction** : Fallback détection segments, logger et propager erreurs
10. **Global : Pas de validation croisée IDs, pas de tests de charge**
- **Localisation** : Communication inter-services
- **Description** : Chat server accepte `conversation_id` sans vérification, pas de tests charge
- **Impact** : Messages pour conversations inexistantes, problèmes performance non détectés
- **Piste de correction** : Validation croisée via API, tests k6/locust
11. **Global : Fuites goroutine/task, pas de correlation-id**
- **Localisation** : `internal/jobs/cleanup_sessions.go:33-45`, `veza-chat-server/src/optimized_persistence.rs:264-285`
- **Description** : Goroutines/tasks sans mécanisme shutdown, pas de tracing distribué
- **Impact** : Fuites ressources, debugging difficile
- **Piste de correction** : `context.Context` avec cancellation, OpenTelemetry
#### P2 Amélioration
1. **Backend Go : Pas de circuit breaker health check**
- **Localisation** : Health checks
- **Description** : Pas de circuit breaker pour éviter surcharger DB
- **Impact** : Health checks continuent à tenter connexions si DB down
- **Piste de correction** : Implémenter circuit breaker
2. **Backend Go : Queue in-memory sans persistance**
- **Localisation** : `internal/workers/job_worker.go`
- **Description** : Queue en mémoire, jobs perdus en cas de crash
- **Impact** : Perte de jobs non traités
- **Piste de correction** : Queue persistante (Redis, RabbitMQ)
3. **Global : Logs non structurés, pas de vérification d'intégrité**
- **Localisation** : Quelques handlers
- **Description** : Certains logs utilisent `fmt.Printf`, pas de job vérification intégrité
- **Impact** : Logs non queryables, incohérences non détectées
- **Piste de correction** : Standardiser sur `tracing`/`zap`, job vérification quotidien
### 4.3 Gestion des données & vie privée
#### Type de données manipulées
- Emails, identifiants utilisateurs
- Messages de chat
- Métadonnées audio (tracks, playlists)
- Logs d'accès
#### Points sensibles
- ⚠️ **Données personnelles dans logs** : Emails, user IDs peuvent apparaître dans logs (vérifier masquage)
-**Masquage secrets** : `MaskSecret` implémenté pour secrets
- ⚠️ **Export / stockage** : Pas de contrôle d'accès explicite sur exports de données
---
## 5. PERFORMANCE & ARCHITECTURE TECHNIQUE
### 5.1 Architecture globale
**Style général** : **Micro-services avec monorepo**
- **Backend Go** : Monolithe modulaire (handlers, services, models)
- **Chat Server** : Service indépendant (WebSocket)
- **Stream Server** : Service indépendant (streaming audio)
- **Frontend** : Application React monolithique
**Couplage entre modules** :
- **Fort** : Backend ↔ Chat (validation conversation_id), Backend ↔ Stream (jobs transcodage)
- **Faible** : Services Rust indépendants (communication via RabbitMQ optionnel)
**Zones problématiques** :
- Pas de transaction distribuée (incohérence possible)
- Validation croisée IDs manquante (chat accepte conversation_id sans vérification backend)
**Patterns utilisés** :
- **Backend Go** : MVC-ish (handlers → services → models)
- **Chat/Stream Rust** : Hexagonal-ish (repository pattern, services)
### 5.2 Points de performance
#### Requêtes DB non indexées / répétitives
- **Localisation** : À vérifier dans les migrations
- **Description** : Indexes présents dans migrations SQL, mais certains peuvent manquer
- **Impact** : Requêtes lentes sur grandes tables
- **Piste d'amélioration** : Audit indexes, ajouter indexes manquants
#### Boucles ou traitements synchrones
- **Localisation** : `veza-chat-server/src/typing_indicator.rs` (monitoring task)
- **Description** : Task de monitoring avec interval 500ms
- **Impact** : CPU usage si nombreuses conversations
- **Piste d'amélioration** : Optimiser algorithme, réduire fréquence si possible
#### I/O bloquantes
- **Localisation** : `veza-stream-server/src/core/processing/ffmpeg_monitor.rs`
- **Description** : Lecture stderr FFmpeg peut bloquer
- **Impact** : Latence traitement audio
- **Piste d'amélioration** : Async I/O, buffering
#### Absence de pagination / limitation
- **Localisation** : `veza-chat-server/src/main.rs:389` (get_messages avec limit 50 max)
- **Description** : Pagination présente mais limitée à 100
- **Impact** : OK pour chat, mais vérifier autres endpoints
- **Piste d'amélioration** : Vérifier pagination sur tous endpoints listes
#### Cache
- **Localisation** : Redis utilisé pour sessions, mais cache métier limité
- **Description** : Pas de cache systématique pour données fréquemment accédées
- **Impact** : Requêtes DB répétitives
- **Piste d'amélioration** : Cache Redis pour playlists, tracks populaires
---
## 6. GUIDE D'UTILISATION
### 6.1 Prérequis
#### Services nécessaires
- **PostgreSQL 15** : Base de données principale
- **Redis 7** : Cache et sessions
- **RabbitMQ 3.12** : Event bus (optionnel, mode dégradé si absent)
#### Variables d'environnement
**Backend Go** (`.env` dans `veza-backend-api/`) :
```bash
DATABASE_URL=postgresql://veza:password@localhost:5432/veza_db?sslmode=disable
REDIS_URL=redis://localhost:6379
JWT_SECRET=your-super-secret-jwt-key-min-32-chars
APP_PORT=8080
APP_ENV=development
```
**Chat Server** (`.env` dans `veza-chat-server/`) :
```bash
DATABASE_URL=postgresql://veza:password@localhost:5432/veza_db?sslmode=disable
REDIS_URL=redis://localhost:6379
JWT_SECRET=your-super-secret-jwt-key-min-32-chars
CHAT_SERVER_PORT=8081
```
**Stream Server** (`.env` dans `veza-stream-server/`) :
```bash
DATABASE_URL=postgresql://veza:password@localhost:5432/veza_db?sslmode=disable
REDIS_URL=redis://localhost:6379
JWT_SECRET=your-super-secret-jwt-key
SECRET_KEY=your-32-byte-secret-key
STREAM_PORT=8082
```
**Frontend** (`.env` dans `apps/web/`) :
```bash
VITE_API_URL=http://localhost:8080/api
VITE_WS_URL=ws://localhost:8081/ws
VITE_STREAM_URL=ws://localhost:8082/stream
```
#### Commandes d'installation
**Backend Go** :
```bash
cd veza-backend-api
go mod download
```
**Chat Server (Rust)** :
```bash
cd veza-chat-server
cargo build --release
```
**Stream Server (Rust)** :
```bash
cd veza-stream-server
cargo build --release
```
**Frontend** :
```bash
cd apps/web
npm install
```
### 6.2 Lancement des composants
#### Option 1 : Docker Compose (recommandé)
```bash
docker-compose up -d
```
- Démarre tous les services (PostgreSQL, Redis, RabbitMQ, Backend, Chat, Stream, Frontend, HAProxy)
- Health checks automatiques
- Ports : 80 (HAProxy), 8080 (Backend), 8081 (Chat), 8082 (Stream), 8085 (Frontend)
#### Option 2 : Manuel (développement)
**1. Démarrer infrastructure** :
```bash
# Via Makefile
make infra-up
# Ou manuellement
docker-compose up -d postgres redis rabbitmq
```
**2. Appliquer migrations** :
```bash
# Via Makefile
make migrate-all
# Ou manuellement
cd veza-backend-api
go run ./cmd/migrate_tool
cd ../veza-chat-server
sqlx migrate run
cd ../veza-stream-server
sqlx migrate run
```
**3. Démarrer services** :
```bash
# Backend
cd veza-backend-api
go run ./cmd/api
# Chat Server (terminal 2)
cd veza-chat-server
cargo run --release
# Stream Server (terminal 3)
cd veza-stream-server
cargo run --release
# Frontend (terminal 4)
cd apps/web
npm run dev
```
#### Problèmes potentiels et workarounds
1. **PostgreSQL non accessible** :
- Vérifier `DATABASE_URL`
- Vérifier que PostgreSQL est démarré : `pg_isready -U veza -d veza_db`
2. **Redis non accessible** :
- Vérifier `REDIS_URL`
- Tester : `redis-cli ping`
3. **Frontend erreurs TypeScript** :
- ⚠️ **Problème connu** : Erreurs TypeScript bloquantes
- Workaround : `npm run dev` peut fonctionner malgré erreurs (Vite ignore certaines erreurs)
4. **Stream Server compilation** :
- ⚠️ Nécessite PostgreSQL accessible pour `sqlx::query!` macros
- Solution : Générer `sqlx-data.json` avec `cargo sqlx prepare`
### 6.3 Tests
#### Backend Go
```bash
cd veza-backend-api
go test ./... -v
```
**Résultat attendu** : ✅ Tests passent (92% coverage)
#### Chat Server
```bash
cd veza-chat-server
cargo test
```
**Résultat attendu** : ⚠️ Certains tests `#[ignore]` (nécessitent DB)
#### Stream Server
```bash
cd veza-stream-server
cargo test
```
**Résultat attendu** : ⚠️ Peu de tests présents
#### Frontend
```bash
cd apps/web
npm test # Unitaires
npm run test:e2e # E2E
```
**Résultat attendu** : ❌ Erreurs TypeScript, tests échouent
#### Recommandation minimale
Avant un commit / release :
1. ✅ Backend Go : `go test ./...`
2. ⚠️ Chat Server : `cargo test` (vérifier tests non ignorés)
3. ⚠️ Stream Server : `cargo test` (vérifier tests présents)
4. ❌ Frontend : Corriger erreurs TypeScript avant commit
---
## 7. AXES D'AMÉLIORATION
### 7.1 Plan de remédiation priorisé
#### P0 Urgent / bloquant
1. **Corriger erreurs TypeScript frontend**
- **Résumé** : Résoudre 50+ erreurs TypeScript bloquantes
- **Pourquoi** : Frontend non utilisable
- **Où** : `apps/web/src/`
- **Complexité** : Moyenne (corrections types, imports, paths aliases)
- **Estimation** : 4-6h
2. **Implémenter transactions dans opérations critiques backend**
- **Résumé** : Wrapper opérations multi-étapes dans transactions
- **Pourquoi** : Éviter incohérences DB
- **Où** : `veza-backend-api/internal/services/`, `internal/core/`
- **Complexité** : Moyenne (identifier opérations, wrapper)
- **Estimation** : 6-8h
3. **Corriger race conditions chat server**
- **Résumé** : Remplacer RwLock par Mutex dans TypingIndicatorManager, sérialiser updates dans DeliveredStatusManager/ReadReceiptManager
- **Pourquoi** : Éviter incohérences données
- **Où** : `veza-chat-server/src/typing_indicator.rs`, `src/delivered_status.rs`, `src/read_receipts.rs`
- **Complexité** : Faible-Moyenne (changements ciblés)
- **Estimation** : 4-6h
4. **Remplacer unwrap() par gestion d'erreur explicite**
- **Résumé** : Remplacer tous les `unwrap()`/`expect()` par `?` ou gestion explicite
- **Pourquoi** : Éviter panics
- **Où** : 31 fichiers identifiés dans chat server
- **Complexité** : Faible (mécanique)
- **Estimation** : 4-6h
5. **Corriger gestion tasks stream server**
- **Résumé** : Utiliser CancellationToken au lieu de `abort()`, attendre fin tasks
- **Pourquoi** : Éviter transactions DB non commitées
- **Où** : `veza-stream-server/src/core/processing/processor.rs`
- **Complexité** : Moyenne (refactoring shutdown)
- **Estimation** : 4-6h
6. **Implémenter cleanup jobs données orphelines**
- **Résumé** : Jobs périodiques pour supprimer données incohérentes
- **Pourquoi** : Maintenir cohérence DB
- **Où** : Nouveaux workers dans chaque service
- **Complexité** : Moyenne (identifier données orphelines, implémenter cleanup)
- **Estimation** : 6-8h
#### P1 Important / à planifier à court terme
1. **Refactoriser handlers backend pour utiliser BindAndValidateJSON**
- **Résumé** : Migrer handlers dans `internal/api/` vers `BindAndValidateJSON`
- **Pourquoi** : Uniformiser gestion erreurs JSON
- **Où** : `veza-backend-api/internal/api/`
- **Complexité** : Faible (mécanique)
- **Estimation** : 2-4h
2. **Ajouter panic boundary WebSocket handler**
- **Résumé** : Wrapper `handle_incoming_message` dans `catch_unwind`
- **Pourquoi** : Éviter crash serveur si panic
- **Où** : `veza-chat-server/src/websocket/handler.rs`
- **Complexité** : Faible
- **Estimation** : 1-2h
3. **Implémenter heartbeat timeout WebSocket**
- **Résumé** : Ping/pong avec timeout pour détecter connexions zombies
- **Pourquoi** : Libérer ressources
- **Où** : `veza-chat-server/src/websocket/handler.rs`
- **Complexité** : Moyenne
- **Estimation** : 3-4h
4. **Corriger gestion erreurs FFmpeg stream server**
- **Résumé** : Détecter erreurs fatales, arrêter traitement immédiatement
- **Pourquoi** : Éviter jobs "succès" alors que FFmpeg a échoué
- **Où** : `veza-stream-server/src/core/processing/processor.rs`, `src/core/processing/ffmpeg_monitor.rs`
- **Complexité** : Moyenne
- **Estimation** : 4-6h
5. **Implémenter validation croisée IDs inter-services**
- **Résumé** : Chat server vérifie conversation_id via API backend
- **Pourquoi** : Éviter messages pour conversations inexistantes
- **Où** : `veza-chat-server/src/websocket/handler.rs`
- **Complexité** : Moyenne (appel API, cache)
- **Estimation** : 4-6h
6. **Ajouter correlation-id / tracing distribué**
- **Résumé** : Implémenter OpenTelemetry ou système de tracing
- **Pourquoi** : Faciliter debugging en production
- **Où** : Tous les services
- **Complexité** : Élevée (infrastructure)
- **Estimation** : 8-12h
7. **Nettoyer code mort stream server**
- **Résumé** : Supprimer champs/méthodes non utilisés
- **Pourquoi** : Réduire complexité, améliorer maintenabilité
- **Où** : `veza-stream-server/src/`
- **Complexité** : Faible (mécanique)
- **Estimation** : 2-4h
#### P2 Amélioration continue
1. **Implémenter circuit breaker health checks**
- **Résumé** : Circuit breaker pour éviter surcharger DB
- **Pourquoi** : Améliorer résilience
- **Où** : `veza-backend-api/internal/handlers/health.go`
- **Complexité** : Moyenne
- **Estimation** : 4-6h
2. **Migrer queue in-memory vers queue persistante**
- **Résumé** : Utiliser Redis ou RabbitMQ pour jobs
- **Pourquoi** : Éviter perte jobs en cas de crash
- **Où** : `veza-backend-api/internal/workers/job_worker.go`
- **Complexité** : Élevée (refactoring)
- **Estimation** : 8-12h
3. **Standardiser logs (tracing/zap)**
- **Résumé** : Remplacer `fmt.Printf` par `tracing`/`zap`
- **Pourquoi** : Logs queryables
- **Où** : Quelques handlers
- **Complexité** : Faible
- **Estimation** : 2-4h
4. **Implémenter job vérification intégrité DB**
- **Résumé** : Job quotidien vérifiant cohérence fichiers/DB
- **Pourquoi** : Détecter incohérences
- **Où** : Nouveau worker
- **Complexité** : Moyenne
- **Estimation** : 4-6h
5. **Ajouter tests de charge**
- **Résumé** : Tests k6 ou locust pour valider performance
- **Pourquoi** : Détecter problèmes performance
- **Où** : Nouveau dossier `tests/load/`
- **Complexité** : Moyenne
- **Estimation** : 6-8h
### 7.2 Nouveaux features (optionnels, mais intelligents)
1. **Health check dashboard**
- **Problème actuel** : Health checks dispersés (`/health`, `/status`)
- **Impact** : Centraliser monitoring santé services
- **Implémentation** : Endpoint `/health/all` agrégeant health checks de tous services
- **Complexité** : Faible-Moyenne
2. **Rate limiting global**
- **Problème actuel** : Pas de rate limiting systématique
- **Impact** : Protection contre abus, DDoS
- **Implémentation** : Middleware rate limiting (Redis-based) dans backend, chat, stream
- **Complexité** : Moyenne
3. **Metrics dashboard (Prometheus + Grafana)**
- **Problème actuel** : Métriques exposées mais pas de dashboard
- **Impact** : Visualisation métriques, alerting
- **Implémentation** : Grafana avec datasource Prometheus
- **Complexité** : Faible (infrastructure)
4. **API documentation interactive (Swagger/OpenAPI)**
- **Problème actuel** : Documentation API limitée
- **Impact** : Faciliter intégration, tests
- **Implémentation** : Swagger déjà configuré dans backend Go, compléter annotations
- **Complexité** : Faible
5. **Webhook notifications**
- **Problème actuel** : Pas de notifications externes
- **Impact** : Intégrations tierces
- **Implémentation** : Système webhooks pour événements (nouveau track, nouveau message, etc.)
- **Complexité** : Élevée
---
## 8. SYNTHÈSE FINALE
### Dans quel état réel est le projet aujourd'hui ?
**"PoC prometteur mais fragile"**
Le projet Veza présente une architecture solide avec des services bien séparés (Backend Go, Chat Rust, Stream Rust, Frontend React). Le backend Go est fonctionnel et relativement stable (92% coverage), mais les autres composants présentent des fragilités importantes :
- **Chat Server** : Compile mais race conditions et panics possibles
- **Stream Server** : Code partiellement implémenté, gestion d'erreurs incomplète
- **Frontend** : Erreurs TypeScript bloquantes, non utilisable sans corrections
Le projet est **utilisable en développement avec précautions**, mais nécessite des corrections critiques avant un déploiement en production.
### Qu'est-ce qui fonctionne le mieux ?
1. **Backend Go** : Architecture claire, tests présents, migrations structurées, authentification JWT robuste, RBAC implémenté
2. **Docker Compose** : Configuration complète avec health checks, facile à démarrer
3. **Migrations DB** : Système cohérent, UUID-first, bien documenté
4. **Documentation** : Présente et structurée (docs/, veza-docs/)
### Qu'est-ce qui est le plus dangereux / fragile ?
1. **Frontend TypeScript** : 50+ erreurs bloquantes, non utilisable
2. **Race conditions chat server** : TypingIndicatorManager, DeliveredStatusManager, ReadReceiptManager
3. **Panics Rust** : 31 fichiers avec `unwrap()`/`expect()` dans chat server
4. **Incohérences DB** : Pas de transactions distribuées, données orphelines possibles
5. **Gestion d'erreurs stream server** : Erreurs FFmpeg non propagées, tasks non cancellées proprement
### Quelles 3 actions prioritaires maximisent le rapport effort / bénéfice ?
1. **Corriger erreurs TypeScript frontend** (P0, 4-6h)
- **Bénéfice** : Frontend utilisable
- **Effort** : Moyen (corrections mécaniques)
- **Impact** : Immédiat (frontend fonctionnel)
2. **Corriger race conditions chat server** (P0, 4-6h)
- **Bénéfice** : Stabilité chat, cohérence données
- **Effort** : Faible-Moyen (changements ciblés)
- **Impact** : Critique (évite bugs production)
3. **Remplacer unwrap() par gestion d'erreur explicite** (P0, 4-6h)
- **Bénéfice** : Évite panics, stabilité serveurs Rust
- **Effort** : Faible (mécanique)
- **Impact** : Critique (évite crashes)
**Total estimation P0 critiques** : 12-18h de travail ciblé pour rendre le projet significativement plus stable.
---
**Fin du rapport d'audit**