Plateforme de streaming vidéo

Finalisé

Streamfolio

De la vidéo déposée au lecteur web : catalogue, comptes utilisateurs et traitement des médias avec FFmpeg.

Objectif
Relier une application Spring Boot à un pipeline de traitement vidéo.
Points clés
Sécurité, streaming, traitement asynchrone, Docker et tests.
Backend Full-stack Données DevOps
Accueil de Streamfolio affichant le film Aurora Drift, la navigation, la recherche et le catalogue.
Catalogue et navigation de Streamfolio, avec recherche, filtres et contenu d’exemple.

Problème

Le problème à résoudre

Réunir dans une même application un accès sécurisé, un catalogue, la lecture vidéo, l’administration des médias et une chaîne de traitement asynchrone.

Architecture

Les pièces du système

  • Application web/PWA portée par Spring Boot pour le catalogue, l’authentification, l’administration et les endpoints de streaming.
  • PostgreSQL et Flyway pour les données métier durables ; Redis pour l’état de session runtime.
  • MinIO pour les originaux, sous-titres et sorties HLS/miniatures, avec disque local utilisé comme staging FFmpeg.
  • Pipeline média avec jobs persistés, workers bornés, ordonnanceur, retry et reprise après redémarrage.

Décisions

Décisions techniques

  • Séparer données métier et état de session. PostgreSQL conserve les données durables tandis que Redis reste dédié aux sessions runtime, afin de ne pas mélanger deux responsabilités de persistance.
  • Conserver FFmpeg local et externaliser le stockage média. Le transcodage reste local afin de limiter le périmètre d’exécution, tandis que MinIO découple le stockage des originaux et sorties générées.
  • Persister les jobs de transcodage. Les traitements longs ne reposent pas sur une simple file mémoire : ils peuvent être relancés, repris après redémarrage et annulés de manière coopérative.
  • Valider les sources avant traitement. La validation combine extension, MIME, signature de conteneur, durée, présence de flux vidéo et politique codec avant de lancer le pipeline.

Schéma

Vue d’ensemble de l’architecture

Le schéma complète l’étude de cas avec les composants et frontières réellement présents dans le projet.

Schéma d’architecture de Streamfolio reliant le navigateur, Spring Boot, PostgreSQL, Redis, MinIO, les jobs média et FFmpeg.
Architecture applicative et pipeline média persisté de Streamfolio.

Implémentation

Points techniques principaux

  • Authentification avec Spring Security, BCrypt, cookies HttpOnly/SameSite et sessions Redis.
  • Catalogue films/séries avec recherche, filtres, watchlist et progression de lecture.
  • Streaming HTML5 : MP4 progressif, HTTP Range, WebVTT et HLS via hls.js.
  • Administration média : upload, métadonnées, miniatures, publication et relance de jobs.
  • Pipeline asynchrone : file persistante, retry exponentiel, reprise après redémarrage et annulation FFmpeg.
  • Persistance PostgreSQL/Flyway, stockage objet MinIO et environnement Docker reproductible.
  • Tests Maven, tests sécurité, streaming/admin, smoke tests, E2E Playwright et CI GitHub Actions.

Difficultés

Difficultés résolues

  • Servir efficacement des médias volumineux. Le lecteur combine MP4 progressif avec HTTP Range, WebVTT et HLS via hls.js afin de couvrir plusieurs modes de lecture.
  • Gérer les traitements média longs et interrompus. La file persistante, le retry exponentiel, la reprise après redémarrage et l’annulation FFmpeg évitent qu’un traitement long soit lié au cycle de vie d’une requête HTTP.
  • Sécuriser l’entrée média. Les contrôles sur le type et le contenu des fichiers réduisent le risque de traiter comme vidéo une entrée seulement renommée ou incohérente.

Qualité

Tests et garde-fous

  • Tests Maven couvrant notamment sécurité, streaming et administration média.
  • Smoke tests et tests E2E Playwright sur les parcours principaux.
  • Script de validation du dépôt couvrant scripts, JavaScript, Python, Maven, Redis et profil local-media.

Livraison

Livraison et CI/CD

  • Docker Compose fournit PostgreSQL, Redis et MinIO pour un environnement d’évaluation reproductible.
  • Le profil de production est configuré par variables d’environnement, avec cookie sécurisé prévu derrière HTTPS.
  • Un workflow Main Merge Validation relance la validation complète après intégration sur main.

Résultats

Résultats observables

  • Un parcours allant de l’administration et l’upload jusqu’au catalogue et à la lecture vidéo.
  • Un pipeline média capable de survivre aux redémarrages applicatifs et de reprendre les traitements persistés.
  • Une architecture dont les limites de production sont documentées au lieu d’être masquées.

Compromis

Compromis techniques

  • FFmpeg reste exécuté localement : le projet privilégie un environnement reproductible plutôt qu’une ferme de transcodage distribuée.
  • MinIO fournit un stockage objet local, sans CDN multi-région ni réplication à l’échelle d’un service public.
  • Redis est utilisé en configuration simple dans l’environnement portfolio ; la haute disponibilité n’est pas traitée ici.

Limites

Les limites actuelles

  • Pas de DRM ni de CDN global.
  • Redis reste mono-nœud dans l’environnement local.
  • Le transcodage FFmpeg n’est pas distribué sur plusieurs workers ou machines.

Suite

Prochaines étapes

  • Externaliser ou rendre hautement disponibles Redis et le stockage média si le projet devait devenir un service public.
  • Introduire CDN, DRM et stratégie de distribution multi-région uniquement si les besoins produit le justifient.
  • Compléter l’observabilité et les essais de charge pour caractériser précisément les limites du pipeline.

Captures

Quelques écrans pour parcourir le projet.

Synthèse

Compétences et techniques mobilisées

  • Spring Security et Redis gèrent l’authentification et les sessions ; PostgreSQL/Flyway conservent les données métier et MinIO les médias.
  • Le streaming combine MP4 avec HTTP Range, WebVTT et HLS ; les traitements FFmpeg passent par des jobs persistés avec reprise, retry et annulation.
  • Les parcours principaux sont couverts par des tests Maven, des smoke tests et des scénarios E2E Playwright ; les limites de production sont documentées.

Aperçu agrandi