Création d'une seedbox : rutorrent et plex sous docker

Mise à jour de l'article le 5 mars 2017 : modification script rutorrent et modification du projet plex docker

Création d'une seedbox : rutorrent et plex sous docker

Le changement de serveurs dédiés est une pratique devenue courante. Au fil du temps, nous nous adaptons aux offres du marché car elles évoluent et sont généralement plus intéressantes d'une année à l’autre. La tendance est de payer toujours moins cher tout en gardant une configuration matérielle de bonne facture. La seedbox se veut toujours moins chère pour plus de puissance !

Mais quand survient le moment de la première configuration, on se rends vite compte qu'elle est liée à son environnement et n'est pas facilement modifiable. Alors combien de fois allez-vous la recréer ? Autant de fois que vous allez devoir changer de serveur ? Le but de cet article est d'utiliser la puissance de docker afin de résoudre cette problématique.

Rappelons que la configuration d'une seedbox contient généralement deux services :

  • le serveur de téléchargement d'un coté (exemple : rutorrent, deluge, transmission...)
  • le serveur de streaming de l'autre (exemple : Plex, kodi...)
Info! Un serveur sftp ou bien ftpes peut aussi être mis en place, mais je ne l'évoquerai pas dans mon article.

Découvrez par vous-même :

  1. Docker avec : "dockertorrent" et "pms-docker"
  2. La préparation de l'environnement sous Debian 8
  3. L’exécution et la configuration de "dockertorrent"
  4. L’exécution et la configuration de "pms-docker"

Docker avec "dockertorrent" et "pms-docker"

Docker isole les processus dans des containers, il est de loin la meilleure solution pour déployer plus rapidement et facilement ses projets. Il garantit aussi une sécurité accrue ainsi qu'une stabilité et une évolution sans précédent ! Il se base entièrement sur la puissance de Linux. Pour l'article suivant, je vais utiliser deux projets docker existants :

  1. Le premier est nommé "docktorrent" de l'auteur kfei qui contient rtorrent avec rutorrent.
  2. Le second est "pms-docker" de plex lui même (enfin!) qui contient le serveur PMS (PlexMediaServer).
Info! Nous serons désormais capables de déployer une seedbox en 5 minutes après notre première compilation. L'article suivant est issué de projet ouverts sur le web, je décline toute responsabilité en cas de mauvaise usages.

La préparation de l'environnement sous Debian 7

Avant de démarrer, l'installation des pré-requis sont indispensable, il faudra disposer du dépôt "wheezy-backports" :

nano /etc/apt/sources.list

Ajoutons  le dépôt suivant :

deb http://http.debian.net/debian wheezy-backports main

Nous  allons mettre à jour les paquets puis installer l'image et redémarrer le serveur :

apt-get update && apt-get install -t wheezy-backports linux-image-amd64 && reboot

Après le redémarrage du système, préparons-nous à l'installation de docker :

apt-get install curl git && curl -sSL https://get.docker.com/ | sh

Créons deux répertoire afin d'accueillir l'emplacement des données de nos deux utilisateurs :

mkdir /home/seedbox/user1 && mkdir /home/seedbox/user2

L’exécution et la configuration de "docktorrent"

Cloner le projet docktorrent avec git :

git clone https://github.com/kfei/docktorrent

Rendez-vous dans l'archive :

cd docktorrent

A ce moment, modifions le fichier de configuration de rtorrent :

nano config/rtorrent/.rtorrent.rc

Personnellement, je commente les lignes 23 et 24, car je ne souhaite pas déplacer mes fichiers après le téléchargement :

#system.method.insert = d.get_finished_dir,simple,"cat=/rtorrent/finished/,$d.get_custom1="
#system.method.set_key = event.download.finished,move_complete,"d.set_directory=$d.get_finished_dir=;execute=mkdir,-p,$d.get_finished_dir=;execute=mv,-u,$d.get_base_path=,$d.get_finished_dir="

Rendons-nous dans le fichier "Dockerfile" et modifions le couple d'identifiants :

RUN htpasswd -cb /usr/share/nginx/html/rutorrent/.htpasswd user1 passworduser1

Avant de lancer la compilation, une erreur apparaît depuis Décembre 2016 lors la compilation du conteneur :

xmlrpc_libxml2.c: In function 'xml_init':
xmlrpc_libxml2.c:61:29: warning: unused parameter 'envP' [-Wunused-parameter]
 xml_init(xmlrpc_env * const envP) {
                             ^
xmlrpc_libxml2.c: At top level:
xmlrpc_libxml2.c:430:20: error: unknown type name 'xmlParserCtx'
 removeDocSizeLimit(xmlParserCtx * const parserP ATTR_UNUSED) {
                    ^
xmlrpc_libxml2.c:455:14: error: unknown type name 'xmlParserCtx'
              xmlParserCtx ** const parserPP) {
              ^
xmlrpc_libxml2.c: In function 'xml_parse':
xmlrpc_libxml2.c:491:5: warning: implicit declaration of function 'createParser' [-Wimplicit-function-declaration]
     createParser(envP, &context, &parserP);
     ^
make[1]: *** [xmlrpc_libxml2.o] Error 1
/usr/local/src/xmlrpc-c/common.mk:336: recipe for target 'xmlrpc_libxml2.o' failed
make[1]: Leaving directory '/usr/local/src/xmlrpc-c/src'
/usr/local/src/xmlrpc-c/common.mk:375: recipe for target 'src/all' failed
make: *** [src/all] Error 2
The command '/bin/sh -c build_deps="automake build-essential ca-certificates libc-ares-dev libcppunit-dev libtool";     build_deps="${build_deps} libssl-dev libxml2-dev libncurses5-dev pkg-config subversion wget";     set -x &&     apt-get update && apt-get install -q -y --no-install-recommends ${build_deps} &&     wget http://curl.haxx.se/download/curl-7.39.0.tar.gz &&     tar xzvfp curl-7.39.0.tar.gz &&     cd curl-7.39.0 &&     ./configure --enable-ares --enable-tls-srp --enable-gnu-tls --with-zlib --with-ssl &&     make &&     make install &&     cd .. &&     rm -rf curl-* &&     ldconfig &&     svn --trust-server-cert checkout https://svn.code.sf.net/p/xmlrpc-c/code/stable/ xmlrpc-c &&     cd xmlrpc-c &&     ./configure --enable-libxml2-backend --disable-abyss-server --disable-cgi-server &&     make &&     make install &&     cd .. &&     rm -rf xmlrpc-c &&     ldconfig &&     wget -O libtorrent-$VER_LIBTORRENT.tar.gz https://github.com/rakshasa/libtorrent/archive/$VER_LIBTORRENT.tar.gz &&     tar xzf libtorrent-$VER_LIBTORRENT.tar.gz &&     cd libtorrent-$VER_LIBTORRENT &&     ./autogen.sh &&     ./configure --with-posix-fallocate &&     make &&     make install &&     cd .. &&     rm -rf libtorrent-* &&     ldconfig &&     wget -O rtorrent-$VER_RTORRENT.tar.gz https://github.com/rakshasa/rtorrent/archive/$VER_RTORRENT.tar.gz &&     tar xzf rtorrent-$VER_RTORRENT.tar.gz &&     cd rtorrent-$VER_RTORRENT &&     ./autogen.sh &&     ./configure --with-xmlrpc-c --with-ncurses &&     make &&     make install &&     cd .. &&     rm -rf rtorrent-* &&     ldconfig &&     mkdir -p /usr/share/nginx/html &&     cd /usr/share/nginx/html &&     mkdir rutorrent &&     curl -L -O https://github.com/Novik/ruTorrent/archive/master.tar.gz &&     tar xzvf master.tar.gz -C rutorrent --strip-components 1 &&     rm -rf *.tar.gz &&     apt-get purge -y --auto-remove ${build_deps} &&     apt-get autoremove -y' returned a non-zero code: 2

Il suffit de remplacer dans le Dockerfile, l'URL svn de la ligne 24   :

svn --trust-server-cert checkout https://svn.code.sf.net/p/xmlrpc-c/code/super_stable/ xmlrpc-c && \

Lancons le build de docktorrent  :

docker build -t docktorrentuser1 .

Après compilation, exécutons "docktorrentuser1" :

    docker run -it \
    -p 80:80 -p 45566:45566 -p 9527:9527/udp \
    --dns 8.8.8.8 \
    -v /home/seedbox/user1:/rtorrent \
    -e UPLOAD_RATE=1024 \
    --name docktorrentuser1 \
    -d \
    docktorrentuser1

Pour ajoutons un autre utilisateur, puis la solution consiste à reproduire la manipulation précédente pour nos utilisateurs  :

nano config/rtorrent/.rtorrent.rc

Modifions le couple d'identifiants pour le nouvel utilisateur2 :

RUN htpasswd -cb /usr/share/nginx/html/rutorrent/.htpasswd user2 passworduser2

On recréer notre  build avec un nouveau nom :

docker build -t docktorrentuser2 .

On lance notre docker pour "user2" sur le port 81 de notre hôte en modifiant les ports :

 docker run -it \
    -p 81:80 -p 45567:45566 -p 9528:9527/udp \
    --dns 8.8.8.8 \
    -v /home/seedbox/user2:/rtorrent \
    -e UPLOAD_RATE=1024 \
    --name docktorrentuser2 \
    -d \
    docktorrentuser2

Dans mon cas, je monte le dossier "download" dans celui des utilisateurs avec la commande suivante :

mount --bind /home/seedbox/downloads/ /home/seedbox/user1/downloads

L’exécution et la configuration de "pms-docker"

Téléchargons l'image du projet (:latest par défaut)

docker pull plexinc/pms-docker
Info! Il existe plusieurs TAG disponible sur l'image docker de PLEX comme : latest,public,plexpass

Dans mon cas, je suis premium plex lifetime depuis 2013 j'utilise donc le tag : plexpass :

docker pull plexinc/pms-docker:plexpass

La différence réside dans le fait qu'a chaque redémarrage de mon conteneneur Plex (:plexpass) celui-ci ce mettra à jour automatiquement si une version plus récente est disponible.  Quand à la version ":latest" celui ci ne ce mettra pas à jour, mais la version ":public" fait apparement la meme chose.

Executer le docker plex  de la façon suivante :

docker run --name plex -p 32400:32400/tcp -e TZ="Europe/Paris" -e PLEX_CLAIM="claim-veFRSmSwMgpQEV1USsjE"-e -h plex.kassianoff.fr -v /home/seedbox/plex_config/:/config -v /home/seedbox/downloads/:/data plexinc/pms-docker:plexpass

Rendez-vous à l'adresse suivante : https://plex.tv/claim  car dans les paramétres il faut retenir qu'un token est necessaire pour authentifier votre conteneur :

PLEX_CLAIM="claim-veFRSmSwMgpQEV1USsjE"

Pour finaliser la configuration du Serveur Plex, connectez-vous en SSH au serveur exemple suivant  : Accès "PMS" sans interface graphique !  Je vous invite désormais à vérifier que vos conteneurs docker fonctionnent comme ceci :

docker ps
CONTAINER ID        IMAGE                          COMMAND                CREATED             STATUS              PORTS                                                                            NAMES
8afb950273f4        docktorrentuser1:latest   "/usr/local/bin/dock   2 days ago         Up 2 days          0.0.0.0:80->80/tcp, 0.0.0.0:9527->9527/udp, 9527/tcp, 0.0.0.0:45566->45566/tcp   docktorrentuser1
b6d9446d42d1        docktorrentuser2:latest   "/usr/local/bin/dock   2 days ago         Up 2 days          9527/tcp, 0.0.0.0:81->80/tcp, 0.0.0.0:9528->9527/udp, 0.0.0.0:45567->45566/tcp   docktorrentuser2
b94927f31cd4        plex:plexpass             "/start.sh"            2 days ago         Up 2 days          0.0.0.0:32400->32400/tcp                                                         plexseedbox

Pour une meilleure sécurité, utilisez un reverse proxy vers vos docker comme par exemple Pound.
Voici ma configuration pour deux sous-domaines "user1" et "user2" vers l'interface bridge de docker :

ListenHTTPS
        Address 62.XXX.XXX.XXX
        Port 443
        Cert "/etc/pound/ssl/www/user1.pem"
        Cert "/etc/pound/ssl/www/user2.pem"
        AddHeader "X-Forwarded-Proto: https"
        ## allow PUT and DELETE also (by default only GET, POST and HEAD)?:
        xHTTP           2
        Service
                HeadRequire "Host: .*user1.kassianoff.fr.*"
                BackEnd
                        Address 172.17.42.1
                        Port    80
                End
        End
        Service
                HeadRequire "Host: .*user2.kassianoff.fr.*"
                BackEnd
                        Address 172.17.42.1
                        Port 81
                End
        End
End

Pour générer un certificat SSL autosigné  : http://doc.ubuntu-fr.org/tutoriel/comment_creer_un_certificat_ssl

Success! Vous êtes désormais prêt à partager toutes les distributions Linux du moment avec votre superbe seedbox, et à diffuser vos vidéos de famille sur Plex. Amusez-vous bien !

 

Commentaires