veza/veza-stream-server/RAPPORT_LAB.md

285 lines
11 KiB
Markdown
Raw Permalink Normal View History

# 📊 RAPPORT DE VÉRIFICATION - veza-stream-server
**Date**: 2025-12-07
**Environnement**: Labo (PostgreSQL réel)
**Base de données**: `veza_lab` (postgres://veza:veza_password@localhost:5432/veza_lab)
---
## 5.1. Résumé exécutable
### Commande de build recommandée
```bash
cd /home/senke/Documents/veza/veza-stream-server
export DATABASE_URL='postgres://veza:veza_password@localhost:5432/veza_lab?sslmode=disable'
cargo build
```
**Note importante**: SQLx vérifie les requêtes à la compilation. La base de données doit être accessible et les tables `stream_jobs` et `stream_segments` doivent exister avant la compilation.
### Commande de migrations sur la BDD réelle
```bash
cd /home/senke/Documents/veza/veza-stream-server
export VEZA_LAB_DSN='postgres://veza:veza_password@localhost:5432/veza_lab?sslmode=disable'
./scripts/apply_migrations_lab.sh
```
**Fichiers de migrations appliqués**:
- `migrations/001_create_stream_jobs.sql`
- `migrations/002_create_stream_segments.sql`
### Commande de démarrage lab (avec vraie BDD)
```bash
cd /home/senke/Documents/veza/veza-stream-server
export VEZA_LAB_DSN='postgres://veza:veza_password@localhost:5432/veza_lab?sslmode=disable'
./scripts/start_lab.sh
```
**Variables d'environnement requises** (définies automatiquement par le script):
- `DATABASE_URL`: DSN PostgreSQL (obligatoire)
- `SECRET_KEY`: Clé secrète HMAC (générée automatiquement si absente)
- `JWT_SECRET`: Clé JWT (générée automatiquement si absente)
- `STREAM_PORT`: Port d'écoute (défaut: 8082)
- `RUST_LOG`: Niveau de log (défaut: stream_server=info)
- `AUDIO_DIR`: Répertoire audio (défaut: ./audio)
### Tests rapides (curl / autres)
```bash
# Health check simple (liveness)
curl http://localhost:8082/healthz
# Health check détaillé (readiness)
curl http://localhost:8082/health
# Health check alternatif
curl http://localhost:8082/readyz
# Métriques Prometheus
curl http://localhost:8082/metrics
# Endpoint racine
curl http://localhost:8082/
```
---
## 5.2. État actuel du module
### ✅ Ce qui fonctionne réellement aujourd'hui
1. **Compilation**: Le module compile sans erreur avec `cargo build` (après application des migrations)
2. **Démarrage**: Le serveur démarre et écoute sur le port 8082
3. **Endpoints HTTP**: Les routes répondent correctement:
- `/healthz` retourne `200 OK` avec statut "healthy"
- `/health` retourne `503 Service Unavailable` (voir problèmes ci-dessous)
- `/metrics` expose les métriques Prometheus
4. **Migrations SQL**: Les migrations s'appliquent correctement sur `veza_lab`
5. **Connexion initiale BDD**: Le script de démarrage vérifie la connexion PostgreSQL avec succès
6. **Mode dégradé**: Le serveur démarre même si RabbitMQ n'est pas disponible (mode dégradé)
### ⚠️ Ce qui est partiellement fonctionnel
1. **Health Monitor - Base de données**:
- Le health monitor signale la base de données comme "down" alors que la connexion initiale fonctionne
- **Cause probable**: Le health monitor utilise peut-être une URL différente ou un pool différent
- **Impact**: `/health` retourne 503 au lieu de 200
- **Workaround**: `/healthz` fonctionne et indique que le service est "healthy"
2. **Répertoire audio**:
- Le répertoire `./audio` n'existe pas par défaut
- Le script de démarrage le crée automatiquement, mais il est vide
- **Impact**: Les endpoints de streaming ne peuvent pas servir de fichiers
3. **FFmpeg**:
- FFmpeg n'est pas installé sur le système de test
- **Impact**: Le transcodage audio est désactivé (mode dégradé)
- **Workaround**: Le serveur démarre mais les fonctionnalités de transcodage sont indisponibles
4. **RabbitMQ**:
- RabbitMQ n'est pas disponible (connexion refusée)
- **Impact**: L'Event Bus est désactivé (mode dégradé)
- **Workaround**: Le serveur fonctionne sans Event Bus
### 🔴 Ce qui est cassé ou bloquant
#### P0 Bloquant
1. **Bug CORS corrigé**
- **Problème**: Panic au démarrage si `ALLOWED_ORIGINS=*`
- **Erreur**: `Wildcard origin (*) cannot be passed to AllowOrigin::list`
- **Statut**: ✅ **CORRIGÉ** dans `src/routes/api.rs`
- **Solution**: Utilisation de `AllowOrigin::any()` quand `ALLOWED_ORIGINS=*`
2. **Health Monitor - Connexion BDD** 🔴
- **Problème**: Le health monitor ne peut pas se connecter à la base de données
- **Symptôme**: `/health` retourne 503 avec `"database_status": "down"`
- **Cause à investiguer**: Différence entre l'URL utilisée par le health monitor et celle fournie via `DATABASE_URL`
- **Impact**: Le readiness check échoue, mais le serveur fonctionne
#### P1 Majeur
1. **Migrations non automatiques**:
- Les migrations SQL ne sont pas appliquées automatiquement au démarrage
- Le flag `migrate_on_start` existe dans la config mais n'est pas utilisé
- **Impact**: Les migrations doivent être appliquées manuellement avant le premier démarrage
2. **Dépendances externes non vérifiées**:
- FFmpeg n'est pas vérifié au démarrage (seulement détecté par le health monitor)
- **Impact**: Erreurs silencieuses si FFmpeg est manquant
#### P2 Moyen
1. **Warnings de compilation**:
- Import inutilisé: `axum::serve` dans `src/main.rs`
- Champs non utilisés dans `simple_stream_server.rs`
- **Impact**: Aucun, mais pollue les logs de compilation
2. **Future incompatibilities**:
- Packages `redis v0.25.4` et `sqlx-postgres v0.7.4` contiennent du code qui sera rejeté par une future version de Rust
- **Impact**: Aucun immédiat, mais nécessitera une mise à jour des dépendances
#### P3 Cosmétique
1. **Logs verbeux**: Les logs du health monitor sont très verbeux (beaucoup d'alertes répétées)
2. **Documentation**: Le fichier `env.example` ne documente pas toutes les variables d'environnement utilisées
---
## 5.3. Checklist "Aucune régression"
- [x] Le module compile sans erreur avec la commande recommandée
- [x] Les migrations passent sur `veza_lab` sans erreur
- [x] Le module se lance en utilisant la vraie BDD (pas de mode offline)
- [x] L'endpoint `/healthz` renvoie un statut OK (200)
- [ ] L'endpoint `/health` renvoie un statut OK (200) - **ÉCHEC** (retourne 503)
- [x] Les logs au démarrage sont propres (pas de panic / stacktrace critique)
- [x] Le serveur écoute sur le port configuré (8082)
- [x] Les métriques Prometheus sont exposées sur `/metrics`
**Note**: Le health check détaillé (`/health`) échoue car le health monitor signale la base de données comme "down", mais le serveur fonctionne correctement. Le health check simple (`/healthz`) fonctionne.
---
## 5.4. Recommandations courtes (max 5 actions)
### 1. 🔴 P0 - Corriger le health monitor pour la connexion BDD
**Action**: Investiguer pourquoi le health monitor ne peut pas se connecter à la base de données alors que la connexion initiale fonctionne.
**Fichiers à vérifier**:
- `src/health/mod.rs` (méthode `test_database_connection`)
- `src/analytics/mod.rs` (initialisation du pool)
**Commande de test**:
```bash
# Vérifier que le health monitor utilise la même URL que DATABASE_URL
grep -r "database_url\|DATABASE_URL" src/health/
```
### 2. 🟠 P1 - Implémenter l'application automatique des migrations
**Action**: Utiliser le flag `migrate_on_start` pour appliquer les migrations automatiquement au démarrage.
**Fichiers à modifier**:
- `src/lib.rs` ou `src/main.rs` (ajouter la logique d'application des migrations)
**Exemple d'implémentation**:
```rust
if config.database.migrate_on_start {
sqlx::migrate!("./migrations")
.run(&pool)
.await?;
}
```
### 3. 🟡 P2 - Vérifier les dépendances au démarrage
**Action**: Vérifier la présence de FFmpeg et autres dépendances externes au démarrage et afficher un warning clair si elles sont manquantes.
**Fichiers à modifier**:
- `src/lib.rs` (dans `AppState::new`)
### 4. 🟡 P2 - Nettoyer les warnings de compilation
**Action**: Supprimer les imports et champs inutilisés.
**Fichiers à modifier**:
- `src/main.rs` (supprimer `use axum::serve;`)
- `src/simple_stream_server.rs` (supprimer ou utiliser les champs non utilisés)
### 5. ⚪ P3 - Améliorer la documentation des variables d'environnement
**Action**: Mettre à jour `env.example` avec toutes les variables d'environnement utilisées par le module.
**Variables manquantes dans `env.example`**:
- `DATABASE_URL` (obligatoire)
- `JWT_SECRET` (obligatoire)
- `BACKEND_URL`
- `RABBITMQ_URL`
- `REDIS_URL`
- `STREAM_PORT` (au lieu de `STREAM_SERVER_PORT`)
---
## 5.5. Inventaire rapide `veza-stream-server`
- **Langage principal**: Rust (édition 2021)
- **Point(s) d'entrée (main)**:
- `src/main.rs` → binaire `stream_server`
- `src/simple_stream_server.rs` → binaire `simple_stream_server`
- **Fichier(s) de config principaux**:
- `env.example` (template)
- `.env` (configuration locale)
- `src/config/mod.rs` (chargement depuis variables d'environnement)
- **Dépendances externes**:
- PostgreSQL (obligatoire)
- Redis (optionnel)
- RabbitMQ (optionnel, mode dégradé si absent)
- FFmpeg (optionnel, requis pour transcodage)
- **Vars d'environnement critiques**:
- `DATABASE_URL` (obligatoire)
- `SECRET_KEY` (obligatoire, min 32 caractères)
- `JWT_SECRET` (obligatoire, min 32 caractères)
- `STREAM_PORT` (défaut: 8082)
- `ALLOWED_ORIGINS` (défaut: localhost)
- **Ports utilisés**:
- 8082 (HTTP/WebSocket)
- 9090 (métriques Prometheus, si activé)
- **Migrations SQL**:
- `migrations/001_create_stream_jobs.sql`
- `migrations/002_create_stream_segments.sql`
- **Scripts utilitaires**:
- `scripts/apply_migrations_lab.sh` (application des migrations)
- `scripts/start_lab.sh` (démarrage en mode labo)
---
## 5.6. Notes techniques
### Architecture
Le module `veza-stream-server` est un serveur de streaming audio écrit en Rust utilisant:
- **Framework web**: Axum 0.7
- **Base de données**: SQLx 0.7 avec PostgreSQL
- **Async runtime**: Tokio 1.35
- **Logging**: tracing + tracing-subscriber
- **Métriques**: Prometheus via metrics-exporter-prometheus
### Points d'attention
1. **SQLx compile-time checks**: SQLx vérifie les requêtes SQL à la compilation. Les tables doivent exister dans la base de données avant la compilation (ou utiliser `SQLX_OFFLINE=true`, mais ce n'est pas recommandé pour le labo).
2. **Mode dégradé**: Le serveur est conçu pour fonctionner en mode dégradé si certaines dépendances sont absentes (RabbitMQ, Redis, FFmpeg). Le health monitor signale ces dégradations.
3. **Sécurité**: Les secrets (`SECRET_KEY`, `JWT_SECRET`) doivent être générés avec `openssl rand -hex 32` et ne jamais être commités dans le dépôt.
---
**Rapport généré le**: 2025-12-07
**Statut global**: ⚠️ **Fonctionnel avec réserves** (health monitor BDD à corriger)