Jellyfin

Jellyfin est une alternative libre et open source à Plex et Emby. Contrairement à Plex, il n'a pas d'offre payante, pas de télémétrie, et n'exige pas de compte en ligne pour utiliser ou administrer votre serveur : tout tourne en local et reste chez vous.
Il couvre les mêmes bases : une médiathèque avec métadonnées et jaquettes, le transcodage (accélération matérielle comprise), et des applications pour TV, Android, iOS, Windows et macOS.
Comme toujours, nous utiliserons l'image linuxserver.io.
Installer Jellyfin
- /
- srv
- docker
- jellyfin
- compose.yaml
- .env
- config
- jellyfin
- docker
- media
- tvseries
- movies
- library
- srv
Créer les dossiers média
Créez les dossiers movies, tvseries et library dans /media :
mkdir -p /media/movies /media/library /media/tvseries
Déployer la stack
Ouvrez Dockge, cliquez sur compose, nommez la stack jellyfin, et ajoutez la configuration suivante :
---
services:
jellyfin:
image: lscr.io/linuxserver/jellyfin:latest
container_name: jellyfin
environment:
- PUID=${PUID}
- PGID=${GUID}
- TZ=Europe/Paris
volumes:
- /srv/docker/jellyfin/config:/config
- /media:/media
restart: unless-stopped
devices:
- /dev/dri:/dev/dri
ports:
- 8096:8096
---
services:
jellyfin:
#...
labels:
- com.centurylinklabs.watchtower.enable=true
Renseigner vos variables d'environnement
Trouvez vos PUID et GUID en lançant :
id utilisateur
Remplissez votre fichier .env avec les valeurs récupérées, par exemple :
PUID=1000
GUID=1000
Déployez la stack. L'interface locale est disponible sur http://ipdevotreserveur:8096.
/dev/dri n'est nécessaire que pour le transcodage accéléré matériellement sur GPU Intel/AMD. Retirez-le si votre serveur n'en a pas, ou adaptez-le pour un GPU NVIDIA en suivant la documentation de linuxserver.io.Terminé !
Configurer Jellyfin
À la première visite, Jellyfin vous guide dans un assistant de configuration :
- Choisissez une langue d'affichage et créez votre compte administrateur.
- Ajoutez une médiathèque, en pointant
/media/moviespour les films et/media/tvseriespour les séries.
Et voilà ! Ajoutez vos médias dans /media/movies et /media/tvseries sur votre serveur. Voir plus bas pour commencer à regarder, à la maison ou à distance.
Transcodage matériel
Jellyfin réencode la vidéo à la volée dès qu'un client ne peut pas lire un fichier tel quel : la résolution de l'écran de l'appareil est inférieure à celle de la source, sa connexion réseau est trop lente pour le débit du fichier, ou il ne prend pas en charge le codec, le format HDR ou le type de sous-titres du fichier. C'est ce qu'on appelle le transcodage. Lorsque le transcodage est logiciel et éxecuté par le CPU, cela prend énormément de ressources et cela peut saturer un serveur modeste avec seulement un ou deux flux simultanés. Le transcodage matériel délègue ce travail au GPU intégré à votre processeur (Intel QuickSync, sur la plupart du matériel de homelab), qui s'en occupe bien plus vite et laisse le CPU libre pour tout le reste.
Le tone mapping est une fonction liée mais distincte : convertir une vidéo HDR (qui a besoin d'un écran HDR compatible pour rendre correctement) en SDR pour qu'elle s'affiche correctement sur un écran, une TV ou un client qui ne gère pas le HDR, au lieu de paraître délavée ou trop sombre.
/dev/dri, déjà présent dans le compose.yaml de ce tutoriel. Les GPU NVIDIA demandent une configuration entièrement différente, traitée dans la documentation de linuxserver.io. Si votre serveur n'a pas de GPU compatible, le transcodage fonctionne quand même, entièrement sur le CPU.Ajouter le mod OpenCL
Le tone mapping a spécifiquement besoin d'un runtime OpenCL Intel, que cette image n'embarque pas par défaut. Ajoutez le mod dédié à votre compose.yaml :
services:
jellyfin:
environment:
- DOCKER_MODS=linuxserver/mods:jellyfin-opencl-intel
universal-package-install avec intel-opencl-icd pour ça : il installe un runtime plus ancien issu des dépôts d'Ubuntu, connu pour causer des bugs de tone mapping. Le mod dédié en fournit un plus récent et prévu pour.Redéployez la stack pour que le mod prenne effet.
Activer l'accélération matérielle
Dans Jellyfin, allez dans Tableau de bord > Lecture et réglez Accélération matérielle sur Intel QuickSync (QSV) (ou VA-API, si QSV n'est pas disponible pour votre génération de processeur).
Décochez ensuite tout codec que votre GPU ne sait pas décoder matériellement. La page d'accélération matérielle Intel liste précisément les codecs pris en charge par chaque génération de processeur.
Activer le tone mapping
Plus bas sur la même page, activez le Tone mapping. Il ne prend effet qu'une fois le mod OpenCL ci-dessus installé et la stack redéployée ; l'activer sans cette étape préalable fera échouer les transcodages HDR au lieu de simplement ignorer le tone mapping.
Terminé !
Regarder à la maison
Tant que vous êtes connecté à votre réseau domestique (Wi-Fi ou Ethernet, sur le même réseau local que votre serveur), aucune exposition ni VPN n'est nécessaire. Utilisez Moonfin partout où il est disponible (téléphones, tablettes, Android TV/Google TV, ordinateur, web) plutôt que l'application Jellyfin officielle : il a la même apparence et le même fonctionnement partout, et peut synchroniser vos réglages entre appareils via son propre plugin serveur. Connectez-vous sur http://iplandevotreserveur:8096.
Samsung Tizen et LG webOS ont droit à une application Moonfin séparée et dédiée (même nom, base de code différente), et l'Apple TV est mieux servie par Neptune, un client tvOS dédié avec décodage natif HEVC/AV1/VP9 et passthrough Atmos complet. Là où aucun de ces clients n'existe (Fire TV, Roku, Kodi), voir le tableau ci-dessous :
| Plateforme | Application recommandée |
|---|---|
| Téléphone / Tablette (Android, iOS) | Moonfin (Play Store / App Store) |
| Android TV / Google TV | Moonfin (Play Store ou APK) |
| Apple TV | Neptune (App Store) |
| Samsung Tizen / LG webOS | Moonfin (sideloadé) ; les applications officielles existent mais sont en retard |
| Fire TV | Application Jellyfin officielle (Amazon Appstore) |
| Roku | Application Jellyfin officielle |
| Kodi | Jellyfin pour Kodi (synchronise votre médiathèque dans Kodi), ou JellyCon pour les boîtiers plus légers en streaming seul |
Regarder en dehors de chez soi
Plutôt que de faire passer tout le trafic d'un appareil par le VPN, ou même tout le sous-réseau VPN 10.8.0.0/24, nous utiliserons un split tunnel plus serré : chaque appareil distant ne route par le tunnel que le trafic destiné à l'adresse VPN de votre serveur. Tout le reste (navigation, autres applications) reste sur la connexion normale de l'appareil, et le VPN ne sert jamais qu'à joindre cette seule machine.
10.8.0.2) ; c'est l'adresse que viseront tous les appareils ci-dessous.AllowedIPs est un réglage de routage, et wg-easy n'ajoute aucune règle de pare-feu pour l'appuyer par défaut. Quiconque a accès à un appareil (ou à son fichier .conf) pourrait remettre AllowedIPs sur quelque chose de plus large et atteindre tout ce que votre serveur WireGuard sait router, y compris les autres pairs connectés. Si un pair est l'un de vos propres appareils, c'est en général un risque acceptable. Si vous confiez un pair à un tiers (un ami, un membre de la famille) qui ne doit jamais atteindre que Jellyfin, voir Restreindre un pair tiers à Jellyfin uniquement plus bas pour une façon de l'imposer réellement côté serveur.Créer un client dans wg-easy pour chaque appareil
En suivant Récupérer les fichiers de configuration, créez un client par appareil (téléphone, ordinateur, TV/boîtier multimédia) et téléchargez son fichier de configuration.
Restreindre le tunnel au seul serveur
Ouvrez chaque fichier .conf téléchargé et remplacez sa ligne AllowedIPs pour qu'elle ne couvre que l'adresse VPN de votre serveur Jellyfin, en /32 (une seule IP, pas une plage) :
AllowedIPs = 10.8.0.2/32
10.8.0.2 par l'adresse que votre serveur a réellement obtenue. Laisser le 10.8.0.0/24 par défaut ici ferait passer par le tunnel le trafic de tous les pairs VPN, pas seulement de votre serveur.Importer la configuration sur chaque appareil
- Téléphone : installez l'application WireGuard, puis importez le fichier
.confmodifié (ou scannez un QR code généré à partir de celui-ci). - Ordinateur : installez le client WireGuard et importez le fichier.
- TV : si elle tourne sous Android TV ou Google TV, installez WireGuard depuis le Play Store. Copiez le fichier
.confsur une clé USB, branchez-la sur la TV ou le boîtier, puis utilisez l'option Ajouter depuis un fichier de l'application pour parcourir la clé et l'importer. La plupart des autres systèmes de TV (Tizen, webOS...) ne peuvent pas installer de client VPN directement, passez donc plutôt par un appareil qui a déjà le tunnel actif (un boîtier Android TV, ou du cast depuis un téléphone ou un ordinateur connecté).
.conf est un identifiant, pas un simple fichier de réglages : quiconque le possède peut se connecter à votre VPN en tant que cet appareil. Une fois importé, supprimez-le de la clé USB (et de partout où vous l'avez copié, comme les dossiers Téléchargements), et ne le partagez jamais avec qui que ce soit.Terminé !
Restreindre un pair tiers à Jellyfin uniquement
wg-easy (v15.3+) sait l'imposer lui-même, avec une vraie règle de pare-feu à l'intérieur de son propre conteneur plutôt qu'un réglage côté client. C'est la bonne approche quand le pair appartient à quelqu'un d'autre, et non à l'un de vos appareils.
Activer le pare-feu par client
Dans le panneau d'administration de wg-easy, allez dans les réglages de l'interface et activez Per-Client Firewall. Il est marqué expérimental, mais fonctionne en générant une chaîne iptables dédiée dans le conteneur wg-easy.
Restreindre la destination autorisée du pair
Modifiez le client du tiers et réglez ses Firewall Allowed IPs sur l'adresse VPN de votre serveur Jellyfin, par exemple 10.8.0.2, ou plus restrictif encore, 10.8.0.2:8096/tcp pour restreindre aussi le port et le protocole.
AllowedIPs du client, ce qui n'est pas restrictif : il doit être renseigné explicitement pour ce pair. Cela coupe aussi l'accès internet classique de ce pair à travers le tunnel, puisque seul le trafic vers Jellyfin est désormais autorisé, ce qui est bien l'effet recherché pour un pair invité.Vérifier que la règle est appliquée
docker exec wg-easy iptables -L WG_CLIENTS -n -v
Vous devriez voir une ligne ACCEPT pour l'IP de ce pair pointant uniquement vers votre serveur Jellyfin, suivie d'un DROP fourre-tout.
Terminé !
Une fois connecté, ouvrez l'application Jellyfin ou http://10.8.0.2:8096 (l'adresse VPN de votre serveur) depuis cet appareil. Seul le trafic vers cette adresse passe par le VPN, le reste de la connexion de l'appareil n'est pas touché.