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) :
- Tableau de bord → Bibliothèques → + Ajouter une bibliothèque
- 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
- Type Films → dossier
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 execpour 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:8096dans la configuration Caddy (voir Caddy).
Conclusion¶
Une installation Jellyfin native (sans Docker) reste légère et simple à maintenir. Pour aller plus loin :
- Partager un volume de médias avec FileBrowser plutôt que d'utiliser un disque dédié
- Connecter Jellyfin à Authentik en SSO