Mettre en place un serveur Jellyfin sous Proxmox

jellyfin 26 nov. 2023

Il y a quelques temps, j'ai décidé de mettre en terme à une petite partie de mes faibles abonnements (notamment ceux qui sont en streaming), et pour de nombreuses raisons: le marché du streaming est tellement fractionné dans l'état actuel, et plus je vais devoir débourser de l'argent pour avoir accès à des séries qui se trouvaient déjà sur une plateforme quelques mois/années auparavant. Pour ma part, les seuls abonnements que je me suis gardé, c'est Amazon Prime (malgré son prix en hausse et ses services en baisse), mon abonnement NSO+ Familial (que je coupe pour réduire légèrement son prix), et le prix de mes serveurs dédiés pour BaseQ. Le total se résume environ à 300€/an, ce qui reste quand même une petite somme. Oui, je paie annuellement, et non mensuellement.

Mais quand on sait que des gens ont différents abonnements en même temps, comme Netflix, Disney+, Spotify, Amazon prime, le PS+ ou le Xbox Live, Adobe, etc etc... Le prix annuel (et mensuel surtout) est juste gigantesque. Et même si certains FAI essaient d'inclure "gratuitement" certains de ces services dans leurs abonnements, c'est juste trop cher. Tout le monde ne peut pas se permettre de telles dépenses, et pourtant il y a beaucoup de personnes qui se rendent pas compte qu'ils n'utilisent pas, ou que très peu ces services. Et hop, 200€/mois qu'on perd de manière très stupide. Eh oui, c'est quelque chose que beaucoup ne font pas gaffe, sauf si on s'appelle Sieur Jean-Eude de la Richelieutierre (ne soyez pas offensés les Jean-Eudes de la Richelieutierre) et qu'on aime dépenser sans compter.

Bref, on va pas se mentir : suite à la situation économique actuelle, le système d'abonnement n'est absolument plus attractif en 2023. Non seulement le contenu est plus faible que jamais, mais les abonnements sont devenus en contrepartie de plus en plus chers, ce qui est tout sauf normal (ni même acceptable en premier lieu). En plus de cela, les entreprises essaient de bloquer tout moyen permettant le partage de compte dans la famille... Sauf si on décide de payer un supplément. Le comble. Et ne parlons pas des abonnements absolument partout, même pour des programmes qui étaient auparavant des 1-Time Payments. Bref. On marche vraiment sur la tête dans ce monde capitalisme incroyablement abusif, et je peux comprendre pourquoi le piratage reprend vraiment de plus belle depuis peu...

Avouez que ça vous redonne envie 😤

Donc, on va reprendre du poil de la bête. Quitte à faire de grosses économies, autant le faire bien. J'ai déjà acheté l'année dernière un microPC d'entreprise (ce dernier utilise un Intel i5-10500T) que j'utilise comme serveur dédié de self-hosting. Je l'ai accompagné de Proxmox, sorte d'"OS" permettant de créer des machines virtuelles qui sont utilisés pour héberger des services que j'utilise chez moi comme à l'extérieur, ainsi que d'un NAS (un Synology DS720+) que j'ai acheté fin 2020 avec 2 disques durs de 8To montés en RAID1 pour des backups ou juste pour stocker films et séries que j'ai converti de mes DVDs ou Blu-Rays (a voir si ça vous intéresse que je fasse un article la dessus dans le futur!).

Bien sur, vous pouvez faire le serveur de votre propre façon (c'est ça la magie du self-hosting!), mais j'ai décidé de mettre le moins d'argent la dessus avec le matériel que je possède déjà. Et comme je possède des appareils utilisant Android TV, cela me permet d'installer le client officiel Jellyfin, une application me permettant de streamer les séries, films, et bien plus encore sur la télé, téléphone, ou encore son ordinateur. Pour cela, il faut juste que j'héberge un serveur Jellyfin et qu'il puisse décoder les flux vidéo via notre hardware. C'est pour cela qu'on va installer un conteneur LXC pour ce genre d'usage.

‼️
Ce tutoriel va utiliser un CPU Intel qui est de 8ème génération ou plus (d'où l'usage de QuickSync)! Si vous utilisez un GPU NVIDIA ou AMD, il va y avoir pas mal de différences qui ne seront pas marqués dans ce post. De plus, on va utiliser un NAS (via protocole SMB3) pour le stockage des films.
💡
Ce tutorial nécessite des connaissances en Linux, même légères. De plus, vous devez avoir un serveur avec au moins 8Go de stockage, 2Gb de RAM, et 2 coeurs pour pouvoir fonctionner correctement.

Pourquoi Jellyfin et pas Flex?

C'est vrai tiens. J'aurais pu proposer Flex, mais devinez quoi. C'est ENCORE un programme, bien que populaire, qui nécessite... Un abonnement pour vraiment profiter du service (et notamment pour décoder via le hardware), même quand il est self-hosté. Quelle surprise, pas vrai? Rajoutez à cela les failles de sécurité qui n'ont pas été rapportés de manière transparente, le fait de blacklister certains hébergeurs pour mettre nos vidéos via un serveur dédié externe... Bref, Plex n'est plus vraiment quelque chose que je qualifie d'acceptable.

Donc, dans le milieu du FOSS, je ne connais qu'une seule alternative me permettant de faire tout ce que je souhaite: Jellyfin. 100% gratuit et communautaire, complet, efficace, compatible et malléable sur beaucoup de domaines, c'est définitivement le meilleur programme pour ce genre d'usage. Bien sur, pour en profiter pleinement, il faut l'héberger soi-même.

Installation du LXC avec Proxmox

Afin de pouvoir gérer l'installation du serveur, on va devoir aller dans son dashboard (https://<votreIPduserveur>:8006) . Ensuite, dans Nodes, cliquez sur le nom de votre serveur, puis cliquez sur Shell en haut à droite.

Pour ceux qui ne savent pas comment obtenir le Shell du Proxmox...

Côté Shell...

Une fenêtre va donc apparaitre avec la possibilité de modifier ou de paramétrer votre serveur Proxmox via des lignes de commandes. Et de la sorte, on va créer notre conteneur LXC avec Jellyfin.

En soi, créer un conteneur LXC n'est pas une chose si aisée à faire. Heureusement, un utilisateur nommé Ttech sur Github a réalisé un grand nombre de scripts permettant d'avoir une quantité très utile de scripts pour installer des services de la sorte, et ce assez rapidement. Par chance, Jellyfin en fait partie!

En général je n'aime pas lancer des scripts à l'aveugle, mais la source est entièrement lisible et disponible sur Github (avec un readme pour les audits). Donc, dans le shell de Proxmox, vous allez rentrer cette commande (n'hésitez pas à le copier/coller) :

bash -c "$(wget -qLO - https://github.com/tteck/Proxmox/raw/main/ct/jellyfin.sh)"

Vous pouvez laisser les paramètres par défaut. Cependant, si vous essayez de mettre les informations personnalisées, ne mettez pas Debian comme OS, car cela ne marche pas (pour une raison que j'ignore). C'est dommage, mais que voulez-vous...

Une fois l'installation terminée, on peut voir dans la console que Proxmox est installé, et qu'on peut y accéder via notre navigateur à l'adresse http://<votreIPduconteneur:8096. De plus, dans Proxmox, vous devriez voir le conteneur dans un onglet "LXC Container".

💡
Si vous avez un serveur DNS, pensez à pointer une entrée vers l'IP de votre contenaire LXC !

Mise en place du dossier partagé

Afin que ça soit plus simple pour moi de gérer le tout, j'ai décidé d'utiliser mon NAS (un Synology) en tant que serveur SMB. Si vous préférez utiliser un disque dur externe, faites-le donc, mais pensez donc à le monter depuis le dashboard de Proxmox.

Il faudra créer un utilisateur sur le serveur SMB qui aura uniquement accès au dossier videos et qui aura les droits de lecture, d'écriture, et d'accès aux sous-dossiers. Pour cela, je vous laisse faire les manipulations nécessaires en fonction de votre installation.

Une fois fait, il va falloir qu'on s'assure de bien connecter notre conteneur au serveur distant. Donc, on va commencer par créer un dossier /media/video sur le conteneur LXC.

mkdir /media/video

Puis, on va créer un service qui va monter pour ce dossier. Attention cela dit à le nommer exactement comme cela, sinon ce dernier ne fonctionnera pas un peu plus tard.

nano /etc/systemd/system/media-video.mount

On va mettre le contenu suivant. N'oubliez pas de changer l'IP et le répertoire source dans What= si votre dossier diffère d'un Synology...

[Unit]
  Description=cifs mount script
  Requires=network-online.target
  After=network-online.service

[Mount]
  # REMPLACER <IP> par l'IP de notre NAS (comme 192.168.0.200), ainsi que le
  # dossier cible si ce dernier n'est pas au même endroit.
  What=//<IP>/video
  Where=/media/video
  Options=credentials=/root/.smb,noperm
  Type=cifs

[Install]
  WantedBy=multi-user.target
💡
Info utile : si jamais vous voulez monter votre dossier vidéo dans un autre endroit (supposons dans /mnt/mondossier/defolie), vous devrez créer votre fichier en tant que mnt-mondossier-defolie.mount ! Vous devrez aussi modifier la partie Where= du tuto pour pointer bien sur vers /mnt/mondossier/defolie !

Enfin, on va créer un fichier dans le dossier /root qui contiendra nos informations de compte pour se connecter au serveur SMB.

nano /root/.smb

username=my_user_dedicated_to_video_folder
password=this_is_my_password

Enfin, on va installer le service CIFS permettant

On va pouvoir désormais créer le service.

systemctl enable media-video.mount
systemctl start media-video.mount

Si aucun message d'erreur apparait, regardez le contenu dans le dossier qu'on a monté. Et de plus, dans Jellyfin, vous devriez voir le dossier, ainsi que ses sous-répertoires.

Par ailleurs, je vous conseille de faire un dossier dédié aux films, un autres aux séries, un autre aux dessins animés, un autre aux anime... Cela sera bien plus facile à gérer dans le futur.

On voit tout!

Et en effet, après quelques paramétrages, et le temps que les métadonnées soient entièrement générées... Vous devriez voir des catégories (avec des miniatures), ainsi que les séries que vous avez ajoutés.

Nos films et séries s'y trouvent 😃
💡
D'ailleurs, je vous conseille fortement de lire la documentation de Jellyfin pour bien organiser vos contenus!

Oui, mais....!?

Problème : au reboot, ce montage automatique ne marchera plus. Je ne sais pas du tout la raison précise, si c'est dû au conteneur LXC, d'Ubuntu ou d'une toute autre raison.

Donc, j'ai du faire un workaround qui me déplait, mais j'ai pas trouvé autrement. Si quelqu'un à la solution, merci de me dire quoi faire.

On va modifier le crontab (crontab -e), et on va ajouter à la toute dernière ligne ceci:

@reboot sleep 10 && systemctl restart media-video.mount
Comme ceci.

Redémarrez le conteneur... Et vérifiez si le dossier est toujours bien lié.

Acceleration Materielle (QuickSync)

Vous pouvez désormais lire vos vidéos, mais comme vous le savez, tous les appareils qui utilisent Jellyfin ne sont pas identiques. Certains vont avoir un moyen de décoder les vidéos à la volée avec leur matériel, mais dans la majorité des cas, il faudra que le serveur encode la vidéo en temps réel et le transmette aux clients. Sinon, la vidéo ne pourra être lue.

Par chance, la très grande majorité des CPU Intel possèdent un iGPU permettant de faire ces opérations de manière très accessible. Cependant, conteneur LXC oblige, il faut qu'on configure ce dernier pour qu'il utilise les capacités graphiques du processeur, ainsi que d'expliquer à Jellyfin comment on va encoder les vidéos.

Côté Shell de Jellyfin

J'ai adapté le tutorial du redditteur bap0007 à propos de l'installation. Ce n'est surement pas obligatoire avec le containeur LXC, mais je l'ai fait au cas où.

On va rentrer les commandes suivantes:

# Installation des paquets necessaires...
apt-get install -y gpg-agent wget

# On installe la clé
wget -qO - https://repositories.intel.com/graphics/intel-graphics.key | sudo apt-key add -

apt install software-properties-common

# Installation du repository d'Intel pour Quicksync
apt-add-repository 'deb [arch=amd64] https://repositories.intel.com/graphics/ubuntu focal main'

# Update des sources et installation des paquets necessaires
apt update && apt install intel-opencl-icd intel-level-zero-gpu level-zero intel-media-va-driver-non-free libmfx1

# On ajoute jellyfin au groupe render crée par Intel 
usermod -aG render jellyfin

Maintenant, on va rentrer cette commande suivante:

grep render /etc/group | awk -F: '{print $3}' 

Une valeur va être écrite à l'écran. Gardez la quelque part, elle va être nécessaire pour après!

Ce que vous devriez voir. Ma valeur ici est 108.

Une fois cette valeur notée dans un coin, éteignez le conteneur LXC.

Côté Shell de Proxmox

Du côté de Proxmox, on va s'assurer de monter automatiquement l'iGPU à notre conteneur LXC afin de pouvoir profiter de QuickSync. Pour cela, lancez le shell de Proxmox, adaptez les valeurs requises, et copiez/collez le contenu suivant :

export LXC_ID=104 # CHANGEZ CETTE VALEUR PAR L'ID DE VOTRE CONTENEUR LXC
export LXC_GROUP=107 #CHANGEZ CETTE VALEUR PAR LA VALEUR NOTEE AU DESSUS
export ICPU_RENDER=renderD128 #CETTE VALEUR NE DEVRAIT PAS BOUGER...

echo "lxc.cgroup2.devices.allow: c 226:128 rwm" | tee -a "/etc/pve/lxc/${LXC_ID}.conf"
echo "lxc.hook.pre-start: sh -c \"chown 0:${LXC_GROUP} /dev/dri/${ICPU_RENDER}\"" | tee -a "/etc/pve/lxc/${LXC_ID}.conf"
Si vous regardez le conteneur modifié, vous devriez voir ceci...

Une fois terminé, vous pouvez redémarrer le conteneur LXC.

Côté Jellyfin

Dans le dashboard de Jellyfin, allez dans Playback. Sélectionnez "Intel QuickSync (QSV)", et cochez toutes les cases dans l'onglet "Hardware Decoding", comme sur la photo. Après tout notre serveur est suffisamment puissant pour encoder notre source vidéo.

Et c'est tout! Vous devriez être capable désormais de pouvoir regarder vos vidéos sans trop de problèmes (ni de freezes au passage)

Consommation électrique

En regardant avec ma prise connectée son wattage, je me rends compte qu'il passe d'environ 10 Watts (sa consommation en IDLE avec 3 VMs de lancés), à ~15W, voire 20W selon la vidéo regardée. Ce qui veut dire que vous n'êtes pas pour autant perdants au change, surtout suite à la hausse des prix de l’électricité! :)

Ce que j'ai chez moi. Les pics sont suites à d'autres services sur mon Proxmox.

Mise à jour:

  • 10/01/2024 : Mise à jour du tutorial pour corriger une commande importante qui a été oubliée, et ajout d'un court paragraphe si vous souhaitez monter un dossier dans un autre endroit!

Mots clés

Ch0wW

🌍 Entrez dans mon monde! Je poste du contenu en rapport avec les jeux retro, l'informatique, le modding et la réparation d'appareils... N'hésitez pas à me contacter pour toute question ou demande!