Le Streaming est Cassé VI : La Pile Complète
Assez de tergiverser, n’est-ce pas ?
Blagues à part, je considère les articles précédents de cette série extrêmement importants. Chacun couvre un élément critique :
- Streaming is Broken II : Choisir le Matériel. Où nous avons appris à configurer un homeserver à faible coût avec mes deux centimes sur le stockage.
- Streaming is Broken III : Les Fondations (OS, Docker, et “Jour Un”). Où nous avons configuré notre OS, Docker, et préparé le terrain pour la suite.
- Streaming is Broken IV : La Forteresse : VPN et Gluetun. Un chapitre que vous ne trouverez normalement pas dans d’autres tutoriels, axé sur la sécurité et la vie privée.
- Streaming is Broken V : Hardlinks et Permissions. Des conseils pour éviter de futurs maux de tête dans nos configurations.
Mais si je devais choisir un seul article pour expliquer comment configurer un homeserver, ce serait celui-ci.
Sans plus attendre, commençons.
La Pile Multimédia
qBittorrent
Comme je l’ai dit dans les articles précédents, le piratage est le pire crime au monde, j’adore les entreprises qui proposent des services médiocres, et j’aime payer plus pour moins. Bien sûr, pour des raisons légales, je dis cela.

Maintenant, pour parler sérieusement, le flux de notre serveur multimédia domestique sera le suivant :
- Nous rechercherons des films et des séries dans Overseerr (tout sera expliqué plus bas)
- Overseerr enverra des demandes à Radarr (Films) et Sonarr (Séries)
- Radarr et Sonarr rechercheront le matériel sur des sites indexés par Prowlarr, dont la seule fonction sera de gérer ces indexeurs
- qBittorrent téléchargera le fichier. Radarr et Sonarr identifieront automatiquement le fichier et déplaceront le téléchargement vers leurs propres dossiers
- Jellyfin sera notre application de streaming sur la TV, l’iPad, l’ordinateur, etc. C’est là que nous regarderons le contenu acquis
Cela étant dit, commençons par le premier élément à configurer sur notre liste : le client de téléchargement.
Dans notre docker compose, nous aurons quelque chose comme ceci :
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
- WEBUI_PORT=8080
volumes:
- /home/donkey/EmuleVision/Settings/Qbittorrent:/config
- /home/donkey/EmuleVision:/data
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
Ici, comme je l’ai expliqué dans mon article sur la sécurité, qBittorrent sera protégé via VPN, et Gluetun sera celui qui protégera notre conteneur. Dans mon cas, connecté à un service VPN payant (il a des intégrations avec NordVPN, Surfshark, etc.). Puisque nous parlons de téléchargement de fichiers multimédias, oubliez les VPN gratuits : en plus d’être limités pour des raisons évidentes, ils sont extrêmement peu sécurisés.
Il est important de préciser que pour éviter les fuites d’IP, qBittorrent dépendra absolument du bon fonctionnement de Gluetun. Si le VPN tombe, qBittorrent s’arrêtera automatiquement. C’est la beauté du depends_on avec condition: service_healthy. Le conteneur ne démarrera même pas si Gluetun n’est pas prêt.
Dans ce cas et pour la suite, nous configurerons les permissions et le fuseau horaire (PUID, PGID et TZ) de la même manière. Pour cela, créez un fichier .env pour ces paramètres.
Exemple factice :
PUID=1000
PGID=1000
TZ=Etc/UTC
Pour configurer l’application elle-même, je ne vais pas réinventer la roue. Je vais lier le tutoriel TRaSH Guides correspondant pour chaque technologie :
- Basic-Setup - Configuration de base des paramètres les plus courants.
- Paths - Où définir votre emplacement de téléchargement racine.
- How to add Categories - Comment configurer des catégories pour qBittorrent, et comment vous pouvez gérer et organiser vos torrents en groupes. Les applications Starr peuvent utiliser les catégories dans qBittorrent pour suivre les téléchargements à surveiller, plutôt que de surveiller chaque torrent dans votre client.
- Port forwarding - Où dans votre client de téléchargement vous devez ajouter le port que vous avez transféré avec votre service VPN.
Prowlarr : Le Gestionnaire d’Indexeurs
Prowlarr est le héros méconnu de cette pile. C’est l’intermédiaire qui connecte vos Radarr et Sonarr aux indexeurs de torrents. Voyez-le comme une opératrice téléphonique des années 1950, sauf qu’au lieu de connecter des appels téléphoniques, elle connecte vos demandes de téléchargement aux sites de torrents.
prowlarr:
image: ghcr.io/hotio/prowlarr:latest
container_name: prowlarr
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/Prowlarr:/config
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped

Remarquez le schéma ici ? Il est aussi derrière Gluetun. Tout ce qui touche à l’internet public pour des “méthodes d’acquisition alternatives” reste derrière le VPN. Aucune exception.
La configuration de Prowlarr est simple :
- Ajoutez vos indexeurs (trackers publics ou privés)
- Connectez-le à Radarr et Sonarr via des clés API
- Laissez-le se synchroniser automatiquement
La beauté est que vous configurez les indexeurs une seule fois dans Prowlarr, et ils se propagent à toutes vos applications Arr. Plus besoin de copier-coller les URLs des trackers dans cinq interfaces différentes.
Pour une configuration détaillée, consultez TRaSH Guides - Prowlarr.
FlareSolverr : Le Contournement de Cloudflare
Certains indexeurs se protègent avec les mesures anti-bots de Cloudflare. FlareSolverr est un navigateur headless qui résout automatiquement ces défis.
flaresolverr:
image: ghcr.io/flaresolverr/flaresolverr:latest
container_name: flaresolverr
network_mode: "service:gluetun"
environment:
- TZ=${TZ}
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
Vous le configurez une seule fois dans Prowlarr, et il gère le reste. Lorsque Prowlarr accède à un site protégé par Cloudflare, FlareSolverr intervient, résout le défi et renvoie les résultats. C’est comme avoir un avocat robot spécialisé dans le contournement des videurs. Le guide est ici
Sonarr : Le Gestionnaire de Séries TV
C’est chez Sonarr que la magie opère pour les séries TV. Il surveille votre “liste de surveillance”, recherche de nouveaux épisodes via Prowlarr, les envoie à qBittorrent et organise tout automatiquement.
sonarr:
image: ghcr.io/linuxserver/sonarr:latest
container_name: sonarr
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/Sonarr:/config
- /home/donkey/EmuleVision:/data
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped

Points de configuration clés :
- Dossiers Racines : Définis sur
/data/media/tv - Client de Téléchargement : Pointer vers qBittorrent à
localhost:8080(rappelez-vous, ils partagent la même pile réseau via Gluetun) - Profils de Qualité : Utilisez les Paramètres de Qualité des TRaSH Guides pour éviter de télécharger des versions de mauvaise qualité
Sonarr va automatiquement :
- Rechercher de nouveaux épisodes à leur sortie
- Améliorer les épisodes existants si des versions de meilleure qualité apparaissent
- Renommer les fichiers selon votre schéma de nommage préféré
- Déplacer les téléchargements terminés vers votre bibliothèque multimédia en utilisant des Hardlinks (vous vous souvenez de ce post ?)
Radarr : Le Gestionnaire de Films
Radarr est le frère de Sonarr, mais pour les films. Même logique, type de contenu différent.
radarr:
image: ghcr.io/linuxserver/radarr:latest
container_name: radarr
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/Radarr:/config
- /home/donkey/EmuleVision:/data
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped

La configuration est un miroir de celle de Sonarr :
- Dossier Racine :
/data/media/movies - Client de Téléchargement : qBittorrent à
localhost:8080 - Profils de Qualité : TRaSH Guides pour Radarr
La différence réside dans le type de contenu. Radarr suit des films individuels au lieu de séries/saisons/épisodes. Il s’intègre également parfaitement avec des services comme les listes Trakt ou IMDb si vous souhaitez automatiser l’ajout de films à votre collection.
Bazarr : Le Spécialiste des Sous-titres
Vous vous souvenez quand je me plaignais de la piètre qualité des sous-titres de Netflix dans le premier post ? Bazarr résout cela.
bazarr:
image: ghcr.io/linuxserver/bazarr:latest
container_name: bazarr
restart: unless-stopped
network_mode: "service:gluetun"
environment:
- TZ=${TZ}
- PUID=${PUID}
- PGID=${PGID}
volumes:
- /home/donkey/EmuleVision/media/movies:/movies
- /home/donkey/EmuleVision/media/tv:/tv
- /home/donkey/EmuleVision/Settings/Bazarr:/config
depends_on:
gluetun:
condition: service_healthy

Bazarr fait automatiquement :
- Télécharge des sous-titres pour vos films et séries
- Prend en charge plusieurs langues
- Se synchronise avec OpenSubtitles, Subscene et d’autres fournisseurs
- Peut même améliorer les sous-titres existants si de meilleures versions apparaissent
La configuration est simple : connectez-le à Sonarr et Radarr via des clés API, sélectionnez vos langues et fournisseurs préférés, et laissez-le tourner. Votre thriller polonais aura enfin des sous-titres anglais compréhensibles.
Kaizoku : Le Téléchargeur de Manga
Pour ceux qui consomment plus que des films et des séries, Kaizoku s’occupe de l’acquisition de mangas.
kaizoku:
image: ghcr.io/oae/kaizoku:latest
container_name: kaizoku
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
- KAIZOKU_PORT=3002
volumes:
- /home/donkey/EmuleVision/Settings/Kaizoku:/config
- /home/donkey/EmuleVision:/data
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
Il suit les séries de manga, télécharge automatiquement les nouveaux chapitres et les organise pour votre plaisir de lecture. Imaginez-le comme Sonarr, mais pour les bandes dessinées.
Overseerr : Le Gestionnaire de Demandes
C’est le composant orienté utilisateur. Overseerr est ce avec quoi les membres de votre famille interagissent quand ils veulent regarder quelque chose.
overseerr:
image: lscr.io/linuxserver/overseerr:latest
container_name: overseerr
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
ports:
- "5055:5055"
volumes:
- /home/donkey/EmuleVision/Settings/Overseerr:/config
restart: unless-stopped

Remarquez quelque chose de différent ? Pas de Gluetun. Overseerr ne télécharge rien. C’est juste une interface de demande. Votre femme veut regarder Gossip Girl ? Elle ouvre Overseerr, le recherche, clique sur “Demander”, et Sonarr s’occupe du reste.
Plex : L’interface de streaming
C’est là que tout se rassemble. Plex est votre service de streaming personnel.
plex:
image: lscr.io/linuxserver/plex:latest
container_name: plex
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
- VERSION=docker
- PLEX_CLAIM=claim-6DcZ6Chj7tSXYU4n6GS7
network_mode: host
volumes:
- /home/donkey/EmuleVision/Settings/Plex:/config
- /home/donkey/EmuleVision/media/movies:/data/movies
- /home/donkey/EmuleVision/media/tv:/data/tvshows
devices:
- /dev/dri:/dev/dri
restart: unless-stopped

Détails critiques :
network_mode: host - Contrairement aux autres conteneurs, Plex a besoin d’un accès réseau direct pour la découverte DLNA et des performances de streaming maximales. Vous vous souvenez du diagramme d’architecture du post sur le VPN ? C’est le “Clean Group”.
devices: /dev/dri - Cela expose l’encodeur matériel Intel QuickSync au conteneur. Sans cela, le transcodage assassinerait votre CPU. Avec, le GPU de votre N100 gère le transcodage 4K pendant que le CPU fait la sieste.
PLEX_CLAIM - Ce jeton lie votre serveur Plex à votre compte Plex au premier démarrage. Vous l’obtenez sur plex.tv/claim. Il expire après 4 minutes, générez-le donc juste avant votre premier
docker compose up.Pas de dépendance à Gluetun - Plex diffuse en local. Faire passer une vidéo 4K à 80 Mbps à travers un tunnel VPN est insensé. Ce trafic reste sur votre LAN, rapide et propre.
Configuration essentielle :
- Activez l’accélération matérielle (Intel QuickSync) dans Paramètres → Transcoder
- Configurez vos bibliothèques (
Moviespointant vers/data/movies,TV Showspointant vers/data/tvshows) - Configurez l’accès à distance (Plex gère cela automatiquement, mais vous pouvez le désactiver pour un usage LAN uniquement)
- Installez l’application Plex sur votre TV, téléphone, tablette
La beauté de Plex par rapport aux alternatives open-source est le fini. Les applications sont natives, rapides et fonctionnent parfaitement sur tous les appareils imaginables. Votre femme n’aura pas besoin d’un tutoriel pour regarder Gossip Girl sur son iPad.
Pour une configuration détaillée, consultez la documentation officielle de Plex.
La pile de support
Portainer : Le tableau de bord Docker
Gérer des conteneurs via CLI, c’est bien quand on configure les choses. Mais quand quelque chose plante à 2h du matin et que vous devez redémarrer rapidement un service, une interface web est inestimable.
portainer:
image: portainer/portainer-ce:2.20.2
container_name: portainer
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock
- /home/donkey/EmuleVision/Settings/Portainer:/data
ports:
- "9000:9000"
restart: unless-stopped
Portainer vous offre :
- L’état des conteneurs en un coup d’œil
- Redémarrage/arrêt/suppression en un clic
- Consultation des logs sans SSH
- Surveillance de l’utilisation des ressources
Accédez-y à l’adresse http://votre-ip-serveur:9000.
Homepage : Le tableau de bord unifié
Homepage est votre centre de contrôle. Il agrège tous vos services en une seule et belle interface.
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
volumes:
- /home/donkey/EmuleVision/Settings/Homepage:/app/config
- /var/run/docker.sock:/var/run/docker.sock
environment:
- HOMEPAGE_ALLOWED_HOSTS=*
ports:
- "3000:3000"
restart: unless-stopped

Vous le configurez avec des fichiers YAML pour afficher :
- L’état des services
- Des liens rapides
- Des intégrations d’API (file d’attente de téléchargement Sonarr, ajouts récents Jellyfin)
- Des statistiques système
Cela devient votre page d’accueil favorite. Plus besoin de mémoriser quel service est sur quel port.
Scrutiny : Le moniteur de santé des disques
Vous vous souvenez de ce SSD de 512 Go sur lequel nous comptons ? Nous devons surveiller sa santé.
scrutiny:
image: ghcr.io/analogj/scrutiny:master-omnibus
container_name: scrutiny
cap_add:
- SYS_RAWIO
devices:
- /dev/sda:/dev/sda
volumes:
- /run/udev:/run/udev:ro
- /home/donkey/EmuleVision/Settings/Scrutiny:/opt/scrutiny/config
- /home/donkey/EmuleVision/Settings/Scrutiny/influxdb:/opt/scrutiny/influxdb
ports:
- "8086:8080"
restart: unless-stopped

Scrutiny lit les données S.M.A.R.T. de votre disque et vous alerte s’il détecte une dégradation. Les SSD ne tombent pas en panne progressivement ; ils tombent en panne soudainement. Cela vous donne un avertissement avant une perte de données catastrophique.
FileBrowser : Le gestionnaire de fichiers web
Parfois, vous avez besoin d’accéder directement aux fichiers sans passer par SSH ou monter un partage Samba.
filebrowser:
image: filebrowser/filebrowser:latest
container_name: filebrowser
environment:
- PUID=${PUID}
- PGID=${PGID}
volumes:
- /home/donkey/EmuleVision/Settings/Filebrowser/filebrowser.db:/database.db
- /home/donkey/EmuleVision/Settings/Filebrowser/.filebrowser.json:/.filebrowser.json
- /home/donkey/EmuleVision:/srv
ports:
- "8082:80"
restart: unless-stopped
FileBrowser fournit :
- Une gestion de fichiers basée sur le web
- Des capacités de téléchargement/upload
- Des contrôles de permissions utilisateur
- Des liens de partage de fichiers
Utile pour ces rares fois où vous devez ajouter manuellement un fichier ou vérifier quelque chose sans accès terminal.
Kavita et Calibre-Web : La pile de lecture
Pour les amateurs de livres :
kavita:
image: jvmilazz0/kavita:latest
container_name: kavita
environment:
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/Kavita:/kavita/config
- /home/donkey/EmuleVision/media/manga:/manga
- /home/donkey/EmuleVision/media/comics:/comics
ports:
- "5000:5000"
restart: unless-stopped
calibre-web:
image: lscr.io/linuxserver/calibre-web:latest
container_name: calibre-web
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/CalibreWeb:/config
- /home/donkey/EmuleVision/books:/books
ports:
- "8083:8083"
restart: unless-stopped
- Kavita : Pour les mangas et comics (fichiers CBZ/CBR)
- Calibre-Web : Pour les livres électroniques (EPUB, MOBI, PDF)

Les deux offrent des interfaces de lecture web avec suivi de progression, gestion des métadonnées et support d’applications mobiles.
Le Docker Compose Complet
Voici comment tout s’emboîte. Notez la ségrégation réseau entre le groupe VPN (Gluetun + les clients de téléchargement) et le groupe propre (Jellyfin, Overseerr, etc.) :
version: '3'
services:
gluetun:
image: qmcgaw/gluetun
container_name: gluetun
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
ports:
- "8080:8080" # Qbittorrent
- "9696:9696" # Prowlarr
- "8191:8191" # Flaresolverr
- "8989:8989" # Sonarr
- "7878:7878" # Radarr
- "3002:3002" # Kaizoku
- "6881:6881" # Port Torrent
- "6881:6881/udp"
- "6767:6767" # Bazarr
- "8090:8090"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
- VPN_SERVICE_PROVIDER=custom
- VPN_TYPE=openvpn
- OPENVPN_USER=${VPN_USER}
- OPENVPN_PASSWORD=${VPN_PASS}
- OPENVPN_CUSTOM_CONFIG=/gluetun/custom.conf
- FIREWALL_VPN_INPUT_PORTS=6881
- BLOCK_MALICIOUS=no
- BLOCK_ADS=no
- BLOCK_SURVEILLANCE=no
- FIREWALL_INPUT_PORTS=8080,9696,8191,8989,7878,3002,6767,8090
volumes:
- ./Settings/Gluetun:/gluetun
restart: always
healthcheck:
test: ["CMD-SHELL", "ping -c 1 1.1.1.1 || ping -c 1 8.8.8.8 || ping -c 1 9.9.9.9 || exit 1"]
interval: 10s
timeout: 5s
retries: 3
start_period: 20s
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
- WEBUI_PORT=8080
volumes:
- /home/donkey/EmuleVision/Settings/Qbittorrent:/config
- /home/donkey/EmuleVision:/data
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
prowlarr:
image: ghcr.io/hotio/prowlarr:latest
container_name: prowlarr
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/Prowlarr:/config
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
flaresolverr:
image: ghcr.io/flaresolverr/flaresolverr:latest
container_name: flaresolverr
network_mode: "service:gluetun"
environment:
- TZ=${TZ}
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
sonarr:
image: ghcr.io/linuxserver/sonarr:latest
container_name: sonarr
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/Sonarr:/config
- /home/donkey/EmuleVision:/data
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
radarr:
image: ghcr.io/linuxserver/radarr:latest
container_name: radarr
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/Radarr:/config
- /home/donkey/EmuleVision:/data
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
bazarr:
image: ghcr.io/linuxserver/bazarr:latest
container_name: bazarr
restart: unless-stopped
network_mode: "service:gluetun"
environment:
- TZ=${TZ}
- PUID=${PUID}
- PGID=${PGID}
volumes:
- /home/donkey/EmuleVision/media/movies:/movies
- /home/donkey/EmuleVision/media/tv:/tv
- /home/donkey/EmuleVision/Settings/Bazarr:/config
depends_on:
gluetun:
condition: service_healthy
kaizoku:
image: ghcr.io/oae/kaizoku:latest
container_name: kaizoku
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
- KAIZOKU_PORT=3002
volumes:
- /home/donkey/EmuleVision/Settings/Kaizoku:/config
- /home/donkey/EmuleVision:/data
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
overseerr:
image: lscr.io/linuxserver/overseerr:latest
container_name: overseerr
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
ports:
- "5055:5055"
volumes:
- /home/donkey/EmuleVision/Settings/Overseerr:/config
restart: unless-stopped
adguardhome:
image: adguard/adguardhome
container_name: adguardhome
ports:
- "53:53/tcp"
- "53:53/udp"
- "3001:3000"
volumes:
- /home/donkey/EmuleVision/Settings/AdGuard/work:/opt/adguardhome/work
- /home/donkey/EmuleVision/Settings/AdGuard/conf:/opt/adguardhome/conf
restart: unless-stopped
calibre-web:
image: lscr.io/linuxserver/calibre-web:latest
container_name: calibre-web
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/CalibreWeb:/config
- /home/donkey/EmuleVision/books:/books
ports:
- "8083:8083"
restart: unless-stopped
kavita:
image: jvmilazz0/kavita:latest
container_name: kavita
environment:
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/Kavita:/kavita/config
- /home/donkey/EmuleVision/media/manga:/manga
- /home/donkey/EmuleVision/media/comics:/comics
ports:
- "5000:5000"
restart: unless-stopped
filebrowser:
image: filebrowser/filebrowser:latest
container_name: filebrowser
environment:
- PUID=${PUID}
- PGID=${PGID}
volumes:
- /home/donkey/EmuleVision/Settings/Filebrowser/filebrowser.db:/database.db
- /home/donkey/EmuleVision/Settings/Filebrowser/.filebrowser.json:/.filebrowser.json
- /home/donkey/EmuleVision:/srv
ports:
- "8082:80"
restart: unless-stopped
portainer:
image: portainer/portainer-ce:2.20.2
container_name: portainer
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock
- /home/donkey/EmuleVision/Settings/Portainer:/data
ports:
- "9000:9000"
restart: unless-stopped
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
volumes:
- /home/donkey/EmuleVision/Settings/Homepage:/app/config
- /var/run/docker.sock:/var/run/docker.sock
environment:
- HOMEPAGE_ALLOWED_HOSTS=*
ports:
- "3000:3000"
restart: unless-stopped
scrutiny:
image: ghcr.io/analogj/scrutiny:master-omnibus
container_name: scrutiny
cap_add:
- SYS_RAWIO
devices:
- /dev/sda:/dev/sda
volumes:
- /run/udev:/run/udev:ro
- /home/donkey/EmuleVision/Settings/Scrutiny:/opt/scrutiny/config
- /home/donkey/EmuleVision/Settings/Scrutiny/influxdb:/opt/scrutiny/influxdb
ports:
- "8086:8080"
restart: unless-stopped
plex:
image: lscr.io/linuxserver/plex:latest
container_name: plex
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
- VERSION=docker
- PLEX_CLAIM=
network_mode: host
volumes:
- /home/donkey/EmuleVision/Settings/Plex:/config
- /home/donkey/EmuleVision/media/movies:/data/movies
- /home/donkey/EmuleVision/media/tv:/data/tvshows
devices:
- /dev/dri:/dev/dri
Liste de vérification du premier démarrage
Après avoir exécuté docker compose up -d, voici votre séquence de démarrage :
Attendez Gluetun - Vérifiez les logs :
docker logs gluetun- Recherchez “VPN connection successful”
- Vérifiez l’IP :
docker exec gluetun curl ifconfig.me
Configurez Prowlarr (port 9696)
- Ajoutez des indexers
- Connectez-vous à Sonarr/Radarr via les clés API
- Testez FlareSolverr si vous utilisez des indexers protégés
Configurez qBittorrent (port 8080)
- Changez le mot de passe par défaut
- Définissez le chemin de téléchargement :
/data/downloads/torrents - Ajoutez les catégories :
tv,movies - Suivez les TRaSH Guides
Configurez Sonarr (port 8989)
- Ajoutez Prowlarr comme indexer
- Ajoutez qBittorrent comme client de téléchargement (localhost:8080)
- Définissez le dossier racine :
/data/media/tv - Importez les profils de qualité depuis les TRaSH Guides
Configurez Radarr (port 7878)
- Identique à Sonarr, mais dossier racine :
/data/media/movies
- Identique à Sonarr, mais dossier racine :
Configurez Bazarr (port 6767)
- Connectez-vous à Sonarr/Radarr
- Ajoutez des fournisseurs de sous-titres (OpenSubtitles, Subscene)
- Définissez les langues préférées
Configurez Jellyfin (port 8096)
- Ajoutez des bibliothèques : Films (
/data/movies), Séries TV (/data/tvshows) - Activez l’accélération matérielle (Intel QuickSync)
- Créez des comptes utilisateurs
- Ajoutez des bibliothèques : Films (
Configurez Overseerr (port 5055)
- Connectez-vous à Jellyfin
- Connectez-vous à Sonarr/Radarr
- Activez les demandes utilisateurs
Conseils d’optimisation des performances
Gestion du stockage
Étant donné que nous travaillons avec un SSD de 512 Go, la gestion de l’espace est cruciale :
- Activez la suppression automatique dans Sonarr/Radarr après X jours
- Définissez des limites de qualité - Ne téléchargez pas de remux de 80 Go à moins d’en avoir réellement besoin
- Surveillez l’utilisation du disque via Homepage ou Scrutiny
- Nettoyage régulier - Supprimez le contenu visionné que vous ne reverrez pas
Optimisation réseau
- Port forwarding - Redirigez le port 6881 sur votre VPN pour maximiser les vitesses de téléchargement
- WiFi 5GHz pour la Box TV - Comme discuté dans l’article sur le matériel, le WiFi AC > Ethernet 100 Mbps pour le streaming 4K
- Direct Play plutôt que Transcoding - Configurez les clients Jellyfin pour prendre en charge vos formats de fichiers nativement
Renforcement de la sécurité
- Changez tous les mots de passe par défaut
- Désactivez l’accès à distance sauf si absolument nécessaire
- Gardez les identifiants VPN de Gluetun dans .env - Ne les codez jamais en dur
- Mises à jour régulières - Exécutez
docker compose pull && docker compose up -dmensuellement
Dépannage des problèmes courants
“qBittorrent ne démarre pas”
- Vérifiez les logs de Gluetun :
docker logs gluetun - Vérifiez les identifiants VPN dans
.env - Assurez-vous que le healthcheck passe :
docker inspect gluetun | grep Health
“Sonarr/Radarr ne peut pas atteindre qBittorrent”
- Ils partagent le réseau de Gluetun, utilisez
localhost:8080 - N’utilisez pas les noms de conteneurs ou les IPs
- Vérifiez les règles du pare-feu dans la configuration de Gluetun
“Le transcodage Jellyfin est lent”
- Vérifiez que l’accélération matérielle est activée
- Vérifiez que
/dev/driest correctement monté - Installez intel-media-va-driver-non-free sur l’hôte
“Les sous-titres ne se téléchargent pas”
- Vérifiez les logs de Bazarr pour les problèmes de fournisseur
- Vérifiez que les clés API sont correctes
- Certains fournisseurs limitent le débit ; attendez et réessayez
“Les Hardlinks ne fonctionnent pas”
- Tous les conteneurs doivent mapper le même volume racine (
/data) - Les téléchargements et les médias doivent être sur le même système de fichiers
- Vérifiez la propriété des fichiers (PUID/PGID)
Et ensuite ?
Nous avons maintenant un serveur domestique entièrement fonctionnel qui rivalise avec n’importe quel service de streaming. Mais ce n’est que la fondation. Dans de futurs articles, je couvrirai :
- Automatisation avancée : Scripts personnalisés pour la suppression, les notifications et la maintenance
- Accès à distance : Exposer votre serveur de manière sécurisée via Tailscale ou Cloudflare Tunnels
- Optimisation 4K : Mappage de tons HDR, profils de qualité spécifiques et gestion de la bande passante
- Stratégies de sauvegarde : Protéger votre configuration et vos médias
- Gestion multi-utilisateurs : Bibliothèques séparées, restrictions de visionnage et quotas de bande passante
- Intégration avec Trakt/IMDb : Synchronisation automatique des watchlists
- Personnalisation avancée de Jellyfin : Plugins, thèmes et paramètres spécifiques aux clients
La beauté de ce système est qu’il est modulaire. Vous pouvez ajouter ou supprimer des services selon vos besoins. Vous ne vous souciez pas des mangas ? Supprimez Kaizoku. Vous voulez ajouter la gestion de la musique ? Ajoutez Lidarr. L’architecture évolue avec vos besoins.
Vous avez transformé un mini PC bon marché en une infrastructure de niveau professionnel. Vous avez repris le contrôle de votre consommation médiatique aux entreprises qui vous facturent plus pour moins. Et vous avez appris les fondamentaux de la conteneurisation, du réseau et de l’architecture système en chemin.

Le serveur est construit. La stack est complète. Maintenant, allez de l’avant et acquérez (légalement, bien sûr) le contenu que vous voulez vraiment regarder.
À bientôt dans le prochain article.