
Monter un media center complet avec Jellyfin et la stack *arr
Pourquoi un media center auto-hébergé
Multiplier les abonnements pour regarder deux séries par mois finit par coûter cher, et chaque film regardé, chaque pause, chaque recherche est enregistré et monétisé. L'auto-hébergement rend le contrôle : pas d'abonnement qui augmente, pas de contenu qui disparaît du catalogue, et un partage familial sans limite de streams simultanés.
La stack décrite ici tourne sur un TerraMaster F4-424 sous Debian 13, de la recherche jusqu'au visionnage sur n'importe quel écran de la maison.
Jellyfin : le cœur du système
Jellyfin est un fork open-source d'Emby, sans feature derrière un paywall. Il gère films, séries, musique, photos, et la TV en direct avec un tuner.
Contrairement aux autres services Docker du NAS, Jellyfin tourne en host network mode : DLNA/SSDP, le protocole de découverte automatique sur le réseau, a besoin du multicast, que le bridge Docker gère mal. Sans ça, un client DLNA sur le LAN ne voit tout simplement pas le serveur.
# docker-compose.yml - Jellyfin
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
network_mode: host
environment:
- JELLYFIN_PublishedServerUrl=https://jellyfin.home.lan
volumes:
- /mnt/data/apps/jellyfin/config:/config
- /mnt/data/apps/jellyfin/cache:/cache
- /mnt/data/media/movies:/data/movies
- /mnt/data/media/tv:/data/tv
- /mnt/data/media/music:/data/music
restart: unless-stopped
L'interface web écoute sur le port 8096. Jellyfin supporte le hardware transcoding via Intel Quick Sync (QSV) grâce au GPU intégré du N95 : transcodage 4K HEVC en temps réel sans faire chauffer le CPU. Côté authentification, Jellyfin se connecte à Authelia en OIDC/SSO, avec des identifiants centralisés pour chaque membre de la famille.
La stack *arr
L'écosystème *arr automatise recherche, téléchargement et organisation. Chaque application a un rôle précis :
- Prowlarr (port 9696) centralise les indexeurs. Au lieu de configurer les mêmes sources dans Sonarr et Radarr, on les déclare une fois et Prowlarr synchronise automatiquement.
- Sonarr (8989) pour les séries et Radarr (7878) pour les films. On ajoute un titre, on définit un profil de qualité, et l'application surveille les flux RSS, récupère les nouveaux épisodes ou les meilleures versions disponibles, et renomme le tout selon une convention que Jellyfin comprend.
- Bazarr (6767) surveille les bibliothèques Sonarr/Radarr et télécharge les sous-titres manquants, en choisissant le meilleur match selon la version du fichier.
- qBittorrent est le client de téléchargement utilisé par Sonarr/Radarr : interface web sur le 8080, protocole BitTorrent sur le 6881.
- FlareSolverr (8191) agit comme proxy pour résoudre les challenges CloudFlare, indispensable pour certains indexeurs.
- Jellyseerr (5055) est la couche utilisateur : on cherche une série, on clique « Demander », et Sonarr/Radarr s'occupent du reste. Connecté à Authelia en OIDC.
Architecture réseau et stockage
Tous les services *arr tournent sur un réseau Docker isolé arr_net. Seuls Jellyfin (host network) et Jellyseerr (via reverse proxy) sont accessibles du LAN.
# docker-compose.yml - Sonarr + Radarr
services:
sonarr:
image: lscr.io/linuxserver/sonarr:latest
container_name: sonarr
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
volumes:
- /mnt/data/apps/arr/sonarr:/config
- /mnt/data/media/tv:/tv
- /mnt/data/downloads:/downloads
networks:
- arr_net
restart: unless-stopped
radarr:
image: lscr.io/linuxserver/radarr:latest
container_name: radarr
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
volumes:
- /mnt/data/apps/arr/radarr:/config
- /mnt/data/media/movies:/movies
- /mnt/data/downloads:/downloads
networks:
- arr_net
restart: unless-stopped
networks:
arr_net:
name: arr_net
Les images LinuxServer utilisent PUID/PGID (ici 1000:1000) pour que les permissions soient correctes sur les fichiers créés.
L'arborescence, point critique
/mnt/data/
├── apps/arr/
│ ├── sonarr/ # Config Sonarr
│ ├── radarr/ # Config Radarr
│ ├── prowlarr/ # Config Prowlarr
│ ├── bazarr/ # Config Bazarr
│ ├── qbittorrent/ # Config qBittorrent
│ └── jellyseerr/ # Config Jellyseerr
├── downloads/
│ ├── complete/ # Téléchargements finis
│ └── incomplete/ # En cours
└── media/
├── movies/ # Films organisés par Radarr
└── tv/ # Séries organisées par Sonarr
Le point essentiel : downloads et media doivent être sur le même filesystem. Sonarr et Radarr peuvent alors utiliser des hardlinks au lieu de copier — instantané, et sans duplication d'espace disque.
Le flux complet
- Jellyseerr : l'utilisateur cherche et demande un film
- Radarr : reçoit la requête, interroge les indexeurs via Prowlarr
- Prowlarr : envoie la recherche aux sources
- qBittorrent : télécharge dans
/mnt/data/downloads/complete - Radarr : détecte le fichier terminé, le renomme, crée un hardlink dans
/mnt/data/media/movies - Bazarr : détecte le nouveau film, télécharge les sous-titres
- Jellyfin : scanne la bibliothèque, le film est disponible
Du point de vue de l'utilisateur : un bouton cliqué, et le film apparaît quelques minutes plus tard. Aucune interface technique visible.
Bilan
La configuration initiale prend une bonne journée, mais l'ensemble tourne ensuite sans intervention, et Ansible gère le redéploiement. La stack *arr + Jellyfin atteint un niveau de service comparable au streaming commercial, sans abonnement et avec un contrôle total. Le N95 gère le transcoding hardware sans effort, et l'isolation réseau arr_net garde l'ensemble propre.
Série NAS Debian from scratch — Cet article fait partie d'une série complète sur la construction d'un NAS Debian.
Précédent : Accès distant sécurisé à son NAS avec Tailscale | Suivant : Gérer ses photos avec Immich en auto-hébergé
Articles similaires