[Tuto] Installation de Jellyfin en Docker sur un NAS Synology + Transcodage Matériel / Hardware (HW)

EVOTk

Modérateur
Membre du personnel
Bonjour,
Un nouveau petit tuto pour vous apprendre a installer Jellyfin en Docker sur votre NAS Synology, mais également, a activer le transcodage matériel ou hardware ( HW ).

Jellyfin, c'est quoi ?
Jellyfin est une suite d'applications multimédias conçues pour organiser, gérer et partager des fichiers multimédias numériques sur des appareils en réseau. Jellyfin se compose d'une application serveur installée sur une machine exécutant Microsoft Windows, macOS, Linux ou dans un conteneur Docker, et une autre application exécutée sur un appareil client tel qu'un smartphone, une tablette, une télévision intelligente, un lecteur multimédia en continu, une console de jeu ou dans un navigateur Web. Jellyfin peut également diffuser des fichiers multimédias sur les appareils compatibles DLNA et Chromecast. C'est un fork logiciel gratuit et open-source d'Emby.

fRgGkBt.png


A la différence de [Tuto] Installation de Jellyfin + Transcodage matériel (HW) + Proxy Ngnix HTTPS ( Docker-compose ) ce tuto n'utilisera pas docker-compose, nous allons créer le conteneur depuis l'interface de DSM mais il n'est pas prévu dans le tuto de parler accès extérieur.

Pré-requis :
Avoir installé le paquet Docker
Avoir un accès SSH au Synology*
Dans docker : télécharger l'image linuxserver/jellyfin:latest

* Pour faire cette manip, il vous faudra vous connecter en SSH à votre NAS, si vous ne savez pas le faire, vous trouverez ici un tuto explicatif : [Tuto] Acceder à son NAS en lignes de commande.

A modifier selon votre installation :
Toute mon installation, va ce faire dans un dossier partagé "docker"
Je vais donc installer jellyfin dans /docker/jellyfin
Les PUID/PGID de mon compte utilisateur sont : PUID=1030 PGID=100**

** Pour connaitre le PUID/GUID de l'utilisateur : [Tuto] Connaitre le PUID / PGID d'un utilisateur.

Sommaire :
1/ Télécharger le conteneur
2/ Création du dossier d'installation
3/ Paramétrage / Création du conteneur
4/ Accès a Jellyfin
5/ Activer le transcodage hardware (HW)

1/ Télécharger le conteneur
Nous allons télécharger le conteneur linuxserver/jellyfin, pour cela nous allons ouvrir docker et se rendre dans Registre et rechercher "plex".
5FwSaWL.png

Une fois l'image linuxserver/jellyfin, on clique dessus, puis sur Télécharger, on sélectionnera "latest".

2/ Création du dossier d'installation
Le chemin est basé sur mon installation, à adapter selon votre installation.

Voici le dossier a créer :
- /docker/jellyfin/config

3/ Paramétrage / Création du conteneur
Une fois l'image fini de télécharger, nous allons dans Image, nous sélectionnons linuxserver/jellyfin:latest et on clique sur Lancer.
Cette fenêtre s'affiche :
2D0B72g.png

Il est possible de modifier, le nom "linuxserver-jellyfin1" qui est un nom par défaut, se nom sera le nom de votre conteneur t'elle qu'il apparaitra dans le liste de conteneur de Docker. On peut le nommer par exemple "Jellyfin" tout simplement.
Je vous conseil d'activer la limitation des ressources.
Priorité Moyen, par défaut c'est très bien.
Pour la RAM tout dépend de la quantité dispo sur votre machine, mais 2048Mo et a mon sens un minimum pour Jellyfin.

Ensuite, on clique sur Paramètres Avancés, dans Volumes :
Pour le fonctionnement de jellyfin, 2 dossiers sont obligatoires :
/config et /cache
Il vous faut les ajouter dans les volumes comme ceci :
nxZX2ZP.png

Dans l'onglet "Volume", nous allons cliquer sur "Ajouter un dossier" et choisir le dossier "config" que nous avons créé précédemment pour l'installation de l'image. Le chemin de ce dossier sera /config.
Afin que Jellyfin accède a vos média, vous allez devoir lui donner accès, je vous est fait un exemple avec le dossier /music présent sur mon nas.
J'ai placé /music dans /data/music, a vous de faire la suite si par exemple, vous avez un dossier films, vous le placé de la même façon, cliquer sur Ajouter un dossier, sélectionner votre dossier /films, et dans la partie Chemins d'accès, indiquer : /data/films, ...

Dans l'onglet Réseau, nous allons cocher "Utiliser le même réseau que Docker Host"

Dans l'onglet Environnement, nous allons rajouter 3 variables :
TZ, c'est le fuseau horaire, j'ai choisi Europe/Paris.
PGID, Group id ( voir point "A modifier selon votre installation" au début du tuto ) ( dans mon exemple c'est 100 )
PUID, User id ( voir point "A modifier selon votre installation" au début du tuto ) ( dans mon exemple c'est 1030 )
2ApOXlg.png


Maintenant, on clique sur "Appliquer", puis "Suivant", et on arrive a la page suivante :
9CqElQR.png


On clique sur "Appliquer" et le conteneur se créer, et démarre.
Dans l'onglet "Conteneur", on peu vérifier que notre conteneur est bien démarré !

4/ Accès a Jellyfin
Dans votre navigateur, il vous suffit maintenant de taper l'adresse ip de votre NAS suivi du port 8096 pour se connecter a l'interface Web de Jellyfin.
Exemple : Si l'ip de votre NAS est 192.168.0.20 alors l'adresse est http://192.168.0.20:8096
Bien sur, si le pare-feu de votre NAS est actif, ce port devra être autorisé dans celui-ci !

5/ Activer le transcodage hardware (HW)
A/ Application des permissions sur /dev/dri
Dans Panneau de configuration > Planificateur de tâches, nous allons créer une nouvelle taches ( Taches déclenchée > Script défini par l'utilisateur )
nmt5rbN.png


Je nomme la tache HW Jellyfin, l'utilisateur doit rester "root".
ITNiEjE.png


Dans Paramètres de la tache, je rentre le script suivant :
Code:
#!/bin/bash
#Startup Script
#Access for HW Decoder Jellyfin
chmod 666 /dev/dri/renderD128
exit
On peut, si on le souhaite, être averti par mail du bon déroulement de la tache, ou non.
zPtYa2C.png


Maintenant, on clique sur OK, pour valider la création de la tâche.
Notre tache apparait dans la liste de tâches, on la sélectionne, et on l'Execute une 1ere fois !
CjdAbjh.png


B/ Modification du .json
Pour éviter tout soucis d'encodage, je vous conseil de le faire directement depuis DSM, à l'aide du paquets : Éditeur de texte
Il vous faut donc au préalable, aller dans Centre des paquets, et installer ce paquets si vous ne l'avez pas encore !
HfLIgs1.png


Ensuite, nous allons dans Docker, Conteneurs et on s'il est en route, on arrete le conteneur Plex
Puis, nous allons Exporter la configuration dans un dossier de DSM :
yLOwO5I.png


Ici je l'exporte dans /docker/Jellyfin
LSQxRyg.png


Maintenant, via File Station, je vais dans le dossier comprenant mon fichier exporté, chez moi /docker/Jellyfin, et dessus je clique droit pour l'ouvrir avec l'éditeur de texte :
eQjOXsS.png


Le début du fichier va resembler à ceci :
WZdR9UT.png


ll vous faudra remplacer ceci :
Code:
"devices" : null,

Par :
Code:
"devices" : [
      {
         "CgroupPermissions" : "rwm",
         "PathInContainer" : "/dev/dri",
         "PathOnHost" : "/dev/dri"
      }
   ],

Voici ce que cela devrait vous donner :
PfpkKCE.png


Vous pouvez maintenant enregistrer le fichier :
gh6tG9e.png


Maintenant que notre fichier est prêt, nous allons l'exporter dans Docker, afin de remplacer notre conteneur jellyfin.
Dans l'application Docker > Conteneur, nous allons supprimer le conteneur Plex actuel :
y7N6tsX.png

Cette étape supprime le conteneur et sa configuration* uniquement, mais ni plex ou vos médias.

*configuration qui est contenu dans le fichier .json précédemment modifié !

Une fois, fait, nous allons Importer notre nouveau fichier .json de configuration de jellyfin :
BXhSkPW.png


On le sélectionne, et on valide, le conteneur va alors se créer :
rDyeaGw.png


Maintenant, nous démarrons notre conteneur Jellyfin grâce au petit bouton en bout de ligne du conteneur jellyfin :
6bjrmkk.png


C/ Activation du transcodage sur Jellyfin
Dans le Tableau de Bord de Jellyfin, nous allons dans l'onglet "Lecture"
BAxKPkn.png


Nous choisissons dans Accélération matérielle : Video Acceleration API
hlVAD5Q.png


Le chemin Appareil VA API doit être enregistré comme l'image ci-dessous, et "Activer l'encodage matériel" activé :
jgFpsm5.png


En bas de page on enregistre :
vsqCISH.png


et on confirme l'avertissement :
QgaZzw6.png



24/06/2020 - Rédaction du chapitre sur le transcodage hardware

Source: https://en.wikipedia.org/wiki/Jellyfin
 

FX Cachem

Administreur
Membre du personnel
Mais on ne l'arrête plus.... :giggle:

Bravo EVOTk pour ce travail et cadeau à la communauté !
 

brainlessrider

Nouveau membre
Merci beaucoup pour ce tuto limpide !
Juste une petite question, pourquoi avoir choisi de mettre le chemin /data/music au lieu de /media ? Une raison ou juste 2 manière de procéder ? Merci encore :)
 

EVOTk

Modérateur
Membre du personnel
Les chemins des média,.. Declerer dans docker sont suivants vos préférences, organisations. ..

Par exemple pour un dossier films sur volume1

Tu peu le déclarer /data/films ou /media/films, ou /truc/muche ou seulement /trucmuche
Cela ne change que l'arborescence dans Jellyfin, c'est une question d'organisation et de préférence uniquement.
 

brainlessrider

Nouveau membre
OK merci pour ta réponse.
Je sais que ce n'est pas le sujet ici mais comme tu as l'air d'être chevronné en ce qui concerne Jellyfin et docker, peut-être pourras tu m'éclairer à ce sujet :
je me retrouve avec des erreurs étranges dans les logs de docker (tout fonctionne mais je me demande si ca peut nuire qq part...) :
[11:23:10] [ERR] [21] App: AcceptWebSocketAsync error
System.Net.WebSockets.WebSocketException (0x80004005): The remote party closed the WebSocket connection without completing the close handshake.
---> System.Net.WebSockets.WebSocketException (0x80004005): The remote party closed the WebSocket connection without completing the close handshake.
at System.Net.WebSockets.ManagedWebSocket.ThrowIfEOFUnexpected(Boolean throwOnPrematureClosure)
at System.Net.WebSockets.ManagedWebSocket.EnsureBufferContainsAsync(Int32 minimumRequiredBytes, CancellationToken cancellationToken, Boolean throwOnPrematureClosure)
at System.Net.WebSockets.ManagedWebSocket.ReceiveAsyncPrivate[TWebSocketReceiveResultGetter,TWebSocketReceiveResult](Memory`1 payloadBuffer, CancellationToken cancellationToken, TWebSocketReceiveResultGetter resultGetter)
at System.Net.WebSockets.ManagedWebSocket.ReceiveAsyncPrivate[TWebSocketReceiveResultGetter,TWebSocketReceiveResult](Memory`1 payloadBuffer, CancellationToken cancellationToken, TWebSocketReceiveResultGetter resultGetter)
at Emby.Server.Implementations.SocketSharp.WebSocketSharpListener.ProcessWebSocketRequest(HttpContext ctx)

Je ne comprend pas vraiment ces messages, j'ai pourtant écris toutes les lignes que tu recommandais dans la partie reverse proxy de dsm mais bon, le websocket... :oops:
 

EVOTk

Modérateur
Membre du personnel
Salut,
Je suis loin d'etre expert, mais pour moi cette erreur c'est un connexion interrompu de manière anormale ( par exemple en lecture tu ferme la page, ou tu fait un retour arriere alors que la video ne s'est pas terminée toutes seule )
Ce n'est pas dérangeant selon moi, de plus Jellyfin est encore en dévelloppement, il reste encore beaucoup de boulot ( principalement pour le moment du nettoyage de code ( Jellyfin etant basé sur une version d'emby, la derniere version opensource d'emby pour etre exact ) et il reste dans Jellyfin encore beaucoup de trace d'emby. Et aussi beaucoup de fonction a "débug" ;)
 

brainlessrider

Nouveau membre
Effectivement on voit pas mal de "emby" dans le code, mais ce fork est vraiment prometteur et surtout ca fonctionne très bien une fois apprivoisé. Merci pour tes réponses et pour m'avoir rassuré sur ce message étrange :D Bonne soirée
 

EVOTk

Modérateur
Membre du personnel
MAJ ! Rédaction du chapitre sur "Activer le transcodage hardware (HW)" :giggle:
 

Narol

Nouveau membre
EVOTk a dit:
MAJ ! Rédaction du chapitre sur "Activer le transcodage hardware (HW)" :giggle:

Hello,

Tu écris : "Taches Planifié > Script défini par l'utilisateur" mais la capture d'écran montre une "tâche déclenchée" ... du coup ???
C'est peut être pas important mais au cas, je préférerai pas me tromper :)
 

EVOTk

Modérateur
Membre du personnel
Effectivement, c'est un tache déclenché ( dans notre cas, déclenché par le démarrage du NAS )
Edit : c'est modifié, merci ;)
 

Narol

Nouveau membre
Pour expliquer le contexte j'ai d'abord suivi ton autre tuto sur l'installation de Jellyfin via Docker (avec Proxy)
Lorsque j'édite le fichier exporté, sans aucune modif pour le moment, j'ai ça :

Code:
   "devices" : [
      {
         "CgroupPermissions" : "rwm",
         "PathInContainer" : "/dev/dri/renderD128",
         "PathOnHost" : "/dev/dri/renderD128"
      }
   ],

Du coup, est que c'est bien ? pas bien ? dois-je le conserver tel quel ou remplacer par ce que tu indiques ?
 

EVOTk

Modérateur
Membre du personnel
Salut,
Cela reviendra au même. Ce n'est pas un soucis que tu garde comme ceci, ou que tu remplace pour etre identique au tuto !
 

Raphm

Nouveau membre
Merci pour ce tuto qui correspond exactement à ce que je cherchais !

Pour autant, lorsque je réimporte mon .json et que je réactive le container, Jellyfin n'est plus accessible :(
J'ai essayé avec l'export original (non-modifié) mais pas plus de succès. J'ai du merder qq part... :oops:
 

EVOTk

Modérateur
Membre du personnel
Salut,
Le docker se lance bien ?
Il faut regarder les logs tu aura surement plus d'info. ( u clique sur le conteneur > Details > Journal tu peu l'exporter en HTML et l'inclure dans ton reponse en piece jointe )
 

Raphm

Nouveau membre
Merci pour la réponse.
Oui le docker se lance, mais rien que je vais à l'adresse habituelle 192.XXX:8096.
Les logs en questions en pj.
 

Pièces jointes

  • Image1.png
    Image1.png
    617.8 KB · Affichages: 1 516

EVOTk

Modérateur
Membre du personnel
Salut,
Rien de spécial dans les logs ! dommage
Avant la modif, c'était fonctionnel ?
Et le retour en arrière ne fonctionne pas ?

J'ai bien peur qu'il va te falloir reprendre depuis le début !
 

Raphm

Nouveau membre
Oui avant la modif, ça fonctionnait bien, je n'avais juste pas encore l'accélération matérielle.
Je retente et si j'ai des infos à remonter, je partagerai :)
Merci pour le tuto en tout cas
 

EVOTk

Modérateur
Membre du personnel
Raphm a dit:
Oui avant la modif, ça fonctionnait bien, je n'avais juste pas encore l'accélération matérielle.
Je retente et si j'ai des infos à remonter, je partagerai :)
Merci pour le tuto en tout cas

C'est étrange, surtout que les logs ne laisse rien voir.
Une tentative peut etre, remet ton .json comme a l'origine
sur le conteneur, tu l'arrete, et tu fait > Clique droit > Supprimer
Puis tu importe le .json original
Sur le conteneur nouvellement arrivé, tu fait clique droit > Effacer ( tu attend quelques secondes, il se peut qu'il disparaisse 2 sec )
Puis tu démarre le conteneur
 

Raphm

Nouveau membre
Sans succès.
Du fait de ma n00bité sur le sujet, je pense que mon install a quelques problématiques de config.
Ca va être l'occasion de repartir de la base proprement.
 

MilesTEG1

Chevalier Jedi
Hello :)
J'ai suivi le tuto pour installer Jellyfin dans Docker :) Avec une légère variation : l'utilisation d'un fichier docker-compose.yml.
Code:
---
version: "2.4"
services:
  linuxserver_jellyfin:
    image: linuxserver/jellyfin:latest
    container_name: linuxserver_jellyfin
    environment:
      - PUID=1000
      - PGID=100
      - TZ=Europe/Paris
      - LANG=fr_FR.UTF8
      - LANGUAGE=fr_FR.UTF8
      - UMASK_SET=022 #optional
    volumes:
      - "/volume1/docker/jellyfin/config:/config"
      - "/volume1/docker/jellyfin/transcode:/transcode" #optional
      - "/volume2/médias1:/data/tvshows:ro"
      - "/volume2/médias2:/data/movies:ro"
      - "/volume2/médias3:/data/videos:ro"
    ports:
      - 8096:8096
      - 8920:8920 #optional
    devices:
      - /dev/dri:/dev/dri #optional
    restart: unless-stopped
    mem_limit: 4096m
    mem_reservation: 2048m
networks:
    default:
        external:
            name: media_server

Avec ce fichier, il faut se connecter en SSH et lancer la commande suivante dans le dossier contenant le fichier (et qu'il y ait aussi le dossier config de créé et dont le propriétaire est l'utilisateur dédié à Jellyfin (récupérer les UID/GUID avec id nom_user) :
Code:
sudo docker-compose up -d
Une fois cette commande terminée, le conteneur sera lancé, et il n'y aura pas besoin de modifier le fichier de configuration JSON exporté, car il contient déjà les modifications à faire pour avoir /dev/dri pour l'accélération HW.

Bon par contre, ça nécessite d'utiliser la ligne de commande en SSH. Mais l'avantage, c'est que pour refaire le conteneur, ou le mettre à jour, c'est plus rapide ;)

J'ai aussi ajouté des limitations de RAM ;)
(je n'ai pas encore compris comment faire pour limiter le CPU avec ces paramètres... trop de choix possible ^^).

Voilà voilà


Bon par contre, impossible de lire des vidéos 4K en HEVC... (h265). que ce soit sur la TV ou dans le navigateur...
Capture d’écran 2020-09-06 à 16.00.23.png
C'est possible ?
Si non, bah j'aurais tenté ;) Et je devrais me rabattre sur une autre solution (sans abonnement...)

Merci d'avance
++
 
Haut