Langues disponibles:

Le Streaming est Cassé VI : La Pile Complète

Ce post a été initialement écrit en anglais. La traduction peut ne pas refléter 100% des idées originales de l'auteur.

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.

Qbittorrent

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

Prowlarr

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 :

  1. Ajoutez vos indexeurs (trackers publics ou privés)
  2. Connectez-le à Radarr et Sonarr via des clés API
  3. 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

Sonarr

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

Radarr

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

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

Overserr

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

Plex

Détails critiques :

  1. 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”.

  2. 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.

  3. 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.

  4. 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 (Movies pointant vers /data/movies, TV Shows pointant 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

Homepage

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

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)

Calibre

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 :

  1. Attendez Gluetun - Vérifiez les logs : docker logs gluetun

    • Recherchez “VPN connection successful”
    • Vérifiez l’IP : docker exec gluetun curl ifconfig.me
  2. 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
  3. 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
  4. 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
  5. Configurez Radarr (port 7878)

    • Identique à Sonarr, mais dossier racine : /data/media/movies
  6. Configurez Bazarr (port 6767)

    • Connectez-vous à Sonarr/Radarr
    • Ajoutez des fournisseurs de sous-titres (OpenSubtitles, Subscene)
    • Définissez les langues préférées
  7. 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
  8. 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 :

  1. Activez la suppression automatique dans Sonarr/Radarr après X jours
  2. Définissez des limites de qualité - Ne téléchargez pas de remux de 80 Go à moins d’en avoir réellement besoin
  3. Surveillez l’utilisation du disque via Homepage ou Scrutiny
  4. Nettoyage régulier - Supprimez le contenu visionné que vous ne reverrez pas

Optimisation réseau

  1. Port forwarding - Redirigez le port 6881 sur votre VPN pour maximiser les vitesses de téléchargement
  2. 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
  3. Direct Play plutôt que Transcoding - Configurez les clients Jellyfin pour prendre en charge vos formats de fichiers nativement

Renforcement de la sécurité

  1. Changez tous les mots de passe par défaut
  2. Désactivez l’accès à distance sauf si absolument nécessaire
  3. Gardez les identifiants VPN de Gluetun dans .env - Ne les codez jamais en dur
  4. Mises à jour régulières - Exécutez docker compose pull && docker compose up -d mensuellement

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/dri est 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
  • 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.

Victoire !

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.