Seedbox

Ubuntu 20.04 / Debian 10 – Installation d’une seedbox anonyme et sécurisée – (Partie 2) Accès de l’extérieur avec Traefik



Un reverse proxy est le récepteur frontal de toutes les requêtes HTTP venant de l’extérieur. Celui-ci les redirigera vers les bonnes instances des conteneurs Docker. Dans notre cas, nous disposons d’une multitude de containers Docker et nous ne pouvons pas toutes les faire écouter sur le port 80 ou 443, d’où l’utilisation d’un reverse proxy. Ajoutez à cela un joli nom de domaine à votre seedbox en sécurisant le tout avec le protocole SSL/TLS et un certificat Let’s Encrypt.

5 – Traefik

Traefik est un reverse-proxy et un load-balancer moderne conçu (par un Français) pour faciliter le déploiement des microservices (Docker, Kubernetes, AWS, etc.). Traefik est extrêmement simple à configurer et gère automatiquement vos certificats délivrés par Let’s Encrypt. De plus, il est capable de charger vos containers dynamiquement sans interruption de service et dispose d’un dashboard affichant l’ensemble de vos routes configurées.

Traefik avec Docker

Nous détaillerons ici la procédure avec l’image Deluge AirVPN mais celle-ci reste bien sûr compatible avec les images PIA et sans VPN si elle est suivie consciencieusement.

5.1 – Ajout de l’image Traefik

Ajoutez l’image Traefik à la fin de votre fichier /home/media/docker-compose.yml :

version: '3.7'
services:
  [...]

  plex:
    image: linuxserver/plex:latest
    container_name: plex
    restart: unless-stopped
    network_mode: "host"
    ports:
      - 32400:32400
    environment:
      - VERSION=latest
      - PUID=${PUID}
      - PGID=${PGID}
      - TZ=Europe/Paris
    volumes:
      - /home/media/plex/config:/config
      - ${PATH_MEDIA}:/data

  traefik:
    image: "traefik:v2.2"
    container_name: "traefik"
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /home/media/traefik/traefik.toml:/traefik.toml:ro
      - /home/media/traefik/acme.json:/acme.json
  • /var/run/docker.sock:/var/run/docker.sock:ro : précise le socket Unix de votre docker. Laissez cette valeur par défaut.
  • /home/media/traefik/traefik.toml:/traefik.toml:ro : précise le chemin du fichier de configuration de Traefik. Nous le créerons à l’étape suivante.
  • /home/media/traefik/acme.json:/acme.json : précise le chemin du fichier contenant les informations relatives à vos certificats.

5.2 – Configuration et déclaration du provider Docker

Traefik peut être configuré de différentes manières, nous allons détailler ici, la configuration recommandée par Traefik, à savoir par un fichier statique au format TOML.

  1. Commencez par créer le répertoire destiné au fichier de configuration Traefik :

    mkdir /home/media/traefik
  2. Créez le fichier de configuration Traefik /home/media/traefik/traefik.toml en ajoutant les lignes suivantes (vous n’avez rien à modifier quelque soit votre configuration) :

    [providers.docker]
      endpoint = "unix:///var/run/docker.sock"
      watch = true
      exposedByDefault = false
      
    • [providers.docker] : cette directive permet tout simplement d’activer le support Docker.
    • endpoint = "unix:///var/run/docker.sock" : précise le socket Unix de votre Docker à Traefik. Laissez la valeur par défaut.
    • watch = true : permet de déployer à chaud les containers dès qu’un changement dans la configuration est détectée.
    • exposedByDefault = false : n’expose pas par défaut les containers au monde extérieur. Il est préférable d’activer cette option dans le docker-compose.yml pour chacun des containers dans le cas où, si pour une raison ou une autre, vous ne souhaiteriez plus rendre accessible un container de l’extérieur.
  3. Ajoutez le label "traefik.enable=true" pour chacun des containers (sauf Traefik) dans votre /home/media/docker-compose.yml :

    version: '3.7'
    services:
      deluge:
        image: binhex/arch-delugevpn:latest
        container_name: deluge
        restart: unless-stopped
        cap_add:
          - NET_ADMIN
        ports:
          - 8112:8112
          - 8118:8118
          - 58846:58846
          - 58946:58946
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - VPN_ENABLED=yes
          - VPN_PROV=airvpn
          - ENABLE_PRIVOXY=yes
          - LAN_NETWORK=${LAN_NETWORK}
          - NAME_SERVERS=209.222.18.222,37.235.1.174,8.8.8.8,209.222.18.218,37.235.1.177,8.8.4.4
          - UMASK=000
          - DEBUG=false
        volumes:
          - /home/deluge/config:/config
          - /etc/localtime:/etc/localtime:ro
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
      
      jackett:
        image: linuxserver/jackett:latest
        container_name: jackett
        restart: unless-stopped
        network_mode: "host"
        ports:
          - 9117:9117
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/jackett/config:/config
          - /etc/localtime:/etc/localtime:ro
        labels:
          - "traefik.enable=true"
    
      sonarr:
        image: linuxserver/sonarr:latest
        container_name: sonarr
        restart: unless-stopped
        network_mode: "host"
        ports:
          - 8989:8989
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/sonarr/config:/config
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
    
      radarr:
        image: linuxserver/radarr:latest
        container_name: radarr
        restart: unless-stopped
        network_mode: "host"
        ports:
          - 7878:7878
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/radarr/config:/config
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
    
      lidarr:
        image: linuxserver/lidarr:latest
        container_name: lidarr
        restart: unless-stopped
        network_mode: "host"
        ports:
          - 8686:8686
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/lidarr/config:/config
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
    
      plex:
        image: linuxserver/plex:latest
        container_name: plex
        restart: unless-stopped
        network_mode: "host"
        ports:
          - 32400:32400
        environment:
          - VERSION=latest
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/plex/config:/config
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
    
      traefik:
        image: "traefik:v2.2"
        container_name: "traefik"
        restart: unless-stopped
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock:ro
          - /home/media/traefik/traefik.toml:/traefik.toml:ro
          - /home/media/traefik/acme.json:/acme.json
    
    • traefik.enable=true : ce label expose le container au monde extérieur. Il surchage la propriété exposedByDefault de votre fichier /home/media/traefik/traefik.toml.

5.3 – Isolation réseau des containers

Dans la première partie de ce tutoriel, chaque container Docker partage le réseau de votre machine pour être accessible en local avec la propriété network_mode: "host". Avec un reverse proxy, cette configuration n’a plus lieu d’être et nous allons en profiter pour ajouter un peu plus de sécurité en isolant vos containers dans un réseau uniquement accessible par Traefik.

  1. Modifiez votre /home/media/.env et ajoutez la ligne suivante en fin de fichier :

    [...]
    NETWORK=seedbox_network
  2. Remplacez toutes les directives network_mode: "host" par votre nouveau réseau. Attention, l’image Deluge sans VPN possède aussi cette directive. De plus, toutes les expositions de ports sont inutiles (sauf les ports 80 et 443 de Traefik évidemment), vous pouvez supprimer toutes les directives ports: avec les ports associés.

    Ensuite, ajoutez le label "traefik.docker.network" pour préciser à Traefik quel réseau utilise chacun des containers. Enfin, déclarez le réseau en fin de fichier (respectez l’indentation) :

    version: '3.7'
      deluge:
        image: binhex/arch-delugevpn:latest
        container_name: deluge
        restart: unless-stopped
        networks:
          - ${NETWORK}
        cap_add:
          - NET_ADMIN
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - VPN_ENABLED=yes
          - VPN_PROV=airvpn
          - ENABLE_PRIVOXY=yes
          - LAN_NETWORK=${LAN_NETWORK}
          - NAME_SERVERS=209.222.18.222,37.235.1.174,8.8.8.8,209.222.18.218,37.235.1.177,8.8.4.4
          - UMASK=000
          - DEBUG=false
        volumes:
          - /home/deluge/config:/config
          - /etc/localtime:/etc/localtime:ro
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
      
      jackett:
        image: linuxserver/jackett:latest
        container_name: jackett
        restart: unless-stopped
        networks:
          - ${NETWORK}
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/jackett/config:/config
          - /etc/localtime:/etc/localtime:ro
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
    
      sonarr:
        image: linuxserver/sonarr:latest
        container_name: sonarr
        restart: unless-stopped
        networks:
          - ${NETWORK}
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/sonarr/config:/config
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
    
      radarr:
        image: linuxserver/radarr:latest
        container_name: radarr
        restart: unless-stopped
        networks:
          - ${NETWORK}
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/radarr/config:/config
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
    
      lidarr:
        image: linuxserver/lidarr:latest
        container_name: lidarr
        restart: unless-stopped
        networks:
          - ${NETWORK}
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/lidarr/config:/config
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
    
      plex:
        image: linuxserver/plex:latest
        container_name: plex
        restart: unless-stopped
        networks:
          - ${NETWORK}
        environment:
          - VERSION=latest
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/plex/config:/config
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
    
      traefik:
        image: "traefik:v2.2"
        container_name: "traefik"
        restart: unless-stopped
        networks:
          - ${NETWORK}
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock:ro
          - /home/media/traefik/traefik.toml:/traefik.toml:ro
          - /home/media/traefik/acme.json:/acme.json
    
    networks:
      seedbox_network:
        name: ${NETWORK}:

5.4 – Configuration : définition des points d’entrée et des routes


N’oubliez pas d’ajouter des règles DNS pour chacun des sous-domaines dans l’interface administrateur du fournisseur de votre nom de domaine pour pointer vers l’IP de votre serveur. Les règles à ajouter dont de type « A ».

Si votre serveur est hébergé chez vous, il sera aussi nécessaire de créer une redirection du port 80 et 443 vers votre serveur dans l’interface de configuration de votre box internet (ou routeur).


  1. Modifiez le fichier de configuration Traefik /home/media/traefik/traefik.toml en ajoutant les lignes suivantes (vous n’avez rien à modifier quelque soit votre configuration) :

    [providers.docker]
      endpoint = "unix:///var/run/docker.sock"
      watch = true
      exposedByDefault = false
    
    [entryPoints.web]
      address = ":80"
      [entryPoints.web.http.redirections.entryPoint]
        to = "websecure"
        scheme = "https"
    
    [entryPoints.websecure]
      address = ":443"
    • [entryPoints.web] et [entryPoints.websecure] : ces directives définissent les points d’entrée de votre Traefik. web et websecure sont purement indicatifs, vous pouvez les nommer autrement mais ils doivent correspondre aux labels que nous définirons plus tard dans le docker-compose.yml. Les propriétés adress précisent les ports sur lesquels Traefik « écoute » en fonction du point d’entrée.
    • [entryPoints.web.http.redirections.entryPoint] : force la redirection du port 80 vers le port 443 donc force le HTTP en HTTPS.
  2. Nous allons maintenant définir les points d’entrée dans le docker-compose.yml et les routes associées pour chacun des containers.

    Commencez par déclarez votre domaine dans le fichier /home/media/.env en ajoutant la variable BASE_HOST et en modifiant la valeur par votre domaine. Attention ici à renseigner la base de votre domaine (aucun sous-domaine ni même les www) :

    [...]
    NETWORK=seedbox
    BASE_HOST=mondomaine.com
  3. Ajoutez les labels suivants dans votre fichier /home/media/docker-compose.yml :

    version: '3.7'
    services:
      deluge:
        image: binhex/arch-delugevpn:latest
        container_name: deluge
        restart: unless-stopped
        networks:
          - ${NETWORK}
        cap_add:
          - NET_ADMIN
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - VPN_ENABLED=yes
          - VPN_PROV=airvpn
          - ENABLE_PRIVOXY=yes
          - LAN_NETWORK=${LAN_NETWORK}
          - NAME_SERVERS=209.222.18.222,37.235.1.174,8.8.8.8,209.222.18.218,37.235.1.177,8.8.4.4
          - UMASK=000
          - DEBUG=false
        volumes:
          - /home/deluge/config:/config
          - /etc/localtime:/etc/localtime:ro
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
          - "traefik.http.routers.deluge.entrypoints=web,websecure"
          - "traefik.http.routers.deluge.rule=Host(`deluge.${BASE_HOST}`)"
          - "traefik.http.services.deluge.loadbalancer.server.port=8112"
      
      jackett:
        image: linuxserver/jackett:latest
        container_name: jackett
        restart: unless-stopped
        networks:
          - ${NETWORK}
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/jackett/config:/config
          - /etc/localtime:/etc/localtime:ro
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
          - "traefik.http.routers.jackett.entrypoints=web,websecure"
          - "traefik.http.routers.jackett.rule=Host(`jackett.${BASE_HOST}`)"
          - "traefik.http.services.jackett.loadbalancer.server.port=9117"
    
      sonarr:
        image: linuxserver/sonarr:latest
        container_name: sonarr
        restart: unless-stopped
        networks:
          - ${NETWORK}
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/sonarr/config:/config
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
          - "traefik.http.routers.sonarr.entrypoints=web,websecure"
          - "traefik.http.routers.sonarr.rule=Host(`sonarr.${BASE_HOST}`)"
          - "traefik.http.services.sonarr.loadbalancer.server.port=8989"
    
      radarr:
        image: linuxserver/radarr:latest
        container_name: radarr
        restart: unless-stopped
        networks:
          - ${NETWORK}
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/radarr/config:/config
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
          - "traefik.http.routers.radarr.entrypoints=web,websecure"
          - "traefik.http.routers.radarr.rule=Host(`radarr.${BASE_HOST}`)"
          - "traefik.http.services.radarr.loadbalancer.server.port=7878"
    
      lidarr:
        image: linuxserver/lidarr:latest
        container_name: lidarr
        restart: unless-stopped
        networks:
          - ${NETWORK}
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/lidarr/config:/config
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
          - "traefik.http.routers.lidarr.entrypoints=web,websecure"
          - "traefik.http.routers.lidarr.rule=Host(`lidarr.${BASE_HOST}`)"
          - "traefik.http.services.lidarr.loadbalancer.server.port=8686"
    
      plex:
        image: linuxserver/plex:latest
        container_name: plex
        restart: unless-stopped
        networks:
          - ${NETWORK}
        environment:
          - VERSION=latest
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/plex/config:/config
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
          - "traefik.http.routers.plex.entrypoints=web,websecure"
          - "traefik.http.routers.plex.rule=Host(`plex.${BASE_HOST}`)"
          - "traefik.http.services.plex.loadbalancer.server.port=32400"
    
      traefik:
        image: "traefik:v2.2"
        container_name: "traefik"
        restart: unless-stopped
        networks:
          - ${NETWORK}
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock:ro
          - /home/media/traefik/traefik.toml:/traefik.toml:ro
          - /home/media/traefik/acme.json:/acme.json
    
    networks:
      seedbox_network:
        name: ${NETWORK}:
    • traefik.http.routers.[NOM_DU_CONTAINER].entrypoints : chaque règle de routage spécifique à un container doit être spécifiée par un nom, ici nous utilisons tout simplement le nom du container. Le label entrypoints précise que les requêtes entrantes sur les points d’entrée web (port 80) et websecure (port 443) seront transmises au container.
    • traefik.http.routers.[NOM_DU_CONTAINER].rule=Host(`[SERVICE].${BASE_HOST}`) : ici nous précisons une règle, toute requête arrivant sur http://SERVICE.mondomaine.com sera transmise au container Docker associé.
    • traefik.http.services.[NOM_DU_CONTAINER].loadbalancer.server.port=[PORT] : ici nous précisons le port du container sur lequel les requêtes doivent être transmises.

5.5 – Ajout des certificats Let’s Encrypt

Pour la gestion de vos certificats, Traefik s’occupe de tout ! Traefik génère automatiquement les certificats Let’s Encrypt et les renouvelle 30 jours avant leurs expirations sans action de votre part.

  1. Traefik stocke les informations liées au certificat dans un fichier acme.json. Vous devez au préalable créer le fichier et lui attribuer un minimum de permissions :

    touch /home/media/traefik/acme.json && chmod 600 /home/media/traefik/acme.json
  2. Ajoutez les lignes suivantes dans votre /home/media/traefik/traefik.toml et modifier uniquement la propriété email :

    [providers.docker]
      endpoint = "unix:///var/run/docker.sock"
      watch = true
      exposedByDefault = false
    
    [entryPoints.web]
      address = ":80"
      [entryPoints.web.http.redirections.entryPoint]
        to = "websecure"
        scheme = "https"
    
    [entryPoints.websecure]
      address = ":443"
    
    [certificatesResolvers.media-resolver.acme]
      email = "votre-adresse@email.com"
      storage = "acme.json"
      [certificatesResolvers.media-resolver.acme.httpChallenge]
        entryPoint = "web"
    
    • [certificatesResolvers.[NOM_RESOLVEUR].acme] : nous indiquons ici que nous souhaitons utiliser le protocole ACME (donc le service Let’s Encrypt) pour obtenir un certificat. Le nom du résolveur est purement indicatif, il doit simplement correspondre aux labels que nous définirons plus tard dans le docker-compose.yml.
    • storage = "acme.json" : la propriété storage précise à Traefik le fichier (que nous avons créé précédemment) où seront stockées les informations relatives aux certificats. L’erreur commune est d’indiquer le chemin absolu (dans notre cas /home/media/traefik/acme.json), ici le chemin à renseigner est celui au sein du container Traefik, il faut donc laisser cette valeur par défaut.
    • [certificatesResolvers.[NOM_RESOLVEUR].acme.httpChallenge] : cette directive précise tout simplement par quel point d’entrée (dans notre cas le port 80) Traefik peut obtenir un certificat.
  3. Ajoutez les lignes suivantes dans votre fichier /home/media/docker-compose.yml :

    version: '3.7'
    services:
      deluge:
        image: binhex/arch-delugevpn:latest
        container_name: deluge
        restart: unless-stopped
        networks:
          - ${NETWORK}
        cap_add:
          - NET_ADMIN
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - VPN_ENABLED=yes
          - VPN_PROV=airvpn
          - ENABLE_PRIVOXY=yes
          - LAN_NETWORK=${LAN_NETWORK}
          - NAME_SERVERS=209.222.18.222,37.235.1.174,8.8.8.8,209.222.18.218,37.235.1.177,8.8.4.4
          - UMASK=000
          - DEBUG=false
        volumes:
          - /home/deluge/config:/config
          - /etc/localtime:/etc/localtime:ro
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
          - "traefik.http.routers.deluge.entrypoints=web,websecure"
          - "traefik.http.routers.deluge.rule=Host(`deluge.${BASE_HOST}`)"
          - "traefik.http.services.deluge.loadbalancer.server.port=8112"
          - "traefik.http.routers.deluge.tls=true"
          - "traefik.http.routers.deluge.tls.certresolver=media-resolver"
      
      jackett:
        image: linuxserver/jackett:latest
        container_name: jackett
        restart: unless-stopped
        networks:
          - ${NETWORK}
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/jackett/config:/config
          - /etc/localtime:/etc/localtime:ro
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
          - "traefik.http.routers.jackett.entrypoints=web,websecure"
          - "traefik.http.routers.jackett.rule=Host(`jackett.${BASE_HOST}`)"
          - "traefik.http.services.jackett.loadbalancer.server.port=9117"
          - "traefik.http.routers.jackett.tls=true"
          - "traefik.http.routers.jackett.tls.certresolver=media-resolver"
    
      sonarr:
        image: linuxserver/sonarr:latest
        container_name: sonarr
        restart: unless-stopped
        networks:
          - ${NETWORK}
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/sonarr/config:/config
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
          - "traefik.http.routers.sonarr.entrypoints=web,websecure"
          - "traefik.http.routers.sonarr.rule=Host(`sonarr.${BASE_HOST}`)"
          - "traefik.http.services.sonarr.loadbalancer.server.port=8989"
          - "traefik.http.routers.sonarr.tls=true"
          - "traefik.http.routers.sonarr.tls.certresolver=media-resolver"
    
      radarr:
        image: linuxserver/radarr:latest
        container_name: radarr
        restart: unless-stopped
        networks:
          - ${NETWORK}
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/radarr/config:/config
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
          - "traefik.http.routers.radarr.entrypoints=web,websecure"
          - "traefik.http.routers.radarr.rule=Host(`radarr.${BASE_HOST}`)"
          - "traefik.http.services.radarr.loadbalancer.server.port=7878"
          - "traefik.http.routers.radarr.tls=true"
          - "traefik.http.routers.radarr.tls.certresolver=media-resolver"
    
      lidarr:
        image: linuxserver/lidarr:latest
        container_name: lidarr
        restart: unless-stopped
        networks:
          - ${NETWORK}
        environment:
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/lidarr/config:/config
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
          - "traefik.http.routers.lidarr.entrypoints=web,websecure"
          - "traefik.http.routers.lidarr.rule=Host(`lidarr.${BASE_HOST}`)"
          - "traefik.http.services.lidarr.loadbalancer.server.port=8686"
          - "traefik.http.routers.lidarr.tls=true"
          - "traefik.http.routers.lidarr.tls.certresolver=media-resolver"
    
      plex:
        image: linuxserver/plex:latest
        container_name: plex
        restart: unless-stopped
        networks:
          - ${NETWORK}
        environment:
          - VERSION=latest
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
        volumes:
          - /home/media/plex/config:/config
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
          - "traefik.http.routers.plex.entrypoints=web,websecure"
          - "traefik.http.routers.plex.rule=Host(`plex.${BASE_HOST}`)"
          - "traefik.http.services.plex.loadbalancer.server.port=32400"
          - "traefik.http.routers.plex.tls=true"
          - "traefik.http.routers.plex.tls.certresolver=media-resolver"
    
      traefik:
        image: "traefik:v2.2"
        container_name: "traefik"
        restart: unless-stopped
        networks:
          - ${NETWORK}
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock:ro
          - /home/media/traefik/traefik.toml:/traefik.toml:ro
          - /home/media/traefik/acme.json:/acme.json
    
    networks:
      seedbox_network:
        name: ${NETWORK}:
    • traefik.http.routers.[NOM_CONTAINER].tls : active le support SSL/TLS.
    • traefik.http.routers.[NOM_CONTAINER].tls.certresolver : précise le résolveur et donc les certificats à utiliser.

Démarrez l’ensemble des containers avec la commande :

docker-compose up -d
Les services sont désormais disponibles aux adresses suivantes :
  • Deluge : http://deluge.mondomaine.com
  • Sonarr : http://sonarr.mondomaine.com
  • Radarr : http://radarr.mondomaine.com
  • Lidarr : http://lidarr.mondomaine.com
  • Plex : http://plex.mondomaine.com

5.6 – Configuration des services

Plex

Pour un accès à distance, il est nécessaire d’associer l’interface web Plex à votre serveur. Pour cela, vous devez préciser l’URL et un code d’association dont la validité est de 4 minutes.
  1. Demandez le code d’association à l’adresse suivante : https://www.plex.tv/claim/

  2. Modifiez votre fichier /home/media/docker-compose.yml et ajoutez les lignes suivantes en spécifiant le code obtenu précédemment :

    version: '3.7'
    services:
      [...]
    
      plex:
        image: linuxserver/plex:latest
        container_name: plex
        restart: unless-stopped
        networks:
          - ${NETWORK}
        environment:
          - VERSION=latest
          - PUID=${PUID}
          - PGID=${PGID}
          - TZ=Europe/Paris
          - PLEX_CLAIM=claim-424242424242
          - ADVERTISE_IP=plex.${BASE_HOST}:443
        volumes:
          - /home/media/plex/config:/config
          - ${PATH_MEDIA}:/data
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=${NETWORK}"
          - "traefik.http.routers.plex.entrypoints=web,websecure"
          - "traefik.http.routers.plex.rule=Host(`plex.${BASE_HOST}`)"
          - "traefik.http.services.plex.loadbalancer.server.port=32400"
          - "traefik.http.routers.plex.tls=true"
          - "traefik.http.routers.plex.tls.certresolver=media-resolver"
    
    [...]
    
  3. Redémarrez le container Plex avec la commande :

    docker-compose up -d

6 – Configuration

Nous allons maintenant configurer les applications pour qu’elles puissent communiquer entre elles et que chacune d’elles dispose d’un minimum de sécurité.

Suite du tutoriel (configuration et problèmes rencontrés)



Debian 10 BlusterDocker 19.03.8
Docker Compose 1.25.5
Nginx 1.17.10
Deluge 2.0.4
Jackett 0.16.105.0
Sonarr 2.0.0.5344
Radarr 0.2.0.1480
Lidarr 0.7.1.1381



8 réponses
  1. Jeremy
    Jeremy dit :

    Bonjour,

    J’espère que vous allez bien.

    Lors de l’ajout de la balise network dans le fichier docker-composer.yml, je fait un docker-compose up -d

    J’ai un message d’erreur qui m’indique mapping values are not allowed here line 161, en gros la dernière ligne du fichier ..

    networks:
    seedbox_network:
    name: ${NETWORK}:

    Pouvez-vous me dire pourquoi ? J’ai fait sans copier coller et avec copier coller car j’ai vu que l’espace était sensible..

    Répondre
  2. Golgfag
    Golgfag dit :

    Bonjour,

    J’ai décidé de passer le pas et de prendre un vpn (PIA) sur mon serveur kimsufi.
    Vous donnez la méthode sur la première partie mais je me demande sur traefik permet l’utilisation du vpn? Dans votre configuration la partie vpn n’est plus présente sur deluge.
    Est-il possible de jumeler les deux? De plus est-il possible d’intégrer jackett dans le vpn? (je souhaite faire un get sous une autre ip).
    Merci

    Répondre
    • Edouard WATTECAMPS
      Edouard WATTECAMPS dit :

      Bonjour,

      Oui je confirme que Traefik est compatible avec les deux images avec VPN et sans VPN, mais effectivement j’ai du faire un choix d’image lors de la procédure pour Traefik. Je vais clarifier tout ça. Non il n’est pas possible d’intégrer Jackett dans le VPN, mais quel serait l’intérêt ? De cacher votre IP lors d’une recherche sur un tracker ?

      Répondre
      • Golgfag
        Golgfag dit :

        Merci pour la réponse l idée était effectivement de faire des get de jacket via d autre ip pour éviter le ban des trackers. Mais finalement je fais autrement ! J ai une autre question à laquelle je n arrive pas à trouver de solution.
        Je souhaite ajouter organizr, celui-ci fonctionne sans problème. Sauf que je suis obligé de faire mes requête sur mon domaine extérieur ( xxx.fr/radarr) hors il serait plus logique de les faires directement sur le network des docker. Mais impossible, je pong bien les docker dans leurs network (172.18.0.x) mais j ai l impression qu’ils ne répondent pas aux requêtes sur les ports spécifiques entre eux… seul traefik peut contacter un container où les containers peuvent communiquer entre eux?

        J espere que je suis compréhensible dans mes explication.

        Merci

        Répondre

Laisser un commentaire

Participez-vous à la discussion?
N'hésitez pas à contribuer!

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *