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 rend vite compte qu’elle est liée à son environnement et n’est pas facilement modifiable. Alors faut-il la recréer à chaque fois que l’on doit 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 :

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 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 projets 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 est indispensable, il faudra disposer du dépôt wheezy-backports :

nano /etc/apt/sources.list

Ajoutez  le dépôt suivant :

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

Mettez à jour les paquets puis installer l’image et redémarrez le serveur :

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

Après le redémarrage du système, préparez-vous à l’installation de docker :

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

Créez deux répertoires 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, modifiez 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="

Rendez-vous 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 && 

Lancez le build de docktorrent  :

docker build -t docktorrentuser1 .

Après compilation, exécutez 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 ajoutez un autre utilisateur il faut reproduire la manipulation précédente pour nos utilisateurs  :

nano config/rtorrent/.rtorrent.rc

Modifiez le couple d’identifiants pour le nouvel utilisateur2 :

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

Recréez le build avec un nouveau nom :

docker build -t docktorrentuser2 .

Lancez le 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 downloads 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échargez l’image du projet (:latest par défaut)

docker pull plexinc/pms-docker
Info : Il existe plusieurs TAG disponibles 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:plexpas

La différence réside dans le fait qu’à chaque redémarrage de mon conteneneur Plex (:plexpass) celui-ci se mettra à jour automatiquement si une version plus récente est disponible.  Quant à la version « :latest », celle-ci ne se mettra pas à jour mais la version « :public » fait apparement la même 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 nécessaire 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 dockers 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 !