43 KiB
đ 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
- Vue d'ensemble du projet
- Cartographie détaillée du code
- Ătat fonctionnel : ce qui marche / est partiel / est cassĂ©
- Sécurité : failles et surfaces d'attaque
- Performance & architecture technique
- Guide d'utilisation du projet (mode actuel réel)
- Axes d'amélioration (sécurité, qualité, features)
- 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 HTTPgorm.io/gorm: ORMgolang-jwt/jwt/v5: JWTgo.uber.org/zap: Logginggithub.com/redis/go-redis/v9: Client Redisgithub.com/rabbitmq/amqp091-go: RabbitMQ
Chat Server (Rust) :
axum: Framework web asynctokio: Runtime asyncsqlx: SQL asyncjsonwebtoken: JWTlapin: RabbitMQ clienttracing: Logging structuré
Stream Server (Rust) :
axum: Framework webtokio: Runtime asyncsqlx: SQL asyncsymphonia,hound,minimp3: Traitement audiom3u8-rs: HLS streamingtracing: Logging
Frontend :
react18.2.0vite7.1.5typescript5.3.3tailwindcss4.0.0zustand: State management@tanstack/react-query: Data fetchingplaywright: 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 principalinternal/handlers/: Handlers HTTPinternal/services/: Logique métierinternal/models/: ModÚles GORMinternal/middleware/: Middleware (auth, RBAC, metrics)internal/database/: Gestion DB et migrationsmigrations/: 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éesrc/websocket/: Gestion WebSocketsrc/repository/: AccÚs DBsrc/security/: Permissions, CSRFsrc/typing_indicator.rs: Indicateurs de frappemigrations/: 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éesrc/core/: Traitement audio, encoding, syncsrc/codecs/: Codecs audio (MP3, AAC, FLAC, Opus)src/streaming/: HLS, WebSocket transportsrc/routes/: Routes HTTPmigrations/: 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 Reactsrc/features/: Features par domaine (auth, player, chat, etc.)src/components/: Composants réutilisablessrc/services/: Clients APIe2e/: Tests Playwright
scripts/ (Bash)
- RÎle : Automatisation (déploiement, tests, migrations)
- Fichiers clés :
start-veza.sh: Démarrage completmigrate-db.sh: Migrations DBrun-tests.sh: Testslab/: Scripts pour environnement lab
docs/ (Markdown)
- RĂŽle : Documentation technique
- Fichiers clés :
AUDIT_STABILITY.md: Audit de stabilité existantDB_MIGRATIONS_STRATEGY_FINAL.md: Stratégie migrationsTODO_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 :
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 :
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 :
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 :
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 :
docker-compose up -d
Services :
postgres: PostgreSQL 15redis: Redis 7rabbitmq: RabbitMQ 3.12backend-api: Backend Gochat-server: Chat Server Ruststream-server: Stream Server Rustfrontend: Frontend React (Nginx)haproxy: Reverse proxy
2.3 Tests & qualité
Backend Go
Types de tests : Unitaires, intégration, transactions
Commande :
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 :
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 :
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 :
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 Gochat-ci.yml: Tests Rust (chat)stream-ci.yml: Tests Rust (stream)frontend-ci.yml: Tests Reactci.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 shutdowninternal/api/router.go: Configuration routesinternal/handlers/: Handlers HTTP (auth, social, playlists, etc.)internal/services/: Services métier (auth, playlist, RBAC, etc.)internal/middleware/auth.go: Middleware JWT + sessionsinternal/middleware/rbac_auth_middleware.go: RBACinternal/database/database.go: Gestion DB + migrations
-
Endpoints importants :
POST /api/v1/auth/login: AuthentificationPOST /api/v1/auth/register: InscriptionGET /api/v1/playlists: Liste playlistsGET /api/v1/tracks: Liste tracksGET /health: Health checkGET /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
- Erreurs silencieuses dans certains handlers (résolu partiellement avec
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/vsinternal/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 Axumsrc/websocket/handler.rs: Handler WebSocketsrc/repository/message_store.rs: Repository messagessrc/typing_indicator.rs: Gestion typing indicatorssrc/read_receipts.rs: Read receiptssrc/security/permission.rs: Vérifications permissions
-
Endpoints :
GET /ws: WebSocket upgradeGET /api/messages/:conversation_id: Récupération messagesPOST /api/messages: Envoi messageGET /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
DeliveredStatusManageretReadReceiptManager - 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()ouexpect()(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éesrc/core/processing/processor.rs: Traitement audiosrc/core/processing/segment_tracker.rs: Suivi segmentssrc/core/processing/ffmpeg_monitor.rs: Monitoring FFmpegsrc/streaming/hls.rs: HLS streamingsrc/streaming/websocket.rs: WebSocket transportsrc/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 Reactsrc/features/player/: Player audiosrc/features/chat/: Chatsrc/features/auth/: Authentificationsrc/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, middlewareRequirePermission) - â 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 (
.envnon 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)
-
Backend Go : Erreurs JSON non traitées silencieusement
- Localisation : Résolu partiellement (
BindAndValidateJSONcréé) - Description : Certains handlers dans
internal/api/n'utilisent pas encoreBindAndValidateJSON - Impact : Erreurs JSON peuvent passer silencieusement
- Piste de correction : Refactoriser tous les handlers pour utiliser
BindAndValidateJSON
- Localisation : Résolu partiellement (
-
Backend Go : Absence de transactions dans opérations critiques
- Localisation :
internal/core/marketplace/service.go:134-136et 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
- Localisation :
-
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é
- Localisation :
-
Chat Server : Panics possibles (31 fichiers avec
unwrap())- Localisation : 31 fichiers identifiés
- Description :
unwrap()etexpect()peuvent causer des panics - Impact : Crash du serveur
- Piste de correction : Remplacer par
?ou gestion d'erreur explicite
-
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
- Localisation :
-
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
-
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
-
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
-
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
- Localisation :
-
Backend Go : Race condition dans workers retries
- Localisation :
internal/workers/job_worker.go:127-135 - Description :
Retriespeut ĂȘtre incrĂ©mentĂ© plusieurs fois - Impact : Jobs retry plus que
maxRetries - Piste de correction : Mutex ou atomic operations
- Localisation :
-
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
- Localisation :
-
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
- Localisation :
-
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
- Localisation :
-
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
- Localisation :
-
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
- Localisation :
-
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
- Localisation :
-
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
- Localisation :
-
Global : Pas de validation croisée IDs, pas de tests de charge
- Localisation : Communication inter-services
- Description : Chat server accepte
conversation_idsans 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
-
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.Contextavec cancellation, OpenTelemetry
- Localisation :
P2 â AmĂ©lioration
-
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
-
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)
- Localisation :
-
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 :
MaskSecretimplĂ©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/) :
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/) :
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/) :
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/) :
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 :
cd veza-backend-api
go mod download
Chat Server (Rust) :
cd veza-chat-server
cargo build --release
Stream Server (Rust) :
cd veza-stream-server
cargo build --release
Frontend :
cd apps/web
npm install
6.2 Lancement des composants
Option 1 : Docker Compose (recommandé)
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 :
# Via Makefile
make infra-up
# Ou manuellement
docker-compose up -d postgres redis rabbitmq
2. Appliquer migrations :
# 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 :
# 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
-
PostgreSQL non accessible :
- Vérifier
DATABASE_URL - Vérifier que PostgreSQL est démarré :
pg_isready -U veza -d veza_db
- Vérifier
-
Redis non accessible :
- Vérifier
REDIS_URL - Tester :
redis-cli ping
- Vérifier
-
Frontend erreurs TypeScript :
- â ïž ProblĂšme connu : Erreurs TypeScript bloquantes
- Workaround :
npm run devpeut fonctionner malgré erreurs (Vite ignore certaines erreurs)
-
Stream Server compilation :
- â ïž NĂ©cessite PostgreSQL accessible pour
sqlx::query!macros - Solution : Générer
sqlx-data.jsonaveccargo sqlx prepare
- â ïž NĂ©cessite PostgreSQL accessible pour
6.3 Tests
Backend Go
cd veza-backend-api
go test ./... -v
RĂ©sultat attendu : â Tests passent (92% coverage)
Chat Server
cd veza-chat-server
cargo test
RĂ©sultat attendu : â ïž Certains tests #[ignore] (nĂ©cessitent DB)
Stream Server
cd veza-stream-server
cargo test
RĂ©sultat attendu : â ïž Peu de tests prĂ©sents
Frontend
cd apps/web
npm test # Unitaires
npm run test:e2e # E2E
RĂ©sultat attendu : â Erreurs TypeScript, tests Ă©chouent
Recommandation minimale
Avant un commit / release :
- â
Backend Go :
go test ./... - â ïž Chat Server :
cargo test(vĂ©rifier tests non ignorĂ©s) - â ïž Stream Server :
cargo test(vĂ©rifier tests prĂ©sents) - â Frontend : Corriger erreurs TypeScript avant commit
7. AXES D'AMĂLIORATION
7.1 Plan de remédiation priorisé
P0 â Urgent / bloquant
-
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
-
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
-
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
-
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
- Résumé : Remplacer tous les
-
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
- Résumé : Utiliser CancellationToken au lieu de
-
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
-
Refactoriser handlers backend pour utiliser BindAndValidateJSON
- Résumé : Migrer handlers dans
internal/api/versBindAndValidateJSON - Pourquoi : Uniformiser gestion erreurs JSON
- OĂč :
veza-backend-api/internal/api/ - Complexité : Faible (mécanique)
- Estimation : 2-4h
- Résumé : Migrer handlers dans
-
Ajouter panic boundary WebSocket handler
- Résumé : Wrapper
handle_incoming_messagedanscatch_unwind - Pourquoi : Ăviter crash serveur si panic
- OĂč :
veza-chat-server/src/websocket/handler.rs - Complexité : Faible
- Estimation : 1-2h
- Résumé : Wrapper
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
Standardiser logs (tracing/zap)
- Résumé : Remplacer
fmt.Printfpartracing/zap - Pourquoi : Logs queryables
- OĂč : Quelques handlers
- Complexité : Faible
- Estimation : 2-4h
- Résumé : Remplacer
-
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
-
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)
-
Health check dashboard
- ProblÚme actuel : Health checks dispersés (
/health,/status) - Impact : Centraliser monitoring santé services
- Implémentation : Endpoint
/health/allagrégeant health checks de tous services - Complexité : Faible-Moyenne
- ProblÚme actuel : Health checks dispersés (
-
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
-
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)
-
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
-
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 ?
- Backend Go : Architecture claire, tests présents, migrations structurées, authentification JWT robuste, RBAC implémenté
- Docker Compose : Configuration complÚte avec health checks, facile à démarrer
- Migrations DB : SystÚme cohérent, UUID-first, bien documenté
- Documentation : Présente et structurée (docs/, veza-docs/)
Qu'est-ce qui est le plus dangereux / fragile ?
- Frontend TypeScript : 50+ erreurs bloquantes, non utilisable
- Race conditions chat server : TypingIndicatorManager, DeliveredStatusManager, ReadReceiptManager
- Panics Rust : 31 fichiers avec
unwrap()/expect()dans chat server - Incohérences DB : Pas de transactions distribuées, données orphelines possibles
- 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 ?
-
Corriger erreurs TypeScript frontend (P0, 4-6h)
- Bénéfice : Frontend utilisable
- Effort : Moyen (corrections mécaniques)
- Impact : Immédiat (frontend fonctionnel)
-
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)
-
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