Jellyfin
Avec la montée en puissance du streaming de contenu multimédia, de plus en plus de personnes recherchent des moyens de créer leur propre serveur média personnel pour gérer leur collection de films, de séries TV et de musique. Jellyfin est une solution open source populaire qui vous permet de faire exactement cela.
Jellyfin : Le logiciel libre Emby Media Server Fork est annoncé après qu’Emby soit devenu propriétaire.
Préambule
Ici, je considère les points suivants comme étant présent :
- Proxmox PVE version 8 (minimum)
- VM Debian 12
- GPU Nvidia
Prérequis
Source: Jellyfin
La machine virtuelle utilisée pour cette stack dispose de 8 vCPUs et de 8 Go de RAM. Pensez à ajuster les ressources en conséquence en fonction des ressources de votre machine.
Si vous souhaitez bénéficier de l’accélération matérielle GPU sous Proxmox VE avec un GPU Nvidia c’est cet article qu’il faut lire.
Fichiers requis
Pensez à renseigner les vraies valeurs des variables comportant des ‘…’.
../_vm/common.yml
[Fichier]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
version: "3.0"
#
# updated: 2023-09-07
# stack: x-common
#
services:
x-common:
extends:
file: ./host.yml
service: x-host
init: true
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
../_vm/vm.yml
[Fichier]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
version: "3.0"
#
# updated: 2023-12-20
# stack: x-vm
#
services:
x-vm:
logging:
driver: loki
options:
loki-url: "http://${MASTER_HOST}:${VM_PORT_LOKI}/loki/api/v1/push"
loki-retries: "8"
loki-max-backoff: 800ms
loki-timeout: 1s
loki-batch-wait: 60s
loki-batch-size: "400"
no-file: "false"
keep-file: "true"
max-size: "32m"
max-file: "8"
#read_only: true
restart: unless-stopped
stop_grace_period: 5s
stdin_open: true
tty: true
user: ${VM_USER}:${VM_GROUP}
privileged: false
security_opt:
- no-new-privileges=true
ipc: "private"
cap_drop:
- ALL
cap_add:
- KILL
healthcheck:
interval: 60s
timeout: 10s
retries: 5
start_period: 60s
environment:
TZ: "Europe/Paris"
PUID: 1000
PGID: 1000
DOCKER_HOST: "tcp://${VM_HOST}:${VM_PORT_DOCKERPROXY}"
labels:
com.centurylinklabs.watchtower.enable: true
logging: "promtail"
com.vm.versionning: "${VM_VERSIONNING}"
com.stack.owner: "Olivier Le Bris"
com.stack.owner.email: "tech@zogg.fr"
com.stack.owner.url: "https://zogg.fr"
com.stack.name: "common"
com.stack.service.name: "common"
traefik.docker.network: traefik
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
deploy:
resources:
limits:
cpus: "1.0"
memory: 64M
pids: 64
tmpfs:
- /tmp:rw,size=64M
- /run:rw,exec,size=16M,mode=01777
- /var/log:rw,size=64M,mode=01777
- /var/cache:rw,size=64M,mode=01777
volumes:
- /etc/timezone:/etc/timezone:ro
# - /etc/localtime:/etc/localtime:ro
- /opt/docker/ssl:/ssl:ro
- /proc/cgroups:/cgroup:rw
#- /var/run/docker.sock:/var/run/docker.sock:rw
../_vm/host.yml
[Fichier]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: "3.0"
#
# updated: 2023-12-29
# stack: host
#
services:
x-host:
extends:
file: ./vm.yml
service: x-vm
dns:
- 1.1.1.1
- 8.8.8.8
- 1.0.0.1
- 8.8.4.4
extra_hosts:
- "vm.${VM_DOMAIN}:${VM_IP}"
docker-compose.yml
Pour cet article, j’ai utilisé l’accélération GPU NVidia.
[Fichier]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
version: "3.0"
#
# updated: 2024-01-07
# stack: jellyfin
#
#
# Test NVIDIA usage
# sudo docker exec -it jellyfin nvidia-smi
#
networks:
jellyfin:
name: jellyfin
driver: bridge
enable_ipv6: false
dockerproxy:
external: true
volumes:
nas-videos:
driver_opts:
type: "cifs"
o: username=${SAMBA_USERNAME},password=${SAMBA_PASSWORD},uid=911,gid=911,vers=3.1.1,rw
device: "//xxx.xxx.xxx.xxx/video"
x-hwaccel: &x-hwaccel
devices:
- /dev/nvidia-modeset:/dev/nvidia-modeset
- /dev/nvidia-caps:/dev/nvidia-caps
- /dev/nvidia-uvm:/dev/nvidia-uvm
- /dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools
- /dev/nvidiactl:/dev/nvidiactl
- /dev/nvidia0:/dev/nvidia0
environment:
NVIDIA_VISIBLE_DEVICES: "all"
NVIDIA_DRIVER_CAPABILITIES: "all"
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu,video,compute]
runtime: nvidia
group_add:
- '109' # render
- '44' # video
services:
jellyfin:
extends:
file: ../_common/host.yml
service: x-host
<<: *x-hwaccel
user: 0:0
cap_add:
- DAC_OVERRIDE
- SETUID
- SETGID
- CHOWN
- SYS_ADMIN
- AUDIT_CONTROL
- AUDIT_READ
- AUDIT_WRITE
- FOWNER
- NET_ADMIN
- MKNOD
security_opt:
- "seccomp:unconfined"
- "apparmor:unconfined"
container_name: jellyfin
hostname: jellyfin
image: lscr.io/linuxserver/jellyfin:latest
restart: "no"
ports:
- "${VM_PORT_JELLYFIN}:8096" # HTTP
- "8920:8920" # HTTPS
- "7359:7359/udp" # auto-discovery
- "1900:1900/udp" # auto-discovery
expose:
- "8096"
- "8920"
- "7359"
- "1900"
networks:
- jellyfin
- dockerproxy
healthcheck:
test: curl --fail http://0.0.0.0:8096/ || exit 1
environment:
PUID: 911
PGID: 911
JELLYFIN_PublishedServerUrl: "${VM_IP}"
labels:
com.stack.name: "jellyfin"
com.stack.service.name: "jellyfin"
tmpfs:
- /tmp:rw,noexec,nosuid,size=4G
- /config/log:rw,uid=911,gid=911,size=1G
- /config/data/transcodes:rw,uid=911,gid=911,size=4G
deploy:
resources:
limits:
cpus: "8.0"
memory: 6G
pids: 8192
volumes:
- ./conf/jellyfin:/config:rw
- ./conf/scripts:/scripts:ro
- nas-videos:/data/movies:rw
- nas-videos:/data/tvshows:rw
- nas-videos:/data/musicals:rw
- nas-videos:/data/musics:rw
sysctls:
net.core.somaxconn: 8192
net.ipv4.tcp_syncookies: 0
Vous pouvez spécifiez d’autres partages pour les bibliothèques tvshows/musicals/musics.
L’utilisateur utilisé pour les partages Samba a le couple uid/gid 911:911. Pensez à l’ajuster selon vos besoins.
Précisions
Il est possible d’utiliser Jellyfin sans accélération matérielle mais celà nécessite un CPU très puissant.
Dans cet article, j’utlise des volumes de stockages Samba déportés permettant de découpler la partie logicielle de la partie stockage des données.
Rien ne vous empêche de les ajouter afin de former un ensemble complet et indépendant.
L’accélération matérielle GPU est plus que conseillée :
Source: Jellyfin
Variables d’environnement
Les variables suivantes sont à renseigner soit dans un .env situé dans le même répertoire que le docker-compose.yml, soit dans un fichier d’environnement:
- SAMBA_USERNAME : le nom d’utilisateur de votre partage Samba
- SAMBA_PASSWORD : le mot de passe du partage
- VM_IP : l’adresse IP complète de la VM
1
2
env_file:
- ./conf/jellyfin/env/jellyfin.env
Utilisation
Après avoir créé le conteneur Jellyfin, vous pouvez accéder à son interface Web en ouvrant un navigateur et en saisissant l’adresse suivante :
1
http://votreadresseip:8096
Remplacez votreadresseip par l’adresse IP de votre serveur.
La première fois que vous accédez à l’interface Web, Jellyfin vous guidera à travers le processus de configuration, y compris la création d’un compte administrateur et la configuration de votre bibliothèque multimédia. Suivez les instructions à l’écran pour terminer la configuration.
Tips
Il éxiste un patch, sous Linux, pour supprime la restriction sur le nombre maximum de sessions simultanées d’encodage vidéo NVENC imposée par Nvidia aux GPU grand public :
NVENC and NvFBC patches for Nvidia drivers
Son utilisation est relativement simple :
1
2
git clone https://github.com/keylase/nvidia-patch
sudo bash ./patch.sh
Et pour annuler les modifications apportées:
1
sudo bash ./patch.sh -r
On peut difficilement faire plus simple !
TV Samsung
Si vous disposez d’une TV de marque Samsung, il est possible d’installer une application cliente native.
Il faut disposer d’un compte Samsung.
Source: Jellyfin for Tizen
Bien que cela dépasse le cadre de cet article, voici les étapes à suivre:
- Installer Git
- Installer Node.js
- Installer Samsung Tizen Studio
- Lancer Samsung Packages Manager puis installer
- Main SDK : Tizen SDK Tools
- Extension SDK : TV Extensions, Samsung Certificate Extension, TV Extension Tools
- Utiliser Certificate Manager afin de créer un certificat pour l’installation sur le TV
- Cloner Jellyfin Web
- Cloner Jellyfin Tizen
- Constuire Jellyfin Web
1 2 3
cd jellyfin-web npm ci --no-audit npm run build:production
- Constuire Jellyfin Tizen
1 2 3
cd jellyfin-tizen $env:JELLYFIN_WEB_DIR='../jellyfin-web/dist' npm ci --no-audit
- Constuire le paquet Tizen (wgt)
1 2
tizen build-web -e ".*" -e gulpfile.js -e README.md -e "node_modules/*" -e "package*.json" -e "yarn.lock" tizen package -t wgt -o . -- .buildResult
- Activer le mode développeur sur la TV
- Authoriser l’installation d’applications sur la TV depuis Device Manager from Tizen Studio
- Installer l’application
1
tizen install -n Jellyfin.wgt -t NAME_OF_TV_IN_DEVICE_MANAGER
Sources:
Applications
Conclusion
L’installation de Jellyfin sous Docker est un moyen efficace de mettre en place un serveur média personnel. En utilisant des conteneurs Docker, vous pouvez gérer facilement les dépendances de l’application et bénéficier de la flexibilité et de la portabilité. Avec Jellyfin, vous pouvez organiser et diffuser votre contenu multimédia en toute simplicité, offrant ainsi une expérience de streaming de haute qualité à partir de votre propre serveur. Profitez de votre bibliothèque multimédia avec Jellyfin et Docker !
Changelog
2024-01-07
- Mise à jour des composes hérités
- Mise à jour du docker-compose.yml
- Mise à jour de la partie accélération Nvidia
- Mise à jour de la partie samba (version Samba pour les partages)
- Ajout du patch NVENC & NvFBC pour Nvidia