Serveur média personnel (Jellyfin)

Présentation

Projet personnel : conception et exploitation d'un serveur multimédia auto-hébergé basé sur Jellyfin, entièrement conteneurisé avec Docker. Le serveur centralise ma bibliothèque de films, séries et musique, automatise son organisation et la rend accessible à distance de façon sécurisée.

Au-delà de l'usage quotidien, ce serveur me sert de laboratoire : orchestration de conteneurs, isolement réseau derrière un VPN, accès distant sans exposition directe, supervision et résolution d'incidents en conditions réelles.

Docker Compose Jellyfin VPN / Gluetun Cloudflare Tunnel Tailscale Supervision Scripting
Vue d'ensemble

Le dashboard Homarr sert de point d'entrée unique vers tous les services du serveur.

Architecture de la stack

Organisation en couches

Chaque service tourne dans son propre conteneur, décrit dans un fichier Docker Compose. Les services sont regroupés par rôle :

CoucheServicesRôle
DiffusionJellyfinServeur multimédia : bibliothèques, lecture en streaming sur tous les appareils
DemandesJellyseerrPortail où les utilisateurs demandent un film ou une série
AutomatisationRadarr, Sonarr, LidarrGestion des bibliothèques de films, séries et musique : suivi, renommage, classement
IndexationProwlarrGestion centralisée des sources, partagée avec Radarr, Sonarr et Lidarr
TéléchargementqBittorrent + GluetunClient de téléchargement isolé derrière un tunnel VPN
Sous-titresBazarrRecherche et synchronisation automatiques des sous-titres
TraitementTdarrTranscodage automatique de la bibliothèque en H.265 (HEVC)
StatistiquesJellystatHistorique et statistiques de visionnage
PortailHomarrDashboard d'accès à l'ensemble des services
SupervisionUptime KumaSurveillance de la disponibilité de chaque service et alertes
Flux d'une demande
  1. Un utilisateur fait une demande dans Jellyseerr
  2. La demande est transmise à Radarr (film) ou Sonarr (série)
  3. Ces derniers interrogent les sources configurées dans Prowlarr
  4. qBittorrent récupère le fichier, uniquement via le tunnel VPN
  5. Le média est renommé et classé, Bazarr ajoute les sous-titres
  6. Tdarr le convertit en H.265, puis Jellyfin le met à disposition
Choix techniques
  • Un service par conteneur : mises à jour et redémarrages indépendants
  • Configuration déclarative : toute la stack est décrite dans le fichier Compose et peut être reconstruite
  • Volumes persistants : données et configurations séparées des conteneurs
  • Secrets hors du code : identifiants stockés dans un fichier d'environnement non versionné
  • Redémarrage automatique des conteneurs après une coupure

Réseau et sécurité

Isolement du téléchargement (Gluetun)

qBittorrent n'a pas d'accès réseau propre : il utilise exclusivement la pile réseau du conteneur Gluetun, qui maintient un tunnel VPN chiffré.

  • Tout le trafic de téléchargement passe par le tunnel
  • Kill switch : si le VPN tombe, qBittorrent n'a plus aucune connectivité (pas de fuite)
  • Les autres services ne sont pas concernés et restent sur le réseau local
Accès distant sans ouverture de ports

Aucun port n'est ouvert sur la box : le serveur n'est jamais exposé directement sur Internet. Deux mécanismes complémentaires assurent l'accès distant :

  • Cloudflare Tunnel : connexion sortante chiffrée vers Cloudflare, qui publie uniquement les services destinés aux utilisateurs, en HTTPS
  • Tailscale : réseau privé chiffré (VPN maillé) réservé à l'administration ; les interfaces de gestion ne sont accessibles qu'aux appareils autorisés
Bonnes pratiques appliquées
  • Moindre exposition : seul le strict nécessaire est publié
  • Authentification sur chaque interface, comptes distincts par utilisateur
  • Séparation entre services utilisateurs et outils d'administration
  • Mises à jour régulières des images Docker
  • Aucune donnée sensible (adresses, identifiants, clés) dans les fichiers partagés
Transcodage H.265 (Tdarr)

Tdarr parcourt la bibliothèque et convertit automatiquement les fichiers en H.265 (HEVC), qui offre une qualité équivalente au H.264 pour un poids nettement inférieur.

  • Économie importante d'espace disque
  • Traitement en file d'attente, sans intervention manuelle
  • Fichier d'origine remplacé seulement si la conversion réussit

Incident résolu : watchdog qBittorrent / Gluetun

Problème constaté

Lorsque le conteneur Gluetun redémarrait ou rétablissait son tunnel VPN, qBittorrent perdait sa connectivité réseau sans jamais la retrouver seul. Le conteneur restait « en cours d'exécution » : aucune erreur visible, mais plus aucun téléchargement ne progressait.

Diagnostic

qBittorrent partage la pile réseau de Gluetun. Quand Gluetun est recréé, qBittorrent reste rattaché à l'ancienne pile réseau, qui n'existe plus. Le seul moyen de rétablir le service était de le redémarrer manuellement.

Solution : un watchdog maison

J'ai écrit un script de surveillance qui tourne en continu :

  1. Il vérifie à intervalle régulier que qBittorrent dispose bien d'une connectivité via le VPN
  2. En cas d'échec, il attend que Gluetun soit de nouveau opérationnel
  3. Il redémarre alors automatiquement qBittorrent
  4. Chaque intervention est horodatée dans un journal
Résultat
  • Plus aucune intervention manuelle nécessaire après une reconnexion VPN
  • Coupure de service réduite à quelques instants
  • Historique des incidents consultable dans le journal

Démarche type d'un support N2 : constater, isoler la cause, automatiser la correction, tracer.

Supervision et suivi

Disponibilité (Uptime Kuma)

Uptime Kuma teste en permanence chaque service et alerte en cas d'indisponibilité, avec un historique du taux de disponibilité.

Statistiques (Jellystat)

Jellystat conserve l'historique de visionnage : contenus les plus regardés, activité par utilisateur, utilisation dans le temps.

Demandes des utilisateurs (Jellyseerr)

Les utilisateurs formulent leurs demandes dans une interface simple, sans accès aux outils d'administration.

Conteneurs en production

Vue de l'ensemble des conteneurs de la stack et de leur état.

Compétences mobilisées
  • Conteneurisation : Docker, Docker Compose, volumes, réseaux de conteneurs
  • Réseau : VPN, tunnels chiffrés, isolement de flux, accès distant
  • Sécurité : moindre exposition, séparation des accès, gestion des secrets
  • Exploitation : supervision, sauvegarde des configurations, mises à jour
  • Dépannage : diagnostic d'un incident et correction automatisée par script
Bilan et évolutions

Ce projet m'a appris à faire vivre un service dans la durée : le déployer n'est que le début, il faut ensuite le superviser, le sécuriser et corriger ses défaillances.

Pistes d'évolution : sauvegarde automatisée des configurations des conteneurs, notifications centralisées des alertes, mise à jour automatisée des images.