Présentation

Mon propre Netflix - sans abonnement, sans pub, sans compromis.

Ce projet est probablement le plus ambitieux et le plus utilisé de tout mon homelab. L'objectif : avoir un serveur média self-hosted complet, depuis la recherche automatique de contenu jusqu'à la diffusion en qualité maximale, avec transcodage GPU matériel.

Screenshot 2026 06 13 190430


Architecture globale

La stack est volontairement répartie sur deux infras distinctes pour ne pas surcharger le homelab :

  • Serveur (dédié) - héberge toute la partie automatisation : Sonarr, Radarr, Jellyseerr, Jackett, RDTClient, NordVPN… via Docker Compose sous /opt/jellyfin
  • Homelab — héberge Jellyfin dans une VM Debian dédiée avec passthrough PCIe de la RTX pour le transcodage NVENC
  • NAS - stockage centralisé (~12,67 To en RAID 5, partagé en SMB/CIFS)
  • WireGuard - tunnel VPN entre le Server et le homelab pour relier le tout de façon sécurisée

Le workflow complet

schema (1)

1. La demande — Jellyseerr

Tout commence par Jellyseerr, l'interface de demande de contenu. N'importe quel utilisateur ayant un compte peut chercher un film ou une série et cliquer sur "Demander". Jellyseerr dispatche ensuite automatiquement vers Radarr (films) ou Sonarr (séries).

C'est le point d'entrée unique pour tous les utilisateurs. Ils ne voient jamais les outils internes.

2. L'automatisation - Sonarr & Radarr

Radarr gère les films, Sonarr gère les séries (avec une instance séparée pour l'anime). Leur rôle : surveiller les demandes, gérer les profils de qualité (1080p, 4K, etc.) et déclencher la recherche via les indexeurs.

Dès qu'une demande arrive de Jellyseerr, ils lancent une recherche automatique. Si un résultat correspond au profil de qualité configuré, le torrent est envoyé au client de téléchargement.

3. La recherche d'indexeurs - Jackett

Jackett fait le pont entre Sonarr/Radarr et les sites de torrents. Il traduit les requêtes en appels vers de nombreux trackers publics et semi-privés, et retourne les résultats dans un format standard (Torznab/Newznab).

En complément, Prowlarr est aussi présent dans la stack pour certains indexeurs natifs. (Off actuellement)

4. Le téléchargement premium - RDTClient + AllDebrid

C'est la partie la plus intéressante du workflow.

AllDebrid est un service de téléchargement premium ("debrideur") : quand on lui soumet un lien torrent ou magnet, il le télécharge sur ses propres serveurs haut débit, puis met à disposition un lien de téléchargement direct rapide.

RDTClient fait le lien entre Sonarr/Radarr et AllDebrid : il se présente comme un client qBittorrent standard aux yeux de l'Arr, mais en coulisse, il envoie chaque torrent à l'API AllDebrid et récupère le lien direct. Le fichier est ensuite téléchargé directement depuis les serveurs AllDebrid vers le stockage.

Résultat : pas de ratio à gérer, pas de seed, des vitesses de téléchargement maximales (souvent en quelques secondes pour un film).

RDTClient tourne dans le namespace réseau du container NordVPN pour sécuriser les requêtes.

5. La diffusion - Jellyfin

Jellyfin tourne dans une VM Debian 12 dédiée sur le Homelab, avec la RTX passée en PCIe passthrough. Cela lui donne accès au moteur de transcodage NVENC de la carte graphique pour transcoder les flux à la volée sans charger le CPU.

Les médias sont accessibles depuis la VM via des montages SMB/CIFS depuis le NAS QNAP, qui héberge l'ensemble de la bibliothèque (~12,67 To en RAID 5).

Jellyfin est exposé publiquement via le reverse proxy Nginx sur le Server, qui fait suivre le trafic jellyfin.entyscoco.ovh vers la VM homelab via le tunnel WireGuard. (Sera amené à évoluer...)

Screenshot 2026 06 13 193153


Infrastructure Docker

Toute la stack d'automatisation tourne sous Docker Compose dans /opt/jellyfin sur le Serveur. Les services sont organisés avec des proxies Nginx internes pour l'exposition de chaque outil.

jellyfin/
├── docker-compose.yml
├── .env
├── config/
│   ├── sonarr/
│   ├── radarr/
│   ├── jackett/
│   ├── jellyseerr/
│   └── rdtclient/
└── nginx/
└── conf.d/

Screenshot 2026 06 13 193401

Un point notable : RDTClient, qBittorrent et Jackett partagent le namespace réseau du container NordVPN (network_mode: "service:nordvpn"). Ce pattern évite d'exposer leur trafic hors VPN, mais implique que si NordVPN redémarre et change d'IP Docker interne, les proxies doivent utiliser le nom de service (et non l'IP hardcodée) dans leurs proxy_pass pour ne pas casser.

nordvpn:
    image: ghcr.io/bubuntux/nordlynx:latest
    container_name: nordvpn
    networks:
      - media
    cap_add:
      - NET_ADMIN
    environment:
      - PRIVATE_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
      - NET_LOCAL=192.168.0.0/16,10.0.0.0/8,172.16.0.0/12
      - COUNTRY=Netherlands
    ports:
      - "51413:51413"
      - "51413:51413/udp"
    healthcheck:
      test: ["CMD", "curl", "-sf", "https://ipinfo.io"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 30s
    restart: unless-stopped

Stockage - NAS

Le NAS centralise l'ensemble du stockage média avec ~12,67 To utiles en RAID 5 sur 8 disques WD Red de 2To.

La structure de stockage est la suivante :

Dossier Type Accès
/Films Films SMB → VM Jellyfin
/Series Séries TV NFS → Proxmox → VM
/Anime_films Films anime SMB → VM Jellyfin

Screenshot 2026 06 13 193709


Points techniques notables

GPU Passthrough RTX

La RTX est passée en PCIe passthrough à la VM Jellyfin. Seules les fonctions 01:00.0 (GPU) et 01:00.1 (audio HDMI) sont passées. Les fonctions USB/serial (01:00.2, 01:00.3) sont exclues pour éviter les conflits xhci_hcd

Deux quirks importants à retenir :

  • options vfio-pci disable_idle_d3=1 est obligatoire pour éviter les crashs VM liés au power state D3cold
  • Les device nodes /dev/nvidia* ne se créent pas automatiquement dans la VM — un service systemd oneshot avec mknod est nécessaire au boot

Screenshot 2026 06 13 193851

Transcodage NVENC dans Jellyfin

Avec le passthrough fonctionnel, Jellyfin utilise NVENC pour le transcodage matériel. La librairie libnvidia-encode1 doit être installée séparément depuis le repo CUDA (les packages NVIDIA sont fragmentés sur Debian 12, nvidia-smi est un dummy).

Screenshot 2026 06 13 193953


Résultat

Une stack entièrement automatisée : une demande dans Jellyseerr, et quelques minutes plus tard le contenu est disponible dans Jellyfin, en qualité maximale, transcodé en temps réel si besoin.

Le tout self-hosted, sur mes propres serveurs, sans dépendance à un service tiers (hormis AllDebrid pour le téléchargement premium).