Monter un media center complet avec Jellyfin et la stack *arr
- Publié le
- ·6 min de lecture
Pourquoi un media center auto-hébergé ?
C'est devenu fou. Netflix, Disney+, Prime Video, Paramount+, Apple TV+... à un moment donné tu te dis : mais pourquoi je paye 6 abos différents pour regarder 2 séries par mois ? Et puis il y a l'aspect surveillance : chaque film que tu regardes, chaque pause, chaque recherche - tout est enregistré, tracé, monétisé. Pas cool.
L'alternative? Auto-héberger son media center. Tu récupères le contrôle total. Pas d'abonnement qui augmente tous les 6 mois, pas de contenu qui disparaît du catalogue du jour au lendemain, et surtout, tu peux partager ta bibli avec toute la famille sans te soucier des limites de streams simultanés. Ma conjointe peut regarder une série, les enfants un dessin animé, et moi des documentaires en même temps. Zéro limite.
Sur mon TerraMaster F4-424 qui tourne sous Debian 13, j'ai construit une stack complète. De la recherche jusqu'au visionnage sur n'importe quel écran de la maison. Ça a pris du temps à mettre en place, honnêtement, mais maintenant c'est du feu et j'oublie que ça tourne.
Jellyfin : le coeur du système
Jellyfin, c'est un fork open-source d'Emby. Rien de verrouillé, zéro feature derrière une paywall. Il gère tout : films, séries, musique, photos, et même la TV en direct si tu as un tuner HDMI.
Contrairement aux autres services Docker du NAS, Jellyfin tourne en host network mode. Pourquoi? Parce que DLNA/SSDP - le protocole pour la découverte auto sur le réseau - ça a besoin du multicast, et le bridge Docker, ça ne joue pas bien avec ça. C'est un truc technique mais c'est important, sinon tu vois pas ton serveur Jellyfin quand tu branches une vieille Freebox Revolution en client DLNA.
# 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, c'est le port 8096. Et là c'est sympa : Jellyfin supporte le hardware transcoding via Intel Quick Sync (QSV) grâce au GPU intégré du N95. Donc tu peux transcoder un flux 4K HEVC en temps réel sans que le CPU chauffe. Première fois que j'ai testé ça, j'ai cru que c'était pas possible.
Authentification ? Jellyfin connecté à mon instance Authelia en OIDC/SSO. Chaque membre de la famille se connecte avec ses identifiants centralisés. Fin de l'histoire.
La stack *arr : c'est là que ça devient fun
Bon, le vrai truc puissant, c'est l'écosystème *arr. Une série d'applis qui automatisent TOUT : la recherche, le téléchargement, l'organisation. Chacune a un rôle spécifique.
Prowlarr : le cerveau des indexeurs
Prowlarr, c'est centralisé les indexeurs (les sources). Au lieu de configurer les mêmes truc dans Sonarr ET Radarr, tu les déclares une fois ici et Prowlarr sync auto avec les autres. Simple. Port 9696.
Sonarr et Radarr : l'automate qui ne dort jamais
Sonarr pour les séries, Radarr pour les films. Tu ajoutes un titre, tu dis "je veux du 1080p", et l'appli se charge du reste. Elle regarde les flux RSS, grab les nouveaux épisodes ou les meilleures versions dispo, renomme tout selon une convention que Jellyfin comprend. C'est magique, franchement.
- Sonarr : port 8989
- Radarr : port 7878
J'ai passé 3h à configurer les profils de qualité la première fois. Après? Plus rien à toucher.
Bazarr : les sous-titres (vraiment utile)
Bazarr regarde les bibli Sonarr/Radarr et télécharge les sous-titres qui manquent. Plusieurs sources, il choisit le meilleur match selon la version du fichier. Port 6767, et ça marche du tonnerre.
qBittorrent : le client de téléchargement
Voilà le client que Sonarr/Radarr utilisent pour télécharger. Interface web sur le port 8080, protocole BitTorrent sur le 6881.
FlareSolverr : pour contourner CloudFlare
Certains indexeurs sont derrière CloudFlare. FlareSolverr agit comme proxy pour résoudre les challenges. Port 8191. Essentiellement, sans ça, certains indexeurs te refusent l'accès.
Jellyseerr : la couche user
Et puis y a Jellyseerr. C'est l'interface pour les non-techos. Ta famille veut regarder une série? Elle la cherche dans Jellyseerr, clique "Demander", et boom - Sonarr/Radarr se chargent de la récupérer. Personne a besoin de savoir comment ça marche. Port 5055, connecté à Authelia en OIDC.
Archi réseau et stockage
Tous les services *arr tournent sur un réseau Docker isolé arr_net. Seul Jellyfin (host network) et Jellyseerr (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 perms soient bonnes. C'est essentiel, sinon tu finis avec des problèmes de droits d'accès bizarres.
L'arborescence (critique!)
C'est là que beaucoup se plantent. L'organisation des répertoires, c'est crucial pour les hardlinks :
/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 truc important : downloads et media sur le même filesystem. Ça permet à Sonarr/Radarr d'utiliser des hardlinks au lieu de copier. Instantané, aucune duplication de space. J'ai compris ça tard, croyez-moi. Avant j'avais tout doublonné comme un idiot.
Le flux complet
Quand quelqu'un demande un film :
- Jellyseerr : ta femme 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 : voit le fichier fini, 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 bibli, le film est dispo
Du point de vue utilisateur? Elles ont cliqué un bouton, et quelques minutes plus tard le film est là. Zéro interface technique visible.
Au final
Setup un peu long à configurer la première fois (franchement, j'ai cramé une journée), mais après c'est du feu et j'oublie. Ansible se charge du redéploiement. La stack *arr + Jellyfin, c'est du niveau streaming commercial, pas d'abo, contrôle total, et tu partages avec qui tu veux. Le N95 gère le transcoding hardware sans sourciller. L'isolation réseau arr_net = c'est propre, c'est secure. Honnêtement, c'est mon déploiement perso favori sur le NAS.
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é
Article précédent
← Terminal, Git et recherche globale intégrés dans Neovim