Salut à tous,

Pour les amateurs de simplicité, voici en 2 commandes et 2 fichiers de quoi installer une seedbox complète avec :

  • rtorrent/rutorrent : Téléchargement de torrents. Image de @xataz .
  • Flood : Interface nodejs pour rtorrent. Image construite sur les sources officielle.
  • Pyload : Téléchargements directs. Image de writl.
  • Medusa : Gestionnaire de séries TV. Image de linuxserver.
  • Watcher : Gestionnaire de films. Image de moi-même.
  • Ombi : Gestionnaire de demandes. Image de linuxserver.
  • Embi : Streaming de vidéos et de musiques. Image officielle.

**Pré-requis: **

  • Linux
  • Docker
  • docker-compose

1- Fichier de variables:

Créer un fichier ".env" avec le contenu suivant et adapter les variables à votre utilisation:

RESTART_MODE=unless-stopped

TZ=Europe/Paris

DUID=991
DGID=991

TRAEFIK_DASHBOARD_URL=traefik.domain.tld

PATH_APP=/data/apps
PATH_MEDIA=/data/media
PATH_MEDIA_TV=/data/media/Videos/tv
PATH_MEDIA_MOVIES=/data/media/Videos/movies
PATH_DOWNLOADS=/data/incoming

PROXY_NETWORK=traefik_proxy

RTORRENT_FQDN=rtorrent.domain.tld

# Create password with command: htpasswd -m -c temp your_username && cat temp && rm temp
# then, double each "$" ex: username:$$apr1$$ljshdflkjh$$z,nebj and put in on the following var:
RTORRENT_LOGIN="zer:$$apr1$$Gj3CF4pe$$2j.YaFPF1laxXSJOl9uPu1"

FLOOD_FQDN=flood.domain.tld
# Set here a strong password:
FLOOD_SECRET="Hy5qVe50iv7oNmAnZcdwmsUvb"

PYLOAD_FQDN=pyload.domain.tld
EMBI_FQDN=embi.domain.tld
MEDUSA_FQDN=medusa.domain.tld
WATCHER_FQDN=watcher.domain.tld
OMBI_FQDN=ombi.domain.tld

2- Récupérer les sources de Flood:

git clone https://github.com/jfurrow/flood.git flood

3- Fichier compose:

Créer un fichier "docker-compose.yml" avec le contenu suivant:
(Note: pas de modification à faire ici, tout et géré dans le fichier ".env".)

#####################################################
#                       Seedbox                     #
#                      ---------                    #
#                                                   #
# - rTorrent : Telechargement des torrents          #
# - Emby     : Streaming video/music/photos         #
# - Ombi     : Requêtes de téléchargements          #
# - Medusa   : Gestionnaire de séries               #
# - Watcher  : Gestionnaire de films                #
#                                                   #
#####################################################

version: '2.4'

services:
###########
# Traefik #
###########
  traefik:
    image: traefik
    cpus: 1
    mem_limit: 64m
    memswap_limit: 0m
    container_name: proxy_traefik
    restart: ${RESTART_MODE}
    hostname: traefik
    labels:
      - traefik.enable=true
      - traefik.frontend.rule=Host:${TRAEFIK_DASHBOARD_URL}
      - traefik.port=8080
      - traefik.docker.network=${PROXY_NETWORK}
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro  
      - ${PATH_APP}/traefik/traefik.toml:/traefik.toml:ro
      - ${PATH_APP}/letsencrypt/certs:/etc/traefik/acme:rw
    ports:
      - "80:80"
      - "443:443"
    networks:
      - proxy

############
# rTorrent #
############
  rtorrent:
    image: xataz/rtorrent-rutorrent
    cpus: 2
    mem_limit: 512m
    memswap_limit: 0m
    container_name: sb-dltorrent_rTorrent
    restart: ${RESTART_MODE}
    hostname: torrent
    tty: true
    healthcheck:
      test: ["CMD", "curl", "-f", "http://127.0.0.1:8080"]
      interval: 30s 
      timeout: 10s 
      retries: 3
      start_period: 1m
    labels:
      - traefik.enable=true
      - traefik.frontend.rule=Host:${RTORRENT_FQDN}
      - traefik.port=8080
      - traefik.docker.network=${PROXY_NETWORK}
      - traefik.frontend.auth.basic=${RTORRENT_LOGIN}
    volumes:
      - ${PATH_MEDIA}:/data:rw
      - ${PATH_APP}/rtorrent/conf:/config:rw
      - /etc/localtime:/etc/localtime:ro
    environment:
      - UID=${DUID}
      - GID=${DGID}
      - PORT_RTORRENT=6881
      - DHT_RTORRENT=on
    networks:
      - torrent
      - proxy

#########
# Flood #
#########
# git clone https://github.com/jfurrow/flood.git flood
  flood:
    image: jfurrow/flood
    build: ./flood/
    cpus: 2
    mem_limit: 512m
    memswap_limit: 0m
    container_name: sb-dltorrent_Flood
    restart: ${RESTART_MODE}
    hostname: torrent
    tty: true
    healthcheck:
      test: ["CMD", "curl", "-f", "http://127.0.0.1:3000"]
      interval: 30s 
      timeout: 10s 
      retries: 3
      start_period: 1m
    labels:
      - traefik.enable=true
      - traefik.frontend.rule=Host:${FLOOD_FQDN}
      - traefik.port=3000
      - traefik.docker.network=${PROXY_NETWORK}
    volumes:
      - ${PATH_MEDIA}:/data:rw
      - ${PATH_APP}/flood/db:/data/server/db:rw
      - /etc/localtime:/etc/localtime:ro
    environment:
      - UID=${DUID}
      - GID=${DGID}
      - FLOOD_SECRET=${FLOOD_SECRET}
      - RTORRENT_SCGI_HOST=rtorrent
      - RTORRENT_SCGI_PORT=5000
      - FLOOD_ENABLE_SSL=false
    ports:
      - "49184:49184"
      - "49184:49184/udp"
    networks:
      - torrent
      - proxy

############
#  Pyload  #
############
  pyload:
    image: writl/pyload
    cpus: 2
    mem_limit: 500m
    memswap_limit: 0m
    container_name: sb-dldirect_Pyload
    restart: ${RESTART_MODE}
    hostname: pyload
    healthcheck:
      test: ["CMD", "curl", "-f", "http://127.0.0.1:8000"]
      interval: 30s 
      timeout: 10s 
      retries: 3
      start_period: 1m
    labels:
      - traefik.enable=true
      - traefik.frontend.rule=Host:${PYLOAD_FQDN}
      - traefik.port=8000
      - traefik.docker.network=${PROXY_NETWORK}
    volumes:
      - ${PATH_DOWNLOADS}/:/opt/pyload/Downloads:rw
      - ${PATH_APP}/pyload/conf:/opt/pyload/pyload-config:rw
      - /etc/localtime:/etc/localtime:ro
    environment:
      - TZ=${TZ}
      - UID=${DUID}
      - GID=${DGID}
    networks:
      - proxy

########
# Emby #
########
  emby:
    image: emby/embyserver
    cpus: 4
    mem_limit: 4096m
    memswap_limit: 0m
    container_name: sb-stream_Emby
    restart: ${RESTART_MODE}
    hostname: emby
    healthcheck:
      test: ["CMD", "curl", "-f", "http://127.0.0.1:8096"]
      interval: 30s 
      timeout: 10s 
      retries: 3
      start_period: 1m
    labels:
      - traefik.enable=true
      - traefik.frontend.rule=Host:${EMBI_FQDN}
      - traefik.port=8096
      - traefik.docker.network=${PROXY_NETWORK}
    volumes:
      - ${PATH_APP}/emby/conf:/config:rw
      - ${PATH_MEDIA}:/data:rw
      - /etc/localtime:/etc/localtime:ro
    environment:
      - UID=${DUID}
      - GID=${DGID}
      - TZ=${TZ}
    networks:
      - proxy

########
# Ombi #
########
  ombi:
    image: linuxserver/ombi
    cpus: 1
    mem_limit: 200m
    memswap_limit: 0m
    container_name: sb-userreq_Ombi
    restart: ${RESTART_MODE}
    hostname: ombi
    healthcheck:
      test: ["CMD", "curl", "-f", "http://127.0.0.1:3579"]
      interval: 30s 
      timeout: 10s 
      retries: 3
      start_period: 1m
    labels:
      - traefik.enable=true
      - traefik.frontend.rule=Host:${OMBI_FQDN}
      - traefik.port=3579
      - traefik.docker.network=${PROXY_NETWORK}
    volumes:
      - ${PATH_APP}/ombi/conf:/config:rw
      - /etc/localtime:/etc/localtime:ro
    environment:
      - TZ=${TZ}
      - PUID=${DUID}
      - PGID=${DGID}
    networks:
      - proxy

############
#  Medusa  #
############
  medusa:
    image: linuxserver/medusa
    cpus: 2
    mem_limit: 500m
    memswap_limit: 0m
    container_name: sb-gettv_medusa
    restart: ${RESTART_MODE}
    hostname: medusa
    healthcheck:
      test: ["CMD", "curl", "-f", "http://127.0.0.1:8081"]
      interval: 30s 
      timeout: 10s 
      retries: 3
      start_period: 1m
    labels:
      - traefik.enable=true
      - traefik.frontend.rule=Host:${MEDUSA_FQDN}
      - traefik.port=8081
      - traefik.docker.network=${PROXY_NETWORK}
    volumes:
      - ${PATH_MEDIA_TV}/:/tv:rw
      - ${PATH_DOWNLOADS}/:/downloads:rw
      - ${PATH_APP}/medusa/conf:/config:rw
      - /etc/localtime:/etc/localtime:ro
    environment:
      - TZ=${TZ}
      - PUID=${DUID}
      - PGID=${DGID}
    networks:
      - proxy

#############
#  Watcher  #
#############
  watcher:
    image: zerpex/watcher3
    cpus: 2
    mem_limit: 500m
    memswap_limit: 0m
    container_name: sb-getmovies_Watcher
    restart: ${RESTART_MODE}
    hostname: watcher
    healthcheck:
      test: ["CMD", "curl", "-f", "http://127.0.0.1:80"]
      interval: 30s 
      timeout: 10s 
      retries: 3
      start_period: 1m
    labels:
      - traefik.enable=true
      - traefik.frontend.rule=Host:${WATCHER_FQDN}
      - traefik.port=80
      - traefik.docker.network=${PROXY_NETWORK}
    volumes:
      - ${PATH_APP}/watcher/conf:/watcher3/userdata:rw
      - ${PATH_APP}/watcher/plugins:/watcher3/plugins:rw
      - /etc/localtime:/etc/localtime:ro
    environment:
      - TZ=${TZ}
      - UID=${DUID}
      - GID=${DGID}
    networks:
      - proxy

networks:
  torrent:
  proxy:
    external:
      name: ${PROXY_NETWORK}

Exécuter la commande docker-compose up -d, attendre 1 minute ou deux et profitez de votre seedbox 🙂

Bonne utilisation,
zer.

Notes:

  • Pyload: pour ce connecter, utiliser pyload/pyload.
  • rtorrent/rutorrent/flood: il peut paraitre un peu lourd de proposer à la fois rutorrent et flood, mais personnellement, je trouve que ça a du sens. En effet, Flood est toujours un "work in progress" et propose des fonctionnalités limitées par rapport à rutorrent. De plus, l'image proposée par @xataz est complète. D'un autre côté, Flood est nettement plus léché graphiquement et suffit pour une utilisation quotidienne. Proposer les deux permet de faire sa conf, gérer ses plugins et autres via rutorrent, puis d'utiliser flood pour gérer ces torrents au quotidien.
    5 jours plus tard

    Quels sont les choses à modifier si on ne veut pas certaine appli ? Exemple pyload :
    Delete cette ligne dans le .env :

    zer PYLOAD_FQDN=pyload.domain.tld

    Puis delete dans le docker compose ?

    zer ############

    Pyload

    ############
    pyload:
    image: writl/pyload
    cpus: 2
    mem_limit: 500m
    memswap_limit: 0m
    container_name: sb-dldirect_Pyload
    restart: ${RESTART_MODE}
    hostname: pyload
    healthcheck:
    test: ["CMD", "curl", "-f", "http://127.0.0.1:8000"]
    interval: 30s
    timeout: 10s
    retries: 3
    start_period: 1m
    labels:
    - traefik.enable=true
    - traefik.frontend.rule=Host:${PYLOAD_FQDN}
    - traefik.port=8000
    - traefik.docker.network=${PROXY_NETWORK}
    volumes:
    - ${PATH_DOWNLOADS}/:/opt/pyload/Downloads:rw
    - ${PATH_APP}/pyload/conf:/opt/pyload/pyload-config:rw
    - /etc/localtime:/etc/localtime:ro
    environment:
    - TZ=${TZ}
    - UID=${DUID}
    - GID=${DGID}
    networks:
    - proxy

    Edit : Pourquoi certains docker respectent la norme des multiples de 2 pour la RAM allouée et d'autres non ? on pourrait harmoniser cela non ? ça fait moche en l'état 🤐

    • zer a répondu à ça.

      Banip Oui, si tu ne veux pas d'un soft, il suffit de virer le bloc correspondant dans le fichier docker-compose.yml.

      Concernant la seconde question, effectivement, j'aurai pu faire ça plus joli, méa culpa !
      Libre à toi de mettre ce que tu veux. J'ai essayé de mettre des valeurs larges pour une utilisation "normale", mais il ne faut pas hésiter à tweaker tout ça 🙂
      Le but principal de ces limitations est d'éviter qu'un soft qui part en sucette ne pourrisse la totalité des ressources du serveur (déconvenues vécu ).

      Rhooo la boulette ! en me relisant, je m'apperçois que j'ai oublié un fichier essentiel : la config du proxy !

      Il faut donc rajouter un fichier $PATH_APP/traefik/traefik.toml avec le contenu suivant:
      ( $PATH_APP étant le chemin défini dans le fichier .env)

      defaultEntryPoints = ["https","http"]
      
      [api]
      entryPoint = "traefik"
      dashboard = true
      
      [entryPoints]
        [entryPoints.http]
        address = ":80"
          [entryPoints.http.redirect]
          entryPoint = "https"
        [entryPoints.https]
        address = ":443"
          [entryPoints.https.tls]
          minVersion = "VersionTLS12"
          cipherSuites = [
            "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305",
            "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
            "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
            "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
            "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
            "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA"
          ]
        [entryPoints.traefik]
        address = ":8080"
        [entryPoints.traefik.auth.basic]
        users = ["zer:$$apr1$$Gj3CF4pe$$2j.YaFPF1laxXSJOl9uPu1"]
      
      [acme]
      email = "me@mydom.com"
      storage = "/etc/traefik/acme/acme.json"
      entryPoint = "https"
      onHostRule = true
      onDemand = false
        [acme.httpChallenge]
        entryPoint = "http"
      
      [docker]
      endpoint = "unix:///var/run/docker.sock"
      domain = "DOMAINE"
      watch = true
      exposedbydefault = false

      Et remplacer :

      • DOMAINE : Par votre domaine principal (sous la forme : domain.tld)
      • me@mydom.com : par votre adresse email pour recevoir les alertes letsencrypt
      • zer:$$apr1$$Gj3CF4pe$$2j.YaFPF1laxXSJOl9uPu1 : Par le hash de votre mot de passe (pour accéder au dashboard de traefik.

      Désolé pour l'oubli !

        Attention, tu devrais préciser qu'il faut doubler les $ dans le hash du password...

        • zer a répondu à ça.

          Merrick

          zer

          # Create password with command: htpasswd -m -c temp your_username && cat temp && rm temp
          # then, double each "$" ex: username:$$apr1$$ljshdflkjh$$z,nebj and put in on the following var:
          RTORRENT_LOGIN="zer:$$apr1$$Gj3CF4pe$$2j.YaFPF1laxXSJOl9uPu1"

          Comme je l'ai déjà indiqué dans le fichier .env, je pensais que ça suffirait. Néanmoins, tu as raison, mieux vaut le dire plusieurs fois ! 🙂

          Bonjour une question pour créer le fichier .env tu pourrais expliquer la marche à suivre ?
          merci 😉

          Bonjour,

          Juste un nano .env dans ton dossier de travail suffit

            Nebukad Effectivement, nano, vi, vimou tout autre éditeur de texte à ta convenance !

            D'accord merci pour l'info Nebukad et zer ☺ 👍

            6 mois plus tard

            Hello, il y a une raison pour laquelle tu utilises ta propre image de watcher ?
            j'ai vu qu'il y avait celle là : linuxserver/watcher
            Peut-être qu'elle n'était pas disponible au moment du tuto ?

            5 jours plus tard

            Salut,

            Au moment où j'ai créé cette image, il n'y en avait effectivement pas d'autre et je l'ai faite pour un ami.
            Maintenant, je n'ai pas testé celle de linuxserver pour comparer vu que je ne l'utilise pas moi même 😉

            8 jours plus tard

            Il me semblait qu'il n'était pas possible d'utiliser des variables dans le fichier .env ?
            Paradoxal m'enfin ...

            • zer a répondu à ça.
              11 jours plus tard

              spider1163 Il me semblait qu'il n'était pas possible d'utiliser des variables dans le fichier .env ?
              Paradoxal m'enfin ...

              Et tu as raison. Je ne sais par quel miracle ça a fonctionné à un moment où j'ai testé... ou bien j'ai fais un mauvais copié/collé... possible aussi même si c'est quand même fortement improbable que je fasse une erreur... 😃

              Je corrige ça !

              Cognotte Effectivement, non. J'utilise exclusivement su sftp ou du rsync.

              Note sur ce mod-opératoire: Je ne suis pas revenu dessus depuis un moment, il fonctionne toujours, mais serait sans doute à améliorer. Je pense en particulier à la conf traefik.
              Si j'ai un moment, je regarderai ça !

                4 mois plus tard

                zer Il faut donc rajouter un fichier $PATH_APP/traefik/traefik.toml avec le contenu suivant:
                ( $PATH_APP étant le chemin défini dans le fichier .env)

                Bonsoir @zer , ou doit on placer ce fichier , je n'ai pas compris ?

                Bonsoir, tu peux aussi utiliser mon script d'install qui te fournira les mêmes services que zer. Ca se fait tout seul.

                  Mon script propose également une installation classique sans gdrive, sur ubuntu par contre

                    Répondre…