Installer Jellyfin avec Docker

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.

Virtualiser Ubuntu Server 22.04 LTS sur Proxmox VE
Guide d’installation de Ubuntu Server 22.04 LTS sur Proxmox VE avec mes meilleurs réglages.

Si vous voulez gagner du temps, utilisez un template cloud-init.

Initialiser vos machines virtuelles avec Cloud-init sur Proxmox VE
Guide d’installation de Cloud-Init qui va vous permettre d’automatiser vos déploiements

Ensuite, suivez ce guide pour installer Docker, Docker Compose et préparer vos variables d'environnement.

Installer Docker
Guide d’installation de Docker.

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.

Hardware Acceleration | Jellyfin
The Jellyfin server can offload on the fly video transcoding by utilizing an integrated or discrete graphics card (GPU) suitable to accelerate this workloads very efficiently without straining your CPU.

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.

Intel GPU | Jellyfin
This tutorial guides you on setting up full video hardware acceleration on Intel integrated GPUs and ARC discrete GPUs via QSV and VA-API.

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.

OpenCL — Wikipédia

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.

Accélération vidéo matérielle
Apprendre à administrer et utiliser Linux & Android

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.

Kodi | Jellyfin
Add-on Repository

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.

Installer Traefik avec Docker
Guide d’installation de 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.