Skip to content

Installer Jellyfin en conteneur LXC sur Proxmox

Guide d'installation manuelle, étape par étape, de Jellyfin en conteneur LXC Proxmox, installation native via le dépôt apt officiel (pas de Docker).

Pour la version Docker Compose classique, voir Jellyfin (Docker). Pour partager un volume de médias avec FileBrowser plutôt que d'utiliser un disque dédié, et pour connecter l'authentification SSO, voir les procédures en bas de page.


Prérequis

  • Un hôte Proxmox VE avec accès pct
  • Un pool de stockage local-lvm

Valeurs d'exemple utilisées dans ce guide :

Paramètre Valeur d'exemple
ID du conteneur Jellyfin 205
IP fixe 192.168.1.205/24
RAM 2048 Mo (minimum recommandé avec transcodage)
Port interne 8096
IP du reverse proxy Caddy 192.168.1.200 (voir Caddy)

1⃣ Création du conteneur LXC

pveam update
pveam available | grep debian-12-standard
pveam download local debian-12-standard_12.7-1_amd64.tar.zst

pct create 205 local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst \
    --hostname jellyfin.votre-domaine.tld \
    --memory 2048 \
    --swap 512 \
    --cores 4 \
    --rootfs local-lvm:16 \
    --net0 name=eth0,bridge=vmbr0,ip=192.168.1.205/24,gw=192.168.1.1 \
    --unprivileged 1 \
    --features nesting=1 \
    --onboot 1

pct start 205

Le disque système (16 Go) ne contient que l'OS, la configuration et les métadonnées Jellyfin (miniatures, base SQLite) — prévoir un point de montage séparé (--mp0) pour les médias, ou voir la procédure de stockage partagé en bas de page pour un volume mutualisé avec FileBrowser.


2⃣ Installation de Jellyfin via le dépôt officiel

pct exec 205 -- apt-get update -qq
pct exec 205 -- apt-get install -y --no-install-recommends \
    curl wget gnupg apt-transport-https ca-certificates nftables

pct exec 205 -- bash -c "
    mkdir -p /etc/apt/keyrings
    curl -fsSL https://repo.jellyfin.org/debian/jellyfin_team.gpg.key \
        | gpg --dearmor -o /etc/apt/keyrings/jellyfin.gpg
    echo 'deb [arch=amd64 signed-by=/etc/apt/keyrings/jellyfin.gpg] https://repo.jellyfin.org/debian bookworm main' \
        > /etc/apt/sources.list.d/jellyfin.list
"

pct exec 205 -- apt-get update -qq
pct exec 205 -- apt-get install -y jellyfin

Le paquet crée automatiquement l'utilisateur système jellyfin, le service jellyfin.service et les répertoires /var/lib/jellyfin, /var/cache/jellyfin, /etc/jellyfin.

pct exec 205 -- systemctl enable --now jellyfin

3⃣ Restriction réseau (nftables)

Jellyfin n'écoute en clair (HTTP, port 8096) que sur le réseau interne. On restreint l'accès au seul reverse proxy (Caddy) — le TLS et l'exposition publique sont gérés en amont :

pct exec 205 -- bash -c "
    nft add table inet filter
    nft add chain inet filter input '{ type filter hook input priority 0; policy accept; }'
    nft add rule inet filter input iifname lo accept
    nft add rule inet filter input tcp dport 8096 ip saddr != 192.168.1.200 drop
    nft list ruleset > /etc/nftables.conf
    systemctl enable nftables
"

4⃣ Création des bibliothèques

Prérequis : un dossier de médias accessible dans le conteneur sous /data (disque dédié bind-monté via --mp0, ou volume mutualisé avec FileBrowser — voir la procédure de stockage partagé en bas de page).

Depuis l'interface web (http://192.168.1.205:8096, accessible en réseau local avant mise en place du reverse proxy) :

  1. Tableau de bordBibliothèques+ Ajouter une bibliothèque
  2. Une bibliothèque par type de contenu, pointant vers le sous-dossier correspondant :
    • Type Films → dossier /data/films
    • Type Séries → dossier /data/series
    • Type Musique → dossier /data/musique

Ne pas interrompre le scan initial

Si le conteneur est redémarré (ou le service Jellyfin arrêté) pendant le scan initial d'une bibliothèque nouvellement créée, celle-ci peut se retrouver dans un état incohérent : la configuration existe (/var/lib/jellyfin/root/default/<Nom>/options.xml + .mblink) mais l'entrée correspondante n'est jamais écrite dans BaseItems (base SQLite /var/lib/jellyfin/data/jellyfin.db). Résultat, en tentant d'éditer ou de scanner la bibliothèque :

"La bibliothèque est dans un état invalide et ne peut pas être modifiée. Vous rencontrez probablement un bug : le chemin dans la base de données n'est pas le bon chemin sur le système de fichiers."

Correction : arrêter Jellyfin, supprimer le dossier de config incomplet (rm -rf "/var/lib/jellyfin/root/default/<Nom>" — sans toucher aux fichiers médias réels), redémarrer, puis recréer la bibliothèque en laissant le scan se terminer sans interruption.


⚙️ Points d'administration importants

  • Ne jamais modifier jellyfin.db (SQLite) pendant que le service tourne. Passer systématiquement par l'API REST pour toute modification (policy utilisateur, configuration, bibliothèques) — les écritures directes sur la base risquent la corruption ou un état incohérent avec le process en mémoire.
  • Doublons de fichiers médias : Jellyfin affiche un item par fichier, sans déduplication. Un même film copié deux fois sous des noms différents dans le même dossier apparaît deux fois dans l'interface. Détection rapide par taille + MD5 :
    find /data/films -type f \( -iname "*.avi" -o -iname "*.mkv" -o -iname "*.mp4" \) -printf "%s\t%p\n" \
        | sort -n | awk -F'\t' '{print $1}' | uniq -d
    
  • Sauvegarder /var/lib/jellyfin/data/jellyfin.db (comptes, bibliothèques, progression de lecture) et /var/lib/jellyfin/root/default/ (config des bibliothèques) régulièrement — ce sont les seuls éléments non reconstructibles automatiquement. Les médias eux-mêmes sont sur leur propre volume, à sauvegarder séparément.
  • Logs : pct exec 205 -- journalctl -u jellyfin -f. Les échecs d'authentification SSO ou de scan de bibliothèque y apparaissent explicitement (ex : Authentication request for <user> has been denied).
  • nftables bloque tout accès direct au port 8096 sauf depuis l'IP de Caddy — utile de le garder à l'esprit en cas de debug direct depuis une autre machine du réseau local (utiliser pct exec pour tester en local dans le conteneur).
  • Exposition externe : ce guide ne couvre que l'accès interne (HTTP, réseau local). Pour un accès public en HTTPS, ajouter un bloc reverse_proxy 192.168.1.205:8096 dans la configuration Caddy (voir Caddy).

Conclusion

Une installation Jellyfin native (sans Docker) reste légère et simple à maintenir. Pour aller plus loin :