Serveur média personnel (Jellyfin)
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.
Le dashboard Homarr sert de point d'entrée unique vers tous les services du serveur.
Architecture de la stack
Chaque service tourne dans son propre conteneur, décrit dans un fichier Docker Compose. Les services sont regroupés par rôle :
| Couche | Services | Rôle |
|---|---|---|
| Diffusion | Jellyfin | Serveur multimédia : bibliothèques, lecture en streaming sur tous les appareils |
| Demandes | Jellyseerr | Portail où les utilisateurs demandent un film ou une série |
| Automatisation | Radarr, Sonarr, Lidarr | Gestion des bibliothèques de films, séries et musique : suivi, renommage, classement |
| Indexation | Prowlarr | Gestion centralisée des sources, partagée avec Radarr, Sonarr et Lidarr |
| Téléchargement | qBittorrent + Gluetun | Client de téléchargement isolé derrière un tunnel VPN |
| Sous-titres | Bazarr | Recherche et synchronisation automatiques des sous-titres |
| Traitement | Tdarr | Transcodage automatique de la bibliothèque en H.265 (HEVC) |
| Statistiques | Jellystat | Historique et statistiques de visionnage |
| Portail | Homarr | Dashboard d'accès à l'ensemble des services |
| Supervision | Uptime Kuma | Surveillance de la disponibilité de chaque service et alertes |
- Un utilisateur fait une demande dans Jellyseerr
- La demande est transmise à Radarr (film) ou Sonarr (série)
- Ces derniers interrogent les sources configurées dans Prowlarr
- qBittorrent récupère le fichier, uniquement via le tunnel VPN
- Le média est renommé et classé, Bazarr ajoute les sous-titres
- Tdarr le convertit en H.265, puis Jellyfin le met à disposition
- 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é
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
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
- 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
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
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.
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.
J'ai écrit un script de surveillance qui tourne en continu :
- Il vérifie à intervalle régulier que qBittorrent dispose bien d'une connectivité via le VPN
- En cas d'échec, il attend que Gluetun soit de nouveau opérationnel
- Il redémarre alors automatiquement qBittorrent
- Chaque intervention est horodatée dans un journal
- 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
Uptime Kuma teste en permanence chaque service et alerte en cas d'indisponibilité, avec un historique du taux de disponibilité.
Jellystat conserve l'historique de visionnage : contenus les plus regardés, activité par utilisateur, utilisation dans le temps.
Les utilisateurs formulent leurs demandes dans une interface simple, sans accès aux outils d'administration.
Vue de l'ensemble des conteneurs de la stack et de leur état.
- 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
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.