# 📊 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)

