Ma stack seedbox du moment

Étienne m’a fait une très bonne remarque : je parle souvent de tous les outils que j’utilise mais je n’ai jamais détaillé mon installation. La “stack”, normalement une pile informatique, désigne plus couramment un ensemble d’outils dédiés à une fonction précise.

Ça fait (trop) longtemps que j’ai pas posté, je risque d’être un peu fouillis. Voici un menu rapide :

Bien entendu c’est un setup personnel, sans doute trop complexe pour certains ou au contraire trop léger pour d’autres. Mais ça vous donne des pistes. Je n’utilise pas de script parce qu’à l’époque où je me suis mis à rClone il n’en existait pas. Je ne change pas de serveur tous les mois et avec Docker et un backup ça va très vite à remonter :)

Environnement

Un serveur Hetzner AX41 NVMe (rapidité d’I/O pour les bases de données/cache + Usenet) avec quelques To de SATA en option (pour le seedtime en BitTorrent).

Ubuntu 19.10 et Docker-CE + docker-compose.

Un nom de domaine au moins (j’en gère 4 avec le proxy Nginx d’installé sur cette machine). Ces dernières années je les prends tous chez Namecheap.

rClone + 2 comptes GDrive (GSuite Business) chiffrés. 1 pour mon utilisation personnelle et 1 pour divers backups. Même si j’ai déjà utilisé rClone sous format Docker là je l’ai installé en dur (par habitude).

PlexDrive, aussi installé en dur, pour gérer le cache des fichiers hébergés sur GDrive.

Unionfs-fuse pour justement jouer avec rClone et PlexDrive. Comme je le disais dans d’autres articles quand je me suis mis à rClone y’a des années, je monte tout dans /unionfs : GDrive (déchiffré évidemment et en lecture seule), PlexDrive et le stockage local des fichiers. De cette manière le GDrive en lecture seule évite toute boulette de suppression de fichier et monter le local comme le distant permet aux outils de bosser tranquillement, que les fichiers soient encore sur le serveur ou déjà sur le GDrive (je pense à Plex notamment).

Je stocke mes données Docker dans /home/aerya/docker (NVMe) et mes fichiers dans /home/aerya/mnt (SATA).

Tri

Je suis un dingue du tri. Donc au-delà des outils que je vais citer après tout est aussi question de tri dans arborescence de /mnt :

  • /encrypt : montage GDrive déchiffré
  • ./gcrypt : montage GDrive chiffré
  • /plexdrive : le cache de rClone
  • /PreFilms & /PreSeries : là où sont DL les films & séries qui sont ensuite traités par des outils avant d’être envoyés dans /mnt/unionfs/Films et /mnt/unionfs/Series
  • /sourcetorrent : là où tombent les .torrent récoltés, ils sont ensuite chargés dans les clients
    • /GLOBAL qui contient les dossiers listés ci-après, sauf MEPHiSTO
    • /PreSeries
    • /PreFilms
    • /MEPHiSTO
  • /telechargements qui reprend de fait la même arborescence que /sourcetorrent. ruTorrent, via son plugin AutoTools, y place un hardlink de chaque fichier téléchargé.

Sur mon GDrive :

  • Android
  • backup
  • Concerts
  • Films4k
  • Formation
  • Informatique
  • Jeux
  • Management
  • Pratique
  • Recette
  • Spectacles
  • Blog
  • Ebooks
  • Fun
  • Isa
  • Linux
  • MEPHiSTO
  • Sante
  • Series
  • Sport
  • Atelier
  • Comics
  • Docs
  • Films
  • Flac
  • Jardin
  • Maison
  • Potager
  • Presse
  • Softs
  • Stuff

Outils

Donc tout est sous Docker sauf rClone et PlexDrive. J’utilise majoritairement des containers de Linuxserver.io, pour un suivi efficace dans le temps.

Voici la liste des containers qui tournent tout le temps sur ce serveur Hetzner.

  • jc21 Proxy Nginx + SSL (Lets Encrypt) : Docker / GitHub
  • Watchtower, qui permet de mettre automatiquement à jour les containers Dockers (sélectionnés) : Docker / GitHub
  • Medusa, pour l’autoDL de séries (séries FR + animes) : Docker / GitHub
  • Sonarr, pour l’autoDL de séries (sauf séries FR + animes). Pour moi il est moins abouti que Medusa mais il est tellement intégré dans différents outils tiers/plugins/bots qu’il est indispensable : Docker (tag :preview pour la V3)/ GitHub
  • Radarr, pour l’autoDL de films. Il est tellement intégré dans différents outils tiers/plugins/bots qu’il est indispensable : Docker / GitHub
  • Sensorr, pour l’autoDL de films. Redondant avec Radarr mais j’aime bien ce projet : Docker / GitHub
  • ruTorrent, pour le DL via BitTorrent. J’ai plusieurs instances, une pour GLOBAL, une pour PreSeries, une pour PreFilms et une pour MEPHiSTO. J’utilise plusieurs “sources” : Linuxserver, Mondedie et Romancin
  • SABnzbd+, pour le DL via Usenet : Docker / GitHub
  • Portainer, pour gérer de temps en temps mes containers : Docker / GitHub
  • Jackett, pour centraliser mes sources BitTorrent : Docker / GitHub
  • Heimdall, qui me sert de page d’accueil sur mes navigateurs, pour placer des “apps”/raccourcis ( et ) vers les outils dont je me sers le plus : Docker / GitHub
  • Syncthing, pour envoyer dans /sourcetorrent les .torrents que je prends à la main depuis mon PC : Docker / GitHub
  • Tautulli, pour les statistiques de Plex que je partage avec quelques amis : Docker / GitHub
  • ZNC, via Tor, bouncer IRC : Docker / GitHub
  • ZNC, en clair, bouncer IRC : Docker / GitHub
  • Ubooquity, pour accéder à mes comics/BD : Docker / site
  • 2 instances Plex, une pour les vidéos (films, séries, animes, documentaires, spectacles, sport…) et une pour la musique : Docker / site
  • ssh-chroot, pour filer un accès SSH/sFTP si besoin, mais qui soit cantonné dans un dossier de mon choix : GitHub
  • AdGuardHome (définitivement à la place de Pi-Hole depuis 3 semaines), mon serveur DNS qui permet de filtrer les trackers/pubs entre autres : Docker / GitHub
  • Ombi, pour permettre à ceux ayant accès à Plex de demander leurs séries/films : Docker / GitHub
  • Rsync-backup, pour des backups de mes configurations Dockers etc : Docker / GitHub
  • ruTorrent-AutoDelete, pour supprimer automatiquement des .torrents selon un seedtime ou ratio pré-établis : Docker / GitHub

Dockers

Bien évidemment tous les logins, mots de passe et domaines ont été changés.

Pour Nginx-proxy-manager il faut d’abord créer le fichier de configuration SQL /home/aerya/docker/nginx-proxy-manager/config/config.json avec ce contenu

{
  "database": {
    "engine": "mysql",
    "host": "mariadb",
    "name": "nginxproxymanager",
    "user": "nginxproxymanager",
    "password": "Ta418uxHVsbjluCwsDVWEsn25ijH",
    "port": 3306
  }
}

Puis je me sers d’un docker-compose.yml pour le proxy Nginx, sa base de données SQL, Medusa et 2 clients ruTorrent

  version: "3"
services:
  app:
    image: jc21/nginx-proxy-manager:2
    restart: always
    container_name : nginx-proxy-manager
    ports:
      - 80:80
      - 81:81
      - 443:443
    volumes:
      - /home/aerya/docker/nginx-proxy-manager/config/config.json:/app/config/production.json
      - /home/aerya/docker/nginx-proxy-manager/data:/data
      - /home/aerya/docker/nginx-proxy-manager/letsencrypt:/etc/letsencrypt
    depends_on:
      - db
    labels:
      - com.centurylinklabs.watchtower.enable=true
  db:
    image: mariadb
    restart: always
    container_name : mariadb
    environment:
      MYSQL_ROOT_PASSWORD: "C5rrOfE7Y3uYHoSA3fDyYE0F4YovPIFqucgXLz1hkdKYXzKEYB3R2yyM9yqbvA"
      MYSQL_DATABASE: "nginxproxymanager"
      MYSQL_USER: "nginxproxymanager"
      MYSQL_PASSWORD: "Ta418uxHVsbjluCwsDVWEsn25ijH"
    volumes:
      - /home/aerya/docker/mariadb/data/mysql:/var/lib/mysql
    labels:
      - com.centurylinklabs.watchtower.enable=true

  medusa:
    image: linuxserver/medusa
    restart: always
    container_name : medusa
	environment:
      - TZ=Europe/Paris
      - PGID=0
      - PUID=0
    volumes:
      - /home/aerya/docker/medusa:/config
      - /home/aerya/mnt:/downloads
      - /home/aerya/mnt:/tv
    labels:
      - com.centurylinklabs.watchtower.enable=true

  rutorrentall:
    image: romancin/rutorrent:latest
    restart: always
    container_name : rutorrentall
    ports:
      - 51415-51415:51415-51415
    environment:
      - TZ=Europe/Paris
      - PGID=0
      - PUID=0
    volumes:
      - /home/aerya/docker/rutorrentall:/config
      - /home/aerya/mnt:/downloads
      - /run/php:/run/php
  
  mephisto:
    image: romancin/rutorrent:latest
    restart: always
    container_name : mephisto
    ports:
      - 51416-51416:51415-51415
    environment:
      - TZ=Europe/Paris
      - PGID=0
      - PUID=0
    volumes:
      - /home/aerya/docker/mephisto:/config
      - /home/aerya/mnt:/downloads
      - /run/php:/run/php

ruTorrent-AutoDelete

docker run -d \
--restart always \
--name rutorrent-autoDLT-OLD \
-v /home/aerya/docker/rutorrent-auto-delete/OLD:/usr/src/app/config \
banixc/docker-rutorrent-auto-delete

Watchtower avec notifications par email, je vais changer pour Gotify

docker run -d \
--name watchtower \
-e TZ=Europe/Paris \
-h DRiVE \
-e PUID=0 \
-e PGID=0 \
--restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-e WATCHTOWER_NOTIFICATIONS=email \
-e [email protected] \
-e [email protected] \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.domaine.com \
-e [email protected]ine.com \
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=fvBp0NE0BoDQWP%zVrRNL2gJ62h9vfZImNJBA3mOnDEvN \
--label=com.centurylinklabs.watchtower.enable=true \
v2tec/watchtower --label-enable --cleanup --schedule "0 0 4 * * *"

Portainer. Notez le –no-analytics pour empêcher de leur filer des stats (anonymes)

docker run -d \
-p 1002:9000 \
--restart always \
--name portainer \
-v /home/aerya/docker/portainer:/data:rw \
-v /var/run/docker.sock:/var/run/docker.sock:rw \
--label=com.centurylinklabs.watchtower.enable=true \
portainer/portainer --no-analytics

ruTorrent Mondedie, dédié aux séries

docker run -dt \
--name=rutorrentseries \
--restart always \
-e HTTP_AUTH=true \
-e CHECK_PERM_DATA=false \
-p 9202:8080 \
-p 47918:45000 \
-v /home/aerya/docker/rutorrentseries:/config \
-v /home/aerya/mnt/PreSeries:/data/downloads \
-v /home/aerya/mnt/sourcetorrents/PreSeries:/data/.watch \
-v /home/aerya/docker/rutorrentseries/session:/data/.session \
--label=com.centurylinklabs.watchtower.enable=true \
mondedie/rutorrent:latest

Sonarr. Tag preview pour la V3

docker run -d \
--name=sonarrv3 \
--restart always \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Europe/Paris \
-p 4279:8989 \
-v /home/aerya/docker/sonarrv3:/config \
-v /home/aerya/mnt/unionfs:/tv \
-v /home/aerya/mnt/:/downloads \
--label=com.centurylinklabs.watchtower.enable=true \
linuxserver/sonarr:preview

Radarr

docker run -d \
--name=radarr \
--restart always \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Europe/Paris \
-e UMASK_SET=000 \
-p 7878:7878 \
-v /home/aerya/docker/radarr:/config \
-v /home/aerya/mnt/unionfs:/movies \
-v /home/aerya/mnt/:/downloads \
--label=com.centurylinklabs.watchtower.enable=true \
linuxserver/radarr

SABnzbd+

docker run -d \
--restart always \
--name=sabnzbd \
-v /home/aerya/docker/sabnzbd:/config \
-v /home/aerya/mnt:/downloads \
-v /home/aerya/mnt:/incomplete-downloads \
-e PUID=0 -e PGID=0 \
-e TZ=Europe/Paris \
-p 8077:8080 \
--label=com.centurylinklabs.watchtower.enable=true \
linuxserver/sabnzbd

Jackett

docker run -d \
--name=jackett \
-e TZ=Europe/Paris \
-e PUID=1001 \
-e PGID=1001 \
-p 9117:9117 \
--restart always \
-v /home/aerya/docker/jackett/config:/config \
-v /etc/localtime:/etc/localtime:ro \
--label=com.centurylinklabs.watchtower.enable=true \
linuxserver/jackett

Heimdall

docker run -d \
--name=heimdall \
--restart always \
-v /home/aerya/docker/heimdall:/config \
-e PUID=1000 -e PGID=1000 \
-p 55480:80 \
-p 55443:443 \
--label=com.centurylinklabs.watchtower.enable=true \
linuxserver/heimdall

Syncthing

docker run -d \
--name=syncthing \
--restart always \
-v /home/aerya/docker/syncthing:/config \
-v /home/aerya/mnt/:/mnt/downloads \
-e PUID=1000 \
-e PGID=1000 \
-e UMASK_SET=000 \
-e TZ=Europe/Paris \
-p 8384:8384 -p 22000:22000 -p 21027:21027/udp \
--label=com.centurylinklabs.watchtower.enable=true \
linuxserver/syncthing

Tautulli

docker run -d \
--name tautulli \
--restart always \
-e TZ=Europe/Paris \
-p 8181:8181 \
-v /home/aerya/docker/tautulli:/config \
-v '/home/aerya/docker/plex/Library/Application Support/Plex Media Server/Logs:/logs:ro' \
-e PUID=0 \
-e PGID=0 \
--label=com.centurylinklabs.watchtower.enable=true \
linuxserver/tautulli

ZNC via Tor

docker run -d \
--name znctor \
--restart always \
-p 1944:6667 \
-v /home/aerya/docker/znctor:/znc-data \
shastafareye/znc-tor

ZNC en clair. Mais avec une IPv4 dédiée. Pour ça il faut créer un réseau sous Docker.

docker run -d \
--name=zncuac \
--restart always \
-v /var/lib/vz/dan/docker/zncuac:/config \
-e UID=1001 -e GID=1001 \
-e TZ=Europe/Paris \
-p 1945:6501 \
--net UpAndClear \
--mac-address 00:78:56:07:b7:34 \
--ip 123.456.789.10 \
--label=com.centurylinklabs.watchtower.enable=true \
linuxserver/znc

Ubooquity

docker run -d \
--name=ubooquity \
--restart always \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Europe/Paris \
-e MAXMEM=2048 \
-p 2202:2202 \
-p 2203:2203 \
-v /home/aerya/docker/ubooquity:/config \
-v /home/aerya/mnt/unionfs/Comics:/comics \
--label=com.centurylinklabs.watchtower.enable=true \
linuxserver/ubooquity

Plex (vidéos)

docker run -d \
--name plex \
--restart always \
-p 32400:32400/tcp \
-p 33401:33401/tcp \
-p 3005:3005/tcp \
-p 8324:8324/tcp \
-p 32469:32469/tcp \
-p 1900:1900/udp \
-p 32410:32410/udp \
-p 32412:32412/udp \
-p 32413:32413/udp \
-p 32414:32414/udp \
-e PLEX_UID="0" \
-e PLEX_GID="0" \
-e TZ="Europe/Paris" \
-e PLEX_CLAIM="claim-dssdsdsdsdsd" \
-e LD_LIBRARY_PATH=/usr/lib/plexmediaserver/lib \
-e ADVERTISE_IP="http://123.456.789.10:32400/" \
-h plex.domaine.com \
-v /home/aerya/docker/plex:/config \
-v /tmp:/transcode \
-v /home/aerya/mnt/unionfs:/data \
--label=com.centurylinklabs.watchtower.enable=true \
plexinc/pms-docker:latest

Plex (musique)

docker run -d \
--name plexmusic \
--restart always \
-p 32422:32400/tcp \
-p 33411:33401/tcp \
-p 3006:3005/tcp \
-p 8325:8324/tcp \
-p 32470:32469/tcp \
-p 1901:1900/udp \
-p 32421:32410/udp \
-p 32423:32412/udp \
-p 32424:32413/udp \
-p 32425:32414/udp \
-e PLEX_UID="0" \
-e PLEX_GID="0" \
-e TZ="Europe/Paris" \
-e PLEX_CLAIM="claim-dsdsdsdsdsds" \
-e LD_LIBRARY_PATH=/usr/lib/plexmediaserver/lib \
-e ADVERTISE_IP="http://123.456.789.10:32422/" \
-h music.domaine.com \
-v /home/aerya/docker/plexmusic:/config \
-v /tmp:/transcode \
-v /home/aerya/mnt/unionfs:/data \
--label=com.centurylinklabs.watchtower.enable=true \
plexinc/pms-docker:latest

SSH-chroot. Une évolution serait d’y dédier une IPv4.

docker run -d \
--name=chroot \
--restart=always \
-p 29847:22 \
-v /home/aerya/chroot/mnt:/home \
--privileged \
soletic/ssh-chroot

AdGuardHome

docker run -d \
--restart=always \
--name adguardhome \
-v /home/aerya/docker/adguardhome/workdir:/opt/adguardhome/work \
-v /home/aerya/docker/adguardhome/confdir:/opt/adguardhome/conf \
--net=host \
-p 67:67/udp \
-p 2024:80/tcp \
-p 2025:443/tcp \
-p 853:853/tcp \
-p 3000:3000/tcp \
--label=com.centurylinklabs.watchtower.enable=true \
adguard/adguardhome

Backup

docker run -d \
--name=rsyncbackup \
--restart always \
-v /home/aerya/:/home \
-v /home/aerya/mnt/unionfs/backup:/backup \
jswetzen/rsync-backup

Ombi

docker run -d \
--name=ombi \
--restart always \
-p 4278:3579 \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Europe/Paris \
-v /home/aerya/docker/ombi:/config \
--label=com.centurylinklabs.watchtower.enable=true \
linuxserver/ombi

Scripts et articles liés

Plugins pour navigateurs

  • Pulsarr : ajouter un film ou une série à Radarr/Sonarr depuis IMDB
  • NZBunity : télécharger des .nzb automatiquement (avec catégories)
  • WebToPlex : voir si on possède un fichier depuis IMDB. Peut aussi le chercher (format .nzb).

Je pense que j’ai fait le tour. Si vous avez des questions ou des suggestions/découvertes, je suis preneur :)

(1 954 vues)
S’abonner
Notifier de
17 Commentaires
Inline Feedbacks
View all comments
wxgi
28/04/2020 14:47

Super intéressant. Merci pour le partage :)

sylvain94
28/04/2020 19:41

Bonjour,
super article que je vais relire avec attention. Peut être ajouter un dessin qui représente l’architecture de l’ensemble des conteneurs serait un plus (conteneur, volume, reseau).

jotux
28/04/2020 21:11

Et bien, c’est une sacré installation ! Et qu’en est-il des performances en téléchargements/upload ?
Merci pour le partage !

jotux
28/04/2020 21:46
Reply to  Aerya

D’accord. J’aurais cru que ajouter un stockage distant tel que google drive ajouterais vraiment une baisse de débit conséquentes. J’avais en vu une idée similaire, mais plus simple à mes yeux ;-) C’était un vps et du stockage, comme tu le fais, distant. Et en terme de coût sur la partie google drive, c’est vraiment intéressant ? Merci pour ton… Lire la suite »

jotux
29/04/2020 10:12
Reply to  Aerya

Ouai je vois, c’est bien le fait que le côté cloud, stockage objet, était plutôt limité à de la sauvegarde et archivage, qui m’inquiétais. Tu confirmes donc bien que ce n’est pas l’idéal. Bon et bien je vais rester sur mon petit dedibox 1To dans ce cas ;-) Remarque, si je peux éviter de faire gagner de l’argent au géant… Lire la suite »

Lastac
28/04/2020 21:47

Salut,
Comment gères-tu tes sous-titres pour les médias en VO ?
De mon coté j’utilise depuis quelques semaines Bazarr et j’en suis pas mal satisfait !

Twolaw
29/04/2020 14:31

Merci pour le débrief !
Y a quelques logiciels que je ne connais pas, je vais les ajouter à ma liste des Logiciels de téléchargement multimédia.

krulikop
03/05/2020 18:10

Salut merci pour ce partage super intéressant ! J’ai quelques que questions sur ton install: 1 – tu n’utilises pas traefik qui est souvent cité pour docker. Y a-t-il une raison ? 2 – Je comprends pas la nécessité des différentes instances de rtorrent, tu ne peux pas utiliser des labels et Autotools que tu utilises déja ? 3 –… Lire la suite »

payason
11/05/2020 16:28

Bonjour, pourquoi un mélange de Docker compose et Docker run ?

jbnitro
17/05/2020 01:34

Merci pour AdGuardHome je ne connaissais pas :)