Installer Jellyfin avec Docker
Guide d'installation de Jellyfin sous Docker, une alternative à Plex.
Au sommaire :
- 1-Qu'est-ce que Jellyfin ?
- 2-Prérequis
- 3-Pré-configuration
- 4-Déploiement
- 5-Configuration
- 6-Transcodage GPU (Intel)
- 7-Intégration à Kodi via JellyCon
- 8-Exposer son instance avec Traefik
1-Qu'est-ce que Jellyfin ?
Sorti le 30 novembre 2018, Jellyfin est un serveur multimédia libre sous licence GPLv2, basé sur la dernière version open-source de Emby dont il est un fork avant qu'il passe en sources fermés.
Tout comme Plex, Jellyfin va vous permettre d'organiser vos différents contenus (musiques, films, séries) à travers une interface web et de pouvoir y accéder à travers différents terminaux (iOS, Android TV).
Mais ce n'est pas tout. Vous pouvez également profiter d'autres fonctionnalités comme l'IPTV ou l'enregistrement DVR et ce, gratuitement.
C'est une de mes applications favorites sous Docker. Il me permet de visionné en local ou à distance mes formations vidéos, mes documentaires, les chaines Youtube dont j'ai fait une sauvegarde ainsi que quelques films.
Voici une image de mon instance au passage.
2-Prérequis
Il vous faudra une machine virtuelle sous Ubuntu Server 22.04 LTS.
Voici le guide pour ceux qui veulent repartir de zéro.
Si vous voulez gagner du temps, utilisez un template cloud-init.
Ensuite, suivez ce guide pour installer Docker, Docker Compose et préparer vos variables d'environnement.
Pourquoi ne pas utiliser une image cloud-init vous me direz ? Pour une raison inconnue, impossible de transmettre un périphérique alors qu'avec une image Ubuntu Server ou Desktop, aucun soucis donc on va partir de cette base.
3-Pré-configuration du système
Installer Docker et Docker Compose
Mettez à jour le système.
sudo apt update && sudo apt upgrade -y
Puis installez les paquets suivants :
- apt-transport-https : transport d'APT pour télécharger par HTTPS (protocole de transfert hypertexte sécurisé).
- ca-certificates : permet l'ajout de certificats CA.
- curl : récupération de données à travers une URL.
- software-properties-common : abstraction de apt. Facilite la gestion des dépôts.
sudo apt install -y \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
Ajoutez la clés GPG avec curl en l'ajoutant à /usr/share/keyrings.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Ajoutez le dépôt de Docker avec la commande "echo" dans le dossier /etc/apt/sources.list.d.
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Mettez à jour les dépôts.
sudo apt update
Et enfin, installez le paquet "docker-ce".
sudo apt install docker-ce -y
Pour pouvoir utiliser docker sans la commande "sudo", ajoutez l'utilisateur au groupe docker avec la commande suivante.
sudo usermod -aG docker username
C'est pas obligatoire pour ce tutoriel mais prenez l'habitude de rédiger vos manifestes avec Docker Compose au lieu de faire du "docker run", ça aide à être mieux organisé.
Tout d'abord, créez un dossier "cli-plugins" dans le dossier "/home/user_name/.docker".
mkdir -p ~/.docker/cli-plugins/
Avec la commande "curl", téléchargez la version 2.14.2 de Docker Compose sur à partir du dépôt Github.
curl -SL https://github.com/docker/compose/releases/download/v2.14.2/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
Rendez le fichier exécutable avec la commande "chmod +x".
chmod +x ~/.docker/cli-plugins/docker-compose
Enfin, vérifiez la version de Docker Compose.
docker compose version
Les variables d'environnement
Dans le terminal, tapez "id" et notez l'identifiant de votre utilisateur et du groupe "docker.
Ensuite, éditez le fichier /etc/environment" et ajoutez ces variables.
- PUID : identifiant de l'utilisateur (le vôtre)
- PGID : identifiant du groupe (docker)
- TZ : le fuseau horaire (Europe/Paris si vous êtes en France)
- APPDATA : le dossier qui contiendra toutes les configurations de vos conteneurs
- MEDIA : le dossier qui contiendra vos contenus multimedias donc soit en local, soit sur un partage NFS
PUID=1000
PGID=999
TZ="Europe/Paris"
APPDATA="/home/user_name/appdata"
MEDIA="/home/user_name/media"
Pour l'exemple, je met le dossier "appdata" à la racine du dossier utilisateur mais je vous conseille plutôt de stocker de le stocker en dehors de la machine virtuelle, que ce soit sur un disque interne (SATA), externe (USB) ou un partage NFS.
Déconnectez vous avec la commande "logout" puis reconnectez-vous.
4-Déploiement
Commencez par créer un dossier "docker" à la racine du dossier utilisateur"
mkdir -p ~/docker
Créez un fichier nommé "compose.yml"
touch ~/docker/compose.yml
Ouvrez le fichier "compose.yml" et copiez cette configuration.
version: "3.9"
networks:
# Docker Bridge Network
default:
driver: bridge
services:
jellyfin:
image: lscr.io/linuxserver/jellyfin:latest
container_name: jellyfin
environment:
PUID: ${PUID}
PGID: ${PGID}
TZ: ${TZ}
# JELLYFIN_PublishedServerUrl: 192.168.0.5 #optional
volumes:
- ${APPDATA}/jellyfin:/config
- ${APPDATA}/transcode:/ram_transcode
- ${MEDIAS}/tvseries:/data/tvshows
- ${MEDIAS}/movies:/data/movies
ports:
- 8096:8096
- 8920:8920 #optional
- 7359:7359/udp #optional
- 1900:1900/udp #optional
Pour les options communes :
- version : version du fichier compose : https://docs.docker.com/compose/compose-file/compose-file-v3/
- network : en bridge (l'adresse IP sera celle de la machine virtuelle ou du conteneur LXC)
- services : c'est là qu'il faudra ajouter les configurations de vos conteneurs
- image : nom du registry suivi du nom de l'application (lscr.io/linuxserver/app_name)
- container_name : le nom du conteneur, sinon Docker en choisira un de manière aléatoire (mieux vaut le nommer vous même)
- environment : il y a les variables de base (PUID, PGID, TZ) et des variables spécifiques aux applications (pas besoin d'y toucher)
- volumes : variable ${APPDATA) (/home/user_name/appdata) suivi du nom de l'application (/app_name) et enfin ${MEDIAS} (/mnt/tvseries et /mnt/movies) qui de préférence seront sur un partage NFS et contiendront donc vos films et séries. Le dossier "transcode" servira à stocker les fichiers temporaires nécessaires au transcodage des fichiers (mieux vaut l'externalisé à travers un point de montage car ça écrit énormement sur le SSD)
- ports : 8096 (interface web en http), 8920 (interface web en https, optionnel), 7953/udp (permet aux clients de découvrir Jellyfin en local, optionnel) et 1900/udp (port utilisé par le protocole DLNA, optionnel)
- restart : unless-stopped par défaut. Le daemon de Docker redémarrera automatiquement le conteneur sauf si vous l'arretez, il faudra le démarrer manuellement
Créez le dossier "media" puis les dossiers "tvseries" et "movies" à l'intérieur de ce dernier, sinon c'est le conteneur qui va le créer avec les accès root:root, ce qui va vous empêcher de transférer vos contenus si vous vous connecté avec un compte standard.
Téléchargez l'image et déployez le conteneur.
docker compose pull && docker compose create
Puis démarrez le conteneur.
docker start jellyfin
5-Configuration
Choisissez votre langue (français dans mon cas).
Créez un compte utilisateur.
Cliquez sur "Ajouter une médiathèque".
Sélectionnez le type de contenus, le nom d'affichage et le dossier correspondant indiqué dans la configuration Docker.
Choisissez la langue des métadonnées. Personnellement, j'ai tendance à choisir l'anglais car les bases de données sont plus fournis en cette langue (logique) que le français.
Passez cette étape.
Félicitation!!!! Vous avez finalisé la configuration de base.
Authentifiez-vous avec le compte nouvellement créé (base de donnée sous SQLite, je précise).
Ouvrez votre explorateur de fichier sur votre distribution bureautique Linux ou votre client Filezilla et connectez-vous avec les identifiants suivants en SFTP :
- sftp://ip_address
- user/password : votre nom d'utilisateur et votre mot de passe
Copiez un film dans le dossier "movies" par exemple.
Puis dans tableau de bord, cliquez sur "Actualiser toutes les médiathèques" pour faire apparaître les nouveaux contenus.
Jellyfin va scanner et récupérer les métadonnées concernant vos contenus.
6-Transcodage GPU (Intel)
Tout comme Plex et Emby, Jellyfin vous permet de transcoder vos contenus à travers une carte ou un circuit graphique.
Imaginez que vous regarder un film stocké sur votre serveur à distance mais que la bande passante ne soit pas suffisante, Jellyfin va retravailler le flux vidéo (transcodage).
C'est exactement ce que font les fournisseurs de VOD comme Netflix, Amazon Prime, Disney+ et consort.
Par défaut, c'est le processeur qui va s'en charger mais cela aura impact non négligeable en terme de performances selon le format vidéo qu'il va devoir traiter.
Transcoder du h264 ça passe, du h265, c'est une autre paire de manches.....
Il y a deux solutions pour soulager le processeur :
- Soit utiliser le circuit graphique fournis par les fondeurs (Intel HD Graphics, Radeon Vega)
- Soit utiliser une carte graphique dédiée compatible pour le transcodage
Pour ce tutoriel, je vais vous montrer la marche à suivre pour utiliser le circuit graphique Intel HD.
Si vous avez lu plus haut, je n'utilise pas d'image cloud-init car elles ne sont pas adaptés à la transmission de périphérique donc si vous voulez utiliser l'accélération matérielle, pensez bien à créé une machine virtuelle à partir d'une ISO Ubuntu (lien du tutoriel plus haut).
Dans PVE, j'ajoute le périphérique PCI 00:02 qui est le circuit vidéo de mon processeur à la machine virtuelle mais dans votre cas, si vous voyez indiqué "Integrated Graphics Controller", c'est que c'est le bon périphérique.
Démarrez votre machine virtuelle, connectez-vous à la machine virtuelle et tapez "lspci", vous verrez que le périphérique apparaît bien dans la liste.
Tapez la commande "ls -l /dev/dri/by-path", vous verrez que le périphérique "00:10" qui correspond au circuit graphique Intel est nommé "card1" et "renderD128".
Une fois vérifié que le périphérique apparaît, on passe à la suite.
Activer OpenCL
Tout d'abord il va falloir activer OpenCL.
OpenCL (Open Computing Language) est une API proposant de tirer parti de la puissance des GPU, en d'autres termes, OpenCL permet au programme d'utiliser la carte graphique pour faire des calculs, parallèlement ou séparément des calculs faits par le processeur.
Dans les variables d'environnement de votre manifeste YAML, ajoutez la ligne "DOCKER_MODS" pour activer OpenCL.
environment:
DOCKER_MODS: linuxserver/mods:jellyfin-opencl-intel
Monter le circuit graphique
Enfin, il va falloir monter le circuit graphique pour que Docker puisse le rendre visible au conteneur Jellyfin.
Ajoutez la ligne "device" et indiquez le chemin du périphérique.
devices:
- /dev/dri/renderD128:/dev/dri/renderD128
Cela devrait ressembler à ça à la fin.
version: "3.9"
networks:
# Docker Bridge Network
default:
driver: bridge
services:
jellyfin:
image: lscr.io/linuxserver/jellyfin:latest
container_name: jellyfin
environment:
PUID: ${PUID}
PGID: ${PGID}
TZ: ${TZ}
DOCKER_MODS: linuxserver/mods:jellyfin-opencl-intel
volumes:
- ${APPDATA}/jellyfin:/config
- ${APPDATA}/transcode:/ram_transcode
- ${MEDIA}/tvseries:/data/tvshows
- ${MEDIA}/movies:/data/movies
ports:
- 8096:8096
- 8920:8920 #optional
- 7359:7359/udp #optional
- 1900:1900/udp #optional
devices:
- /dev/dri/renderD128:/dev/dri/renderD128
docker compose pull && docker compose create && docker start jellyfin
Cliquez sur les trois bandes horizontales en haut à gauche, cliquez sur "Tableau de bord" puis "Lecture".
Dans "Transcodage", choisissez l'option suivante selon votre configuration :
- Si vous avez minimum un circuit graphique sous Browdell ou supérieur, sélectionnez Intel Quick Sync
- Si vous avez un circuit graphique en dessous du Broadwell, privilégiez VAAPI
Pour ma part, pas de bol!!!! Le Intel HD 4600 de mon processeur Haswell n'est pas compatible alors qu'il transcode bien en h264....
Si vous avez des processeurs récents, vous n'aurez pas forcément besoin d'une carte graphique dédiée, surtout avec les APU Ryzen qui ont une partie graphique boosté aux hormones.
Indiquez bien le chemin du périphérique dans "Appareil VA-API" ou "Intel QuickSync", activez le décodage matériel en vérifiant bien que votre circuit graphique prend en compte les codecs de la liste et laissez la case "Activer l'encodage matériel" cochée.
Jellyfin vous averti que l'accélération matérielle peut provoquer de l'instabilité voir que vous ne pourrez pas transcoder du tout donc si vous avez un message d'erreur, revenez à la configuration précédente.
C'est mon cas pour moi mais si vous avez un APU ou une carte récente, vous ne devriez pas rencontrer de problèmes.
7-Intégration à Kodi via JellyCon
Si vous avez Kodi à la maison (il est disponible quasiment partout aujourd'hui), je ne saurait trop vous conseiller d'installer le plugin JellyCon qui va vous permettre d'accéder aux contenus de Jellyfin directement à partir de votre télévision.
Pour ce faire,installez Kodi sur Windows ou Linux et suivez la procédure suivante :
- Ouvrez votre navigateur et téléchargez l'archive zip du dépôt : https://kodi.jellyfin.org/repository.jellyfin.kodi.zip
- Ouvrez Kodi, allez dans les paramètres et naviguez jusqu'à "Add-on Browser".
- Sélectionnez "Install from Zip File", un message devrait apparaître vous indiquant d’activer l'option "Unknown Sources" pour installer des plugins non signés
- Sélectionnez votre archive et installez lé dépôt
- Retournez au menu de démarrage et allez dans"Add-on Browser"
- Sélectionnez "Install from Repository"
- Choisissez "Kodi Jellyfin Add-ons", suivi par "Video Add-ons"
- Sélectionnez le plugin Jellyfin et installez-le
Lorsque ce sera fait, il suffira de renseignez l'adresse de votre serveur Jellyfin ainsi que le compte que vous souhaitez utilisé.
8-Exposer son instance avec Traefik
Pour exposer votre instance sur l'internet public, suivez mon guide sur le reverse proxy Traefik.
J'explique plus en détails les modifications à apporter à votre configuration Jellyfin dans le chapitre 9 du guide mais le gros ajout c'est la section "labels" lié à Traefik.
À la fin, vous devriez avoir la même configuration que moi.
version: "3.9"
networks:
web:
services:
jellyfin:
image: lscr.io/linuxserver/jellyfin:latest
container_name: jellyfin
environment:
PUID: ${PUID}
PGID: ${PGID}
TZ: ${TZ}
volumes:
- ${APPDATA}/jellyfin:/config
- ${APPDATA}/transcode:/ram_transcode
- ${MEDIA}/tvseries:/data/tvshows
- ${MEDIA}/movies:/data/movies
network:
web:
ports:
- 8096:8096
- 8920:8920 #optional
- 7359:7359/udp #optional
- 1900:1900/udp #optional
labels:
- traefik.enable=true
- traefik.http.routers.jellyfin.entrypoints=websecure
- traefik.http.routers.jellyfin.rule=Host(`jellyfin.<votredomaine>.ovh`)
- traefik.http.routers.jellyfin.service=jellyfin-svc
- traefik.http.services.jellyfin-svc.loadbalancer.server.port=8096
- traefik.http.routers.jellyfin.tls.certresolver=letsencrypt
Recréez votre conteneur et démarrez-le.
docker compose create && docker start jellyfin
Vous devriez obtenir votre certificat SSL.