Le docker-compose.yml du stack *arr

Un seul fichier. Vous copiez, vous adaptez 3 variables (PUID, PGID, clé WireGuard), vous lancez, c'est en route. Pas de bricolage, pas de "vous adapterez selon votre setup". Testé sur DS920+ et DS923+ en avril 2026.

Avant de coller le fichier

4 prérequis pour que le stack démarre du premier coup.

Container Manager installé

Sur DSM 7, via Package Center. C'est lui qui lit le docker-compose.yml et orchestre les containers.

Comprendre le stack *arr

Compte VPN avec port forwarding

ProtonVPN ou AirVPN recommandés : port forwarding fiable, indispensable pour qBittorrent en tracker privé.

Choisir son VPN

Structure de dossiers créée

Créez l'arborescence ci-dessous dans File Station AVANT de lancer le stack. Sinon les volumes Docker se monteront mal.

PUID/PGID identifiés

En SSH sur le NAS, tapez la commande id votre-utilisateur. Notez PUID (uid) et PGID (gid). Par défaut sur Synology : 1026 / 100.

Structure de dossiers à créer

Dans File Station, créez exactement cette arborescence sur votre volume principal.

/volume1/
├── docker/
│   ├── gluetun/
│   ├── qbittorrent/
│   ├── prowlarr/
│   ├── sonarr/
│   ├── radarr/
│   ├── bazarr/
│   └── jellyfin/
└── data/
    ├── torrents/
    ├── series/
    └── films/

Important : /data/ et /docker/ doivent être sur le même volume, sinon Sonarr/Radarr ne pourront pas faire du hardlink et vous dupliquerez les fichiers inutilement.

Le docker-compose.yml

Le fichier complet. Un clic sur Copier, collez-le dans /volume1/docker/docker-compose.yml, adaptez les variables, démarrez.

# =============================================================
# docker-compose.yml : Stack *arr complet pour NAS Synology
# Testé DS920+ / DS923+ sous DSM 7.2, avril 2026
# monratio.fr
# =============================================================

services:

  # -----------------------------------------------------------
  # GLUETUN : Tunnel VPN partagé (ProtonVPN + WireGuard)
  # Tout ce qui doit passer par le VPN partage son réseau.
  # -----------------------------------------------------------
  gluetun:
    image: qmcgaw/gluetun:latest
    container_name: gluetun
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun:/dev/net/tun
    environment:
      # --- VPN ---
      - VPN_SERVICE_PROVIDER=protonvpn
      - VPN_TYPE=wireguard
      # REMPLACE ces valeurs avec celles de ton compte ProtonVPN
      # https://account.protonvpn.com/downloads#wireguard-configuration
      - WIREGUARD_PRIVATE_KEY=REMPLACER_PAR_TA_CLE_PRIVEE
      - WIREGUARD_ADDRESSES=10.2.0.2/32
      # --- Serveur ---
      - SERVER_COUNTRIES=Netherlands
      # --- DNS et divers ---
      - TZ=Europe/Paris
      - HEALTH_VPN_DURATION_INITIAL=120s
      # Réseaux locaux autorisés hors tunnel (accès NAS/LAN)
      - FIREWALL_OUTBOUND_SUBNETS=192.168.1.0/24,10.0.0.0/8
    ports:
      # Ports des services qui partagent le réseau de gluetun
      - 8080:8080   # qBittorrent WebUI
      - 6881:6881   # qBittorrent TCP
      - 6881:6881/udp  # qBittorrent UDP
      - 9696:9696   # Prowlarr WebUI
    volumes:
      - /volume1/docker/gluetun:/gluetun
    restart: unless-stopped

  # -----------------------------------------------------------
  # QBITTORRENT : Client torrent, DERRIÈRE gluetun
  # network_mode: service:gluetun = tout son trafic passe par le VPN.
  # Si gluetun tombe, qBittorrent n'a plus aucun accès réseau.
  # -----------------------------------------------------------
  qbittorrent:
    image: lscr.io/linuxserver/qbittorrent:latest
    container_name: qbittorrent
    depends_on:
      - gluetun
    network_mode: "service:gluetun"
    environment:
      - PUID=1026
      - PGID=100
      - TZ=Europe/Paris
      - WEBUI_PORT=8080
    volumes:
      - /volume1/docker/qbittorrent:/config
      - /volume1/data/torrents:/data/torrents
    restart: unless-stopped

  # -----------------------------------------------------------
  # PROWLARR : Gestionnaire d'indexers (aussi derrière VPN)
  # Se synchronise ensuite automatiquement vers Sonarr/Radarr.
  # -----------------------------------------------------------
  prowlarr:
    image: lscr.io/linuxserver/prowlarr:latest
    container_name: prowlarr
    depends_on:
      - gluetun
    network_mode: "service:gluetun"
    environment:
      - PUID=1026
      - PGID=100
      - TZ=Europe/Paris
    volumes:
      - /volume1/docker/prowlarr:/config
    restart: unless-stopped

  # -----------------------------------------------------------
  # SONARR : Gestion des séries
  # Hors VPN (ne télécharge pas lui-même, pilote qBittorrent).
  # -----------------------------------------------------------
  sonarr:
    image: lscr.io/linuxserver/sonarr:latest
    container_name: sonarr
    environment:
      - PUID=1026
      - PGID=100
      - TZ=Europe/Paris
    volumes:
      - /volume1/docker/sonarr:/config
      - /volume1/data:/data
    ports:
      - 8989:8989
    restart: unless-stopped

  # -----------------------------------------------------------
  # RADARR : Gestion des films
  # -----------------------------------------------------------
  radarr:
    image: lscr.io/linuxserver/radarr:latest
    container_name: radarr
    environment:
      - PUID=1026
      - PGID=100
      - TZ=Europe/Paris
    volumes:
      - /volume1/docker/radarr:/config
      - /volume1/data:/data
    ports:
      - 7878:7878
    restart: unless-stopped

  # -----------------------------------------------------------
  # BAZARR : Sous-titres automatiques (Sonarr + Radarr)
  # -----------------------------------------------------------
  bazarr:
    image: lscr.io/linuxserver/bazarr:latest
    container_name: bazarr
    environment:
      - PUID=1026
      - PGID=100
      - TZ=Europe/Paris
    volumes:
      - /volume1/docker/bazarr:/config
      - /volume1/data:/data
    ports:
      - 6767:6767
    restart: unless-stopped

  # -----------------------------------------------------------
  # JELLYFIN : Lecteur média
  # network_mode: host pour le DLNA + accélération matérielle GPU.
  # -----------------------------------------------------------
  jellyfin:
    image: lscr.io/linuxserver/jellyfin:latest
    container_name: jellyfin
    network_mode: host
    environment:
      - PUID=1026
      - PGID=100
      - TZ=Europe/Paris
      - JELLYFIN_PublishedServerUrl=http://192.168.1.10
    volumes:
      - /volume1/docker/jellyfin:/config
      - /volume1/data:/data:ro
    devices:
      # Accélération matérielle Intel Quick Sync (DS920+/DS923+)
      - /dev/dri:/dev/dri
    restart: unless-stopped

Variables à adapter avant lancement

Les seules lignes à modifier dans le YAML. Le reste fonctionne tel quel.

Variable
Valeur par défaut
Comment la trouver
PUID
1026
Identifiant utilisateur du NAS. Récupérez-le en SSH via la commande id. Sur Synology DSM 7, par défaut 1026.
PGID
100
Identifiant du groupe users sur Synology. Par défaut 100.
TZ
Europe/Paris
Fuseau horaire. Déjà bon pour la France, inutile de changer.
WIREGUARD_PRIVATE_KEY
(à récupérer)
Depuis account.protonvpn.com > WireGuard configuration. Générez une nouvelle clé et copiez la PrivateKey.
WIREGUARD_ADDRESSES
10.2.0.2/32
Affichée à la génération de la config WireGuard chez ProtonVPN. Généralement 10.2.0.2/32.
VPN_SERVICE_PROVIDER
protonvpn
Nom du provider pour GlueTUN. Alternatives : airvpn, mullvad, nordvpn, surfshark, windscribe, custom.
SERVER_COUNTRIES
Netherlands
Pays des serveurs VPN. Pays-Bas, Suisse, Suède ou Roumanie sont d'excellents choix pour le P2P.

Comment lancer

2 méthodes, au choix. La GUI si vous débutez, le SSH si vous préférez la ligne de commande.

Méthode GUI (Container Manager)

  1. Copier le fichier dans /volume1/docker/docker-compose.yml via File Station.
  2. Container Manager : onglet Projet > Créer.
  3. Source : "Créer le fichier docker-compose.yml" puis pointer vers le chemin. Chemin : /volume1/docker/.
  4. Activer le projet : cliquez Démarrer à la fin du wizard. Les images se téléchargent, les containers démarrent.

Méthode SSH (une ligne)

Si vous avez activé SSH sur le NAS (Panneau de configuration > Terminal & SNMP), c'est infiniment plus rapide.

cd /volume1/docker
docker compose up -d

-d = detached, les containers tournent en arrière-plan.

Vérification post-lancement

Après docker compose up -d, attendez 30-60 secondes puis testez ces URL. Remplacez NAS-IP par l'IP de votre NAS (ex : 192.168.1.10).

Tous les containers UP
docker compose ps

Les 7 lignes doivent afficher 'running'. Si l'une est 'restarting' ou 'exited', regardez les logs.

qBittorrent (via gluetun)
http://NAS-IP:8080

Login par défaut : admin / adminadmin (à changer immédiatement).

Prowlarr
http://NAS-IP:9696

L'indexer manager. Première étape de configuration une fois UP.

Sonarr
http://NAS-IP:8989

Gestion des séries. À connecter à Prowlarr + qBittorrent.

Radarr
http://NAS-IP:7878

Gestion des films. Même logique que Sonarr.

Bazarr
http://NAS-IP:6767

Sous-titres automatiques. Se branche à Sonarr et Radarr.

Jellyfin
http://NAS-IP:8096

Le lecteur média. Premier lancement = création du compte admin + ajout des bibliothèques.

Mise à jour du stack

Une commande, et tous les containers sont à jour. À lancer tous les mois environ, ou quand une CVE est publiée sur un des services.

cd /volume1/docker
docker compose pull
docker compose up -d

pull télécharge les nouvelles versions des images. up -d recrée les containers en utilisant les nouvelles images. Les configs dans /volume1/docker/ sont conservées : aucune perte de données.

Configurations à faire après le premier lancement

Les containers tournent, mais rien n'est encore connecté. Voici l'ordre exact pour tout câbler ensemble.

  1. 1

    Configurer qBittorrent

    Kill switch via interface gluetun, catégories, répertoires de téléchargement.

    Voir le tuto
  2. 2

    Configurer Prowlarr

    Ajouter vos indexers (publics ou trackers privés), synchroniser vers Sonarr/Radarr.

    Voir le tuto
  3. 3

    Configurer Sonarr

    Connecter le téléchargeur qBittorrent, définir la bibliothèque séries, les profils qualité.

    Voir le tuto
  4. 4

    Configurer Radarr

    Même logique que Sonarr mais pour les films. Custom Formats TRaSH pour la qualité.

    Voir le tuto
  5. 5

    Configurer Bazarr

    Connecter Sonarr et Radarr, ajouter les providers de sous-titres (Opensubtitles, etc).

    Voir le tuto
  6. 6

    Configurer Jellyfin

    Compte admin, bibliothèques pointant vers /data/films et /data/series, transcodage.

    Voir le tuto

Questions fréquentes

Les quatre questions qui reviennent tout le temps sur ce template.

Pourquoi tout faire passer derrière GlueTUN ?
Sécurité absolue. qBittorrent et Prowlarr partagent le réseau du container gluetun (network_mode: "service:gluetun"). Si le VPN tombe, le container gluetun tombe, et donc qBittorrent n'a plus AUCUN accès réseau. Impossible qu'une seule requête torrent fuite en clair. C'est un kill switch au niveau Docker, bien plus fiable que celui intégré à qBittorrent.
Je préfère Plex à Jellyfin, comment remplacer ?
Remplacez le bloc jellyfin par ce bloc Plex : linuxserver/plex:latest, port 32400, volumes identiques (config + data en lecture). Supprimez la ligne network_mode: host si vous n'en avez pas besoin pour le DLNA. Sinon la structure reste strictement identique.
Un container ne démarre pas, que faire ?
Dans l'ordre : docker compose logs nom-du-container pour voir l'erreur exacte. 95% du temps : soit un dossier manquant (créez-le dans File Station), soit un PUID/PGID faux (revérifiez avec id), soit une clé VPN invalide (regénérez depuis le compte ProtonVPN).
Comment ajouter un nouveau service (Lidarr, Readarr…) ?
Ajoutez le bloc YAML du service dans le fichier (structure identique aux autres : image, container_name, environment, volumes, ports, restart). Puis relancez docker compose up -d. Docker détecte le nouveau service et le lance. Les services existants ne sont pas impactés.