Pourquoi Jellyfin en 2026
Le paysage des serveurs multimédia personnels a changé en quelques années. Plex a relevé le prix de son Lifetime Pass en 2025, puis l'a triplé le 1er juillet 2026 (de 249,99 à 749,99 dollars, hausse annoncée en mai 2026), rendant l'entrée coûteuse pour un usage familial. Emby, l'autre alternative historique, fonctionne lui aussi sur un modèle freemium — certaines fonctionnalités clés comme le transcodage matériel, le DVR ou le téléchargement hors ligne sur mobile sont réservées aux abonnés Emby Premiere.
Jellyfin est né en 2018 comme un fork d'Emby, précisément pour rester libre. La licence GPLv2 interdit toute re-fermeture du code — si un contributeur réintroduit du code propriétaire, les utilisateurs peuvent légalement bifurquer. C'est une garantie structurelle que n'offre ni Plex ni Emby.
Côté versions, la série 12.x a succédé à la 10.11 : la 12.0 est sortie le 8 septembre 2026, et la 12.4, publiée le 26 octobre 2026, est la dernière version stable constatée à la date de rédaction. Ce saut de version majeure a une conséquence pratique : une migration de la base de données, parfois très longue, traitée plus bas dans ce guide.
Du côté des fonctionnalités, Jellyfin couvre la quasi-totalité des usages grand public : streaming adaptatif, transcodage logiciel et matériel, applications natives iOS, Android, Android TV et Roku, gestion LiveTV et enregistrement DVR, sous-titres automatiques, authentification SSO via OIDC et LDAP, et un système de plugins qui étend l'application sans modifier le cœur.
Ce que Jellyfin propose
- Streaming DLNA et HLS — diffuse films, séries et musique vers tous vos appareils, y compris les TV sans application native.
- Applications officielles — iOS, Android, Android TV, Roku, Fire TV, Kodi ; une interface web responsive pour tout le reste.
- Transcodage à la volée — convertit le format source si l'appareil cible ne le supporte pas, en logiciel ou via GPU.
- LiveTV et enregistrement DVR — branchez un tuner USB ou une source IPTV pour regarder et enregistrer la télévision en direct.
- SSO OIDC et LDAP — intégrez votre annuaire existant ou un fournisseur d'identité comme Authentik ou Keycloak.
- Sous-titres automatiques — plugin OpenSubtitles, extraction des pistes embarquées, rendu WebVTT.
- Plugins étendus — intégrations LastFM, scrobbling, métadonnées musicales, trailers, gestion des collections.
- Absence totale de cloud propriétaire — aucune authentification via les serveurs Plex, aucune donnée de lecture envoyée à un tiers.
Prérequis chiffrés par cas d'usage
Les besoins varient considérablement selon ce que vous comptez faire.
SD et 1080p sans transcodage (direct play) : si vos appareils lisent nativement le codec source (H.264 ou H.265), Jellyfin ne transcode pas — il sert le fichier comme un serveur de fichiers intelligent. 2 vCPU et 2 Go de RAM suffisent largement, pour une bibliothèque de plusieurs centaines de titres. C'est le cas d'usage le plus courant sur VPS.
1080p avec transcodage logiciel : quand le client ne supporte pas le codec ou quand vous bridez le débit, Jellyfin encode à la volée. Un seul flux 1080p H.264 consomme 2 à 4 cœurs selon la résolution source. Visez 4 vCPU / 4 Go RAM minimum pour deux utilisateurs simultanés.
4K HDR avec transcodage logiciel : le HDR tone-mapping (conversion HDR→SDR pour les écrans sans HDR) est extrêmement gourmand. Un seul flux 4K HDR peut saturer 8 cœurs. Ce cas d'usage n'est pas adapté à un VPS cloud standard — préférez le direct play 4K (le client doit supporter HEVC/HDR) ou un serveur dédié avec GPU.
Transcodage matériel GPU (VAAPI/NVENC) : réduit fortement la charge CPU, mais requiert un accès au périphérique /dev/dri ou à une carte NVIDIA. Les VPS cloud standards n'exposent pas de GPU ; c'est une option réservée aux serveurs dédiés ou aux VPS GPU spécialisés.
Disque pour une montée de version : prévoyez de quoi stocker une copie complète du dossier de configuration (base de données comprise) à côté de l'original. La documentation de sauvegarde de Jellyfin exige au moins 5 Go libres pour une sauvegarde intégrée, et davantage si vous y incluez sous-titres et trickplay.
Installer Jellyfin sur VPS Ubuntu/Debian avec Docker Compose
Préparer le VPS et installer Docker
Connectez-vous en SSH à votre VPS (Ubuntu 22.04 ou Debian 12). Mettez à jour le système et installez Docker :
apt update && apt upgrade -ycurl -fsSL https://get.docker.com | shsystemctl enable --now dockerVérifiez que Docker fonctionne :
docker info. Faites cette mise à jour maintenant, sur un serveur encore vide : plus tard, sur une machine qui héberge Jellyfin installé par paquet, unapt upgradepeut redémarrer le service au pire moment (voir la section sur la montée de version).Créer l'arborescence de dossiers
Choisissez où stocker la configuration Jellyfin et vos médias :
mkdir -p /opt/jellyfin/{config,cache}mkdir -p /mnt/media/{films,series,musique}chown -R 1000:1000 /opt/jellyfin /mnt/mediaLe UID 1000 est celui que le fichier Compose ci-dessous donne au conteneur Jellyfin (paramètre
user, optionnel d'après la documentation : sans lui, le conteneur tourne en root).Écrire le fichier docker-compose.yml
Créez
/opt/jellyfin/docker-compose.yml. Sousservices:puisjellyfin:(indentation YAML de deux espaces par niveau), placez ces lignes :image: jellyfin/jellyfin:12.4container_name: jellyfinuser: "1000:1000"ports:puis, en dessous,- "127.0.0.1:8096:8096"restart: unless-stoppedvolumes:puis, en dessous,- /opt/jellyfin/config:/config,- /opt/jellyfin/cache:/cacheet- /mnt/media:/media:roenvironment:puis, en dessous,- JELLYFIN_PublishedServerUrl=https://jellyfin.votre-domaine.comN'écrivez pas
latest. D'après la documentation officielle, ce tag « suit toujours la dernière version stable, y compris à travers les montées de version majeure et mineure » : un simpledocker compose pullsuffit alors à déclencher une migration de base que vous n'avez pas préparée. Épinglez une version — un tagX.Y(comme12.4) suit les correctifs de cette branche, un tagX.Y.Zfige une version exacte. Vérifiez le tag courant sur le dépôt d'images avant de recopier12.4.Le port n'est publié que sur
127.0.0.1: seul nginx, sur la même machine, y accède, et Jellyfin n'est pas joignable en HTTP clair sur l'IP publique. Le modenetwork_mode: hostn'est nécessaire qu'à la découverte DLNA, d'après la documentation ; DLNA ne sert que sur un réseau local, et sur un VPS ce mode exposerait le port 8096 sur toutes les interfaces.Démarrer le container
cd /opt/jellyfindocker compose up -ddocker compose logs -fJellyfin écoute sur le port 8096. Attendez la ligne
Startup completedans les logs avant de passer à la suite.Configurer nginx comme reverse proxy
Installez nginx et certbot :
apt install -y nginx certbot python3-certbot-nginxCréez
/etc/nginx/sites-available/jellyfinavec un seul blocserver, en port 80 :listen 80;,server_name jellyfin.votre-domaine.com;, puis, danslocation / {,proxy_pass http://localhost:8096;, les en-têtesproxy_set_header Host $host;,proxy_set_header X-Real-IP $remote_addr;,proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;etproxy_set_header X-Forwarded-Proto $scheme;, puis, pour les WebSockets,proxy_http_version 1.1;,proxy_set_header Upgrade $http_upgrade;etproxy_set_header Connection "upgrade";. N'écrivez pas encore de bloc 443 : ses lignesssl_certificatedésigneraient des fichiers qui n'existent pas avant le passage de certbot, et nginx refuserait de charger la configuration.Activez le site, vérifiez-le, puis obtenez le certificat :
ln -s /etc/nginx/sites-available/jellyfin /etc/nginx/sites-enabled/nginx -t && systemctl reload nginxcertbot --nginx -d jellyfin.votre-domaine.comLe plugin nginx de certbot obtient le certificat, le range dans
/etc/letsencrypt/live/jellyfin.votre-domaine.com/(fullchain.pemetprivkey.pem), puis l'installe : il ajoute lui-même au bloc l'écoute 443 et les lignesssl_certificateetssl_certificate_key, et la redirection de HTTP vers HTTPS, active par défaut. Contrôlez le résultat avecnginx -t.Si vous préférez
certbot certonly --nginx -d jellyfin.votre-domaine.com, qui obtient le certificat sans toucher à la configuration, écrivez ensuite vous-même le bloc 443 :listen 443 ssl;, le mêmeserver_name,ssl_certificate /etc/letsencrypt/live/jellyfin.votre-domaine.com/fullchain.pem;,ssl_certificate_key /etc/letsencrypt/live/jellyfin.votre-domaine.com/privkey.pem;et la mêmelocation /. Remplacez alors lelocation /du bloc 80 parreturn 301 https://$host$request_uri;, puisnginx -t && systemctl reload nginx.Assistant de configuration initial
Ouvrez
https://jellyfin.votre-domaine.comdans votre navigateur. L'assistant vous guide à travers :1. Créer le compte administrateur
2. Ajouter votre bibliothèque (pointez vers/media/films,/media/series)
3. Choisir la langue et les agents de métadonnées (TheMovieDB pour les films, TheTVDB pour les séries)Lancez un scan complet une fois la configuration terminée : Tableau de bord > Bibliothèques > Scanner toutes les bibliothèques.
Plugins introuvables — vérifier le dépôt
C'est l'une des questions les plus posées après une montée de version : le catalogue de plugins est vide, ou chaque plugin affiche « An error occurred while getting the plugin details from the repository », alors que l'instance fonctionne par ailleurs.
Ce que dit l'amont. L'issue GitHub #16654 (« No longer access plugins », signalée sur la version 10.11.8) décrit cette erreur alors que les URL de dépôt du rapporteur étaient correctes. Elle a été fermée sans correctif (« not planned ») par un robot, faute d'activité. Un contributeur y suggère que certains pays bloquent raw.githubusercontent.com, qui héberge plusieurs manifestes de plugins tiers ; un utilisateur rapporte avoir résolu son cas en désinstallant les plugins, en redémarrant, puis en les réinstallant. Aucune cause unique n'est établie : l'ancienne explication de ce guide, un changement d'URL entre deux versions, n'est pas ce que dit l'issue et a été retirée.
Vérifications, dans l'ordre :
1. Allez dans Tableau de bord > Plugins > Dépôts. Le dépôt officiel stable doit pointer vers https://repo.jellyfin.org/files/plugin/manifest.json. Si vous aviez basculé sur le dépôt « unstable », revenez au stable
2. Depuis le VPS, vérifiez que le manifeste répond : curl -sI https://repo.jellyfin.org/files/plugin/manifest.json. Pour un dépôt tiers hébergé sur GitHub, testez aussi curl -sI https://raw.githubusercontent.com
3. Cliquez sur « Enregistrer », puis redémarrez Jellyfin pour forcer le rechargement des métadonnées : docker compose -f /opt/jellyfin/docker-compose.yml restart
4. En dernier recours, désinstallez les plugins concernés, redémarrez, réinstallez-les, redémarrez de nouveau
Stratégie de stockage pour Jellyfin sur VPS
Le stockage est souvent la contrainte principale. Les ordres de grandeur à connaître (estimations standard) :
- Film 1080p MKV H.264 : 5 à 15 Go selon la durée et le débit
- Film 4K HDR H.265 : 15 à 60 Go, voire plus pour les remasters Blu-ray
- Épisode de série 1080p : 1 à 4 Go
Exemple de calcul : 100 films 1080p × 8 Go (moyenne) = 800 Go minimum. Pour une médiathèque de 300 films mixtes + 10 séries complètes, comptez 3 à 5 To.
Option 1 — Volume additionnel VPS (recommandé pour commencer) : la plupart des fournisseurs VPS proposent des volumes de blocs (Block Storage) montables à chaud, facturés au Go/mois. Montez-le en ext4 sur /mnt/media et passez-le en bind mount dans Docker. Avantage : I/O direct sur disque local, sans transit réseau. Inconvénient : coût linéaire avec la taille.
Après l'attachement du volume (ici /dev/sdb) :
mkfs.ext4 /dev/sdbmount /dev/sdb /mnt/mediaecho '/dev/sdb /mnt/media ext4 defaults 0 2' >> /etc/fstab
Option 2 — Hetzner Storage Box (CIFS/Samba) : solution hybride — votre VPS reste léger, le stockage vit sur la Storage Box. Montez-la via CIFS :
apt install -y cifs-utilsinstall -m 600 /dev/null /root/.storagebox-credentials, puis écrivez-y deux lignes : username=uXXXXXX et password=…mount -t cifs //uXXXXXX.your-storagebox.de/backup /mnt/media -o seal,credentials=/root/.storagebox-credentials,uid=1000,gid=1000,iocharset=utf8
Le fichier d'identifiants évite que le mot de passe reste dans l'historique du shell et la liste des processus ; l'option seal chiffre la connexion SMB, qui ne l'est pas forcément d'office. Activez d'abord SMB dans la console Hetzner, et l'accessibilité externe si votre VPS n'est pas chez Hetzner.
La latence réseau est acceptable pour le streaming pré-bufferisé (Jellyfin lit à l'avance), mais inadaptée au transcodage en direct — le débit CIFS ne suit pas.
Option 3 — NAS local avec tunnel Tailscale ou Cloudflare Tunnel : si vous disposez déjà d'un NAS domestique, vous pouvez y exposer votre bibliothèque vers un VPS distant via un tunnel chiffré. Tailscale crée un réseau privé virtuel entre votre NAS et votre VPS en moins de dix minutes. Le streaming passe ensuite de votre NAS → VPS → utilisateur, avec une latence maîtrisée. Réservez cette option aux bibliothèques très volumineuses déjà constituées.
Seuil de rentabilité : comparez le prix au To de votre volume de blocs et celui d'une Storage Box sur les grilles tarifaires en vigueur chez le fournisseur. Au-delà de 500 Go, le stockage externe revient souvent moins cher, à condition d'accepter la latence réseau.
Transcodage matériel — VAAPI et NVENC
Le transcodage logiciel convient à une ou deux sessions simultanées sur un bon VPS. Au-delà, ou pour du 4K HDR régulier, le transcodage matériel est indispensable.
VAAPI (Intel/AMD) : sur un serveur dédié avec GPU Intel intégré ou GPU AMD, le périphérique /dev/dri/renderD128 expose l'encodeur. Ajoutez au service Docker les lignes devices: puis - /dev/dri/renderD128:/dev/dri/renderD128, et group_add: avec l'identifiant du groupe render de l'hôte (getent group render | cut -d: -f3).
Activez ensuite l'accélération matérielle dans Tableau de bord > Lecture > Transcodage : choisissez QSV (Intel Quick Sync, à préférer sur les GPU Intel récents sous Linux) ou VA-API (GPU AMD, anciens GPU Intel).
NVENC (NVIDIA) : requiert sur l'hôte le pilote NVIDIA et le NVIDIA Container Toolkit (l'ancien paquet nvidia-docker2 est obsolète). Ajoutez au service un bloc deploy: > resources: > reservations: > devices: contenant - driver: nvidia, count: 1 et capabilities: [gpu].
Rappel : les VPS cloud standards n'exposent pas de GPU ou de device /dev/dri. Ce mode est réservé aux serveurs dédiés avec carte graphique ou processeur avec GPU intégré accessible.
Limitez la charge pour éviter la saturation : Jellyfin n'a pas de plafond global de transcodages, mais vous pouvez fixer, pour chaque utilisateur, un nombre maximal de sessions simultanées (Tableau de bord > Utilisateurs > profil de l'utilisateur) et brider le débit des clients distants dans les réglages de lecture. Sur un VPS de 4 vCPU, visez 2 ou 3 transcodages simultanés au plus — au-delà, les autres utilisateurs subissent une dégradation perceptible.
Monter vers une version majeure : ce que Jellyfin 12 impose
Passer de la 10.11 à la 12.x n'est pas une mise à jour de routine. Les notes de version de la 12.0 (8 septembre 2026) fixent le cadre :
Chemins de montée. On peut monter directement depuis la 10.10.7 ou n'importe quelle 10.11.x, sans étape intermédiaire. Une version antérieure à la 10.10.7 doit d'abord passer par la 10.10.7.
Sauvegarde. Les notes recommandent « fortement » une sauvegarde complète du dossier de données, parce que revenir en arrière suppose une restauration complète. La documentation de sauvegarde le confirme : Jellyfin n'a pas de mécanisme de rétrogradation.
Durée. La migration vérifie les chemins de tous les éléments de la bibliothèque, ce qui peut prendre du temps selon sa taille, et le premier scan de bibliothèque sera bien plus long que d'habitude.
Effets de bord annoncés. Les versions alternatives résolues automatiquement (non fusionnées à la main) sont supprimées et reviennent après un scan complet ; certains films peuvent apparaître comme nouvellement ajoutés ; des noms d'utilisateur qui ne diffèrent que par la casse doivent être corrigés avant la montée ; les routes héritées /emby/* et /mediabrowser/* disparaissent, ce qui peut casser d'anciens clients tiers ; l'autorisation héritée est désactivée ; les réglages de sous-titres globaux sont remplacés par des réglages par bibliothèque.
Ces points sont tirés des notes de la 12.0 et valent pour la 12.0 ; relisez les notes de la version que vous visez.
Procédure durable pour monter de version sans perdre sa bibliothèque
Lire les notes de version et vérifier le chemin de montée
Ouvrez la page de la version cible sur le dépôt GitHub de Jellyfin et lisez ses « upgrade notes ». Repérez votre version actuelle (
docker compose imagesou le tableau de bord). Si elle est antérieure à la 10.10.7, passez d'abord par la 10.10.7. Retirez les plugins issus de dépôts tiers avant la migration, comme le demandent les notes de la 12.0.Empêcher toute mise à jour automatique
Une migration interrompue est la cause documentée du pire cas (voir la section suivante). Désactivez donc tout ce qui peut redémarrer ou remplacer le service sans vous :
- Docker : épinglez le tag dans
docker-compose.yml(jamaislatest) et coupez Watchtower ou toute tâche qui lancedocker compose pull
- Paquets Debian/Ubuntu : listez les paquets avecdpkg -l | grep -i jellyfin, gelez-les avecapt-mark hold <paquet>, et vérifiez avecapt-mark showhold. Un paquet gelé n'est plus mis à jour parapt upgradeni parunattended-upgrades
- Évitez aussi de lancerapt upgradesur la machine pendant que la migration tourne, même pour d'autres paquets, tant que vous n'avez pas confirmé le comportement de votre distributionArrêter Jellyfin et copier le dossier de données
Une copie à chaud d'une base ouverte peut être inutilisable : la documentation précise que, pour une sauvegarde manuelle, le serveur doit être arrêté, sinon la base risque d'être verrouillée et irrécupérable à la restauration.
cd /opt/jellyfindocker compose stopdf -h /optetdu -sh /opt/jellyfin/configpour vérifier la placecp -a /opt/jellyfin /opt/jellyfin.avant-monteeSi votre configuration vit dans un volume nommé (c'est le cas du modèle du catalogue ServOrbit, qui monte
jellyfin-datasur/config), copiez le volume après avoir vérifié son nom avecdocker volume ls:docker run --rm -v jellyfin-data:/source:ro -v /root/jellyfin-avant:/copie alpine cp -a /source/. /copie/.La sauvegarde intégrée (Tableau de bord > Sauvegardes) est une alternative, mais elle ne remplace pas une copie du dossier quand la migration elle-même est le risque.
Changer le tag et démarrer
Modifiez la ligne
image:dedocker-compose.ymlvers la version visée, puis :docker compose pulldocker compose up -dLe serveur lance les migrations au démarrage, avant d'accepter les connexions. Tant qu'elles tournent, la sonde de santé répète « Server is still starting up. ».
Surveiller sans toucher à rien
docker compose logs -faffiche la migration en cours, numérotée (par exemple « 1 of 21 »). Dans un second terminal,docker statsmontre la charge. Ne redémarrez pas le conteneur et ne relancez pas la commandeuppendant qu'une migration tourne : c'est le geste qui a bloqué des bases dans l'issue #18066. Notez querestart: unless-stoppedrelance aussi un conteneur tué (manque de mémoire, par exemple) en pleine migration : si le journal montre des démarrages répétés, arrêtez-le vous-même avecdocker compose stopet diagnostiquez avant de reprendre.Décider : patienter ou restaurer
Une migration lente consomme du CPU ou du disque ; une migration bloquée est inerte. Les rapports de l'issue #18066 donnent des ordres de grandeur : un cœur à 100 % pendant plus de deux heures sur une base de plus de 3 Go avant qu'un correctif n'existe, une montée complète d'environ deux heures chez un autre, une réussite après une nuit d'attente chez un troisième ; à l'inverse, 0 % de CPU, aucune E/S disque et des threads au repos chez ceux dont la migration était réellement bloquée. Patientez tant que le CPU ou le disque travaillent et que le compteur avance. Si tout est inerte depuis longtemps, ou si le journal ne bouge plus, restaurez.
Restaurer la copie si le processus est inerte
docker compose downmv /opt/jellyfin /opt/jellyfin.bloquecp -a /opt/jellyfin.avant-montee /opt/jellyfinRemettez dans
docker-compose.ymll'ancien tag exact, puisdocker compose up -d. N'essayez pas de rétrograder la base en place : Jellyfin n'a pas de mécanisme de rétrogradation. Quand la montée réussit, lancez un scan complet des bibliothèques, réinstallez les plugins retirés, et ne supprimez les copies qu'après quelques jours d'usage normal.
Migration qui ne finit jamais : l'état réel de l'issue #18066
Le symptôme. L'issue jellyfin/jellyfin #18066, « Migration ChangeOwnerIdToGuid never completes and keeps one CPU core at 100% », a été ouverte le 15 septembre 2026 sur une montée de la 10.11.11 vers la 12.1.0. Le rapporteur décrit un thread .NET à environ 100 % d'un cœur pendant plus de deux heures, une base jellyfin.db d'environ 3,2 à 3,5 Go et quelque 311 000 éléments, avec presque aucune écriture disque et aucune erreur dans le journal.
Deuxième cas : le redémarrage par apt upgrade. Un autre utilisateur rapporte qu'un apt upgrade a redémarré le service en pleine migration ; tous les démarrages suivants sont restés bloqués sur la migration AddForeignKeyToOwnerId, à 0 % de CPU, sans E/S ni écriture. Il note aussi qu'un fichier systemd local limitant le délai de démarrage (TimeoutSec = 15) tuait les migrations. Il a restauré la sauvegarde que Jellyfin crée avant de migrer (dossier data/SQLiteBackups/) : la 12.2 a alors rejoué les migrations en environ cinq minutes.
Ce qui a marché, ce qui n'a pas marché. Des utilisateurs ont réussi après avoir laissé tourner la migration toute une nuit, d'autres après avoir restauré une copie d'avant migration ou réinstallé Jellyfin ; certains sont revenus à la 10.11.11 en attendant. Des blocages persistent sur la 12.2 chez au moins deux d'entre eux, tandis qu'au moins cinq y signalent une montée réussie.
Le correctif amont. La pull request #18073, « Fix ChangeOwnerIdToGuid migration performance », a été fusionnée le 26 septembre 2026 dans la branche 12.z (jalon v12.2) puis rétroportée le 27 septembre. Elle traite deux lenteurs : une vérification de collisions qui parcourait toute la table UserData pour chaque ligne factice, et sept index construits sur une table de plusieurs gigaoctets puis aussitôt détruits quand SQLite reconstruit la table pour ajouter la clé étrangère.
L'état au 7 novembre 2026. L'issue est toujours ouverte (étiquette bug), sans analyse de cause racine d'un mainteneur dans le fil visible ; le dernier commentaire date du 17 octobre. Les versions 12.0, 12.1, 12.2, 12.3 et 12.4 existent (la 12.4 du 26 octobre est la plus récente) : visez la dernière 12.x plutôt que la 12.0 ou la 12.1, publiées avant la fusion de ce correctif de performance.
Lecture prudente : le correctif réduit le temps de migration, il ne garantit pas que chaque base se termine, et rien ne dispense de la copie préalable. Un cas distinct du fil, des processus à 100 % après la connexion d'un utilisateur, a été rattaché par son auteur à des statistiques SQLite périmées (sqlite_stat1) et résolu par ANALYZE ; ce lien avec la migration n'est pas confirmé.
Dépannage — erreurs fréquentes
Bibliothèque vide après scan : vérifiez que le bind mount Docker est correct et que les permissions correspondent. Le container tourne en UID 1000 ; si vos fichiers appartiennent à root, Jellyfin ne peut pas les lire : chown -R 1000:1000 /mnt/media.
HTTPS cassé derrière nginx : si l'interface charge en HTTP alors que vous avez configuré HTTPS, vérifiez que les en-têtes X-Forwarded-Proto et X-Real-IP sont bien transmis dans la configuration nginx. Sans eux, Jellyfin génère des URLs en HTTP dans ses réponses.
Transcodage lent ou erreur VAAPI : confirmez que le container a accès au device avec docker exec jellyfin ls /dev/dri. Si le dossier est absent, le device n'est pas passé dans docker-compose.yml, ou votre VPS ne l'expose pas.
Applications mobiles refusent de se connecter : vérifiez que votre certificat TLS est valide et non auto-signé. Les clients Jellyfin iOS et Android rejettent les certificats auto-signés sans configuration supplémentaire. Si vous utilisez Let's Encrypt, assurez-vous que le renouvellement automatique (certbot renew) est actif : systemctl status certbot.timer.
Plugins installés mais inactifs après redémarrage : certains plugins requièrent un redémarrage COMPLET de Jellyfin (pas un rechargement de configuration) pour s'activer. Utilisez docker compose restart plutôt que l'option de redémarrage depuis l'interface si le problème persiste.
« Server is still starting up. » en boucle après une montée de version : une migration de base est en cours ou bloquée. Ne redémarrez pas. Regardez le compteur de migration dans docker compose logs, la charge avec docker stats, puis appliquez la décision patienter ou restaurer décrite plus haut.
Un ancien client ne se connecte plus après la 12.0 : les routes /emby/* et /mediabrowser/* ont été retirées. Mettez à jour le client ou changez-en.
Déployer Jellyfin depuis le Marketplace ServOrbit
Si vous préférez une installation préconfigurée plutôt que de gérer Docker manuellement, Jellyfin est disponible dans le Marketplace ServOrbit. L'installation crée automatiquement le container et, dès que vous rattachez un domaine à l'application depuis l'espace client, installe le vhost nginx et le certificat TLS. Vous récupérez un Jellyfin prêt à l'emploi, avec l'assistant de configuration au premier accès ; le stockage des médias (volume additionnel, Storage Box) reste à monter vous-même, comme décrit plus haut.
Le VPS reste entièrement sous votre contrôle : vous pouvez vous connecter en SSH, modifier docker-compose.yml, ajouter des volumes ou migrer vers une autre infrastructure à tout moment.
Attention à une particularité du modèle : au 7 novembre 2026, il référence l'image jellyfin/jellyfin:latest et monte le volume jellyfin-data sur /config. Après le déploiement, épinglez vous-même le tag de l'image sur la version que vous avez choisie, puis suivez la procédure de montée de version ci-dessus avant tout changement. Ce guide est fourni sans prise en charge de votre installation.