Installer une seedbox avec rTorrent et rutorrent

J’ai enfin pensé à continuer ma série de mémo expliquant comment installer une seedbox. Mieux vaut tard que jamais 😀

Un petit lien vers les deux premiers billets que j’avais rédigé, ils datent un peu mais sont toujours valables :

 

 

Installer une seedbox  : Pré-requis

Ici je pars du principe que vous avez déjà installé un système d’exploitation sur votre serveur. Ici nous utilisons Debian 8

 

Installer une seedbox : Configuration des dépôts

Avant tout il va falloir commencer par configurer nos dépôts, les sources depuis lesquelles nous téléchargeons nos paquets, commençons donc par modifier les dépôts de base de notre distribution.

nano /etc/apt/sources.list

 

Par défaut il est configuré de la manière suivante

deb http://mirror.mephi.ru/debian/ jessie main 
deb-src http://mirror.mephi.ru/debian/ jessie main 

deb http://security.debian.org/ jessie/updates main 
deb-src http://security.debian.org/ jessie/updates main 

# jessie-updates, previously known as 'volatile'
deb http://mirror.mephi.ru/debian/ jessie-updates main 
deb-src http://mirror.mephi.ru/debian/ jessie-updates main

 

Ajoutons donc les dépôts contrib et non-free

deb http://mirror.mephi.ru/debian/ jessie main contrib non-free
deb-src http://mirror.mephi.ru/debian/ jessie main contrib non-free

deb http://security.debian.org/ jessie/updates main contrib non-free
deb-src http://security.debian.org/ jessie/updates main contrib non-free

# jessie-updates, previously known as 'volatile'
deb http://mirror.mephi.ru/debian/ jessie-updates main contrib non-free
deb-src http://mirror.mephi.ru/debian/ jessie-updates main contrib non-free

 

Maintenant nous pouvons ajouter de nouveaux dépôts, mais pour le faire nous aurons besoin de leur clé afin de pouvoir authentifier les paquets disponibles

wget --no-check-certificate https://www.dotdeb.org/dotdeb.gpg && apt-key add dotdeb.gpg
wget http://www.deb-multimedia.org/pool/main/d/deb-multimedia-keyring/deb-multimedia-keyring_2016.3.7_all.deb && dpkg -i deb-multimedia-keyring_2016.3.7_all.deb

 

Créons un fichier de configuration pour le dépot dotdeb

echo "#Dotdeb
deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all" >> /etc/apt/sources.list.d/dotdeb.list

 

Meme chose pour le dépôt multimédia

echo "#Deb-Multimedia
deb http://www.deb-multimedia.org jessie main non-free" >> /etc/apt/sources.list.d/deb-multimedia.list

 

Maintenant vous pouvez mettre la lise de vos paquets à jour

apt-get update

 

 

Installer une seedbox : Installation des dépendances

Ici rien de bien compliqué, nous allons installer pas mal de paquets qui seront nécessaires pour compiler rtorrent et faire tourner notre seedbox

apt-get install automake libcppunit-dev libtool build-essential pkg-config libssl-dev libcurl4-openssl-dev libsigc++-2.0-dev libncurses5-dev screen subversion apache2-utils curl php7.0 php7.0-fpm php7.0-cli php7.0-curl php7.0-geoip git unzip unrar rar zip ffmpeg buildtorrent mediainfo

 

 

Installer une seedbox : Compilation de rTorrent

Sous Debian, rTorrent est déjà disponible depuis les dépôts officiel, il est fourni avec l’interface XML-RPC nécessaire pour fonctionner avec rutorrent. Vous n’êtes donc en rien obligé de suivre les étapes de compilation sauf si comme moi vous préférez utiliser une version mise à jour de rTorrent

Pour utiliser rTorrent via une interface web, rutorrent, nous avons besoin d’utiliser XMLRPC

cd /tmp
svn checkout http://svn.code.sf.net/p/xmlrpc-c/code/stable xmlrpc-c
cd xmlrpc-c/
./configure
make -j $(nproc)
make install

 

Occupons nous maintenant de libtorrent (dernière version stable 0.13.6)

cd /tmp
git clone https://github.com/rakshasa/libtorrent.git
cd libtorrent
git checkout `git tag | tail -1`
./autogen.sh
./configure
make -j $(nproc)
make install

 

Et enfin de rTorrent (dernière version stable 0.9.6)

cd /tmp
git clone https://github.com/rakshasa/rtorrent.git
cd rtorrent
git checkout `git tag | tail -1`
./autogen.sh
./configure --with-xmlrpc-c
make -j $(nproc)
make install

 

N’oubliez pas de générer des liens symboliques pour les librairies récemment installées

ldconfig

 

 

Installer une seedbox : Installation et configuration de rutorrent

rutorrent c’est l’interface web qui nous permettra de controler rTorrent, commençons donc par le télécharger

mkdir -p /var/www/html
cd /var/www/html
git clone https://github.com/Novik/ruTorrent.git rutorrent

 

Pour rendre ruTorrent utilisable avec un mobile ou une tablette, installons un plugin

cd /var/www/html/rutorrent/plugins/
git clone https://github.com/xombiemp/rutorrentMobile.git mobile
chown -R www-data:www-data /var/www/html/rutorrent

 

Configurons maintenant le rutorrent pour qu’il utilise le paquet buildtorrent lors de la création d’un fichier torrent

nano /var/www/html/rutorrent/plugins/create/conf.php

 

Que nous configurons de la manière suivante

$useExternal = 'buildtorrent';
$pathToCreatetorrent = '/usr/bin/buildtorrent';

 

 

Installer une seedbox : Configuration de PHP

Ouvrons la configuration de PHP7

nano /etc/php/7.0/fpm/php.ini

 

Dans ce fichier, vérifiez que les variables suivantes soient configurées correctement

expose_php = Off 
file_uploads = On
post_max_size = 15M
upload_max_filesize = 15M
; En fonction de votre location
date.timezone = Europe/Paris

 

Maintenant redémarrons le service php7.0-fpm afin d’appliquer les modifications

service php7.0-fpm restart

 

 

Installer une seedbox : Installation et configuration du serveur WEB

Vous vous en doutez, une seedbox nécessite l’utilisation d’un serveur WEB – NGinx ou Apache2

 

Installer une seedbox : Installation et configuration de NGinx

Installer une seedbox : installation de NGinx

Ici nous allons installer la dernière version de NGinx (mainline). Commencons donc par ajouter la clé de signature des paquets

wget http://nginx.org/keys/nginx_signing.key && apt-key add nginx_signing.key && rm nginx_signing.key

 

Maintenant configurons le dépot

echo "#NGinx Mainline
deb http://nginx.org/packages/debian/ jessie nginx
deb-src http://nginx.org/packages/debian/ jessie nginx" >> /etc/apt/sources.list.d/nginx-mainline.list

 

Puis installons le paquet

apt-get update && apt-get install nginx

 

Installer une seedbox : Configuration de NGinx

Optimisons maintenant un peu la configuration de NGinx

mkdir /etc/nginx/auth
rm /etc/nginx/nginx.conf && nano /etc/nginx/nginx.conf

 

Voici la configuration que je vous conseille

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
 worker_connections 1024;
 multi_accept on;
 use epoll;
}

http {

 charset UTF-8;

 ##
 # Basic Settings
 ##
 server_names_hash_bucket_size 64;
 sendfile on;
 tcp_nopush on;
 tcp_nodelay on;
 keepalive_timeout 65;
 types_hash_max_size 2048;
 server_tokens off;

 # server_names_hash_bucket_size 64;
 # server_name_in_redirect off;

 include /etc/nginx/mime.types;
 default_type application/octet-stream;

 
 ##
 # Logging Settings
 ##

 access_log /var/log/nginx/access.log;
 error_log /var/log/nginx/error.log;

 ##
 # Gzip Settings
 ##

 gzip on;
 gzip_disable "msie6";
 
 gzip_vary on;
 gzip_proxied any;
 gzip_comp_level 6;
 gzip_buffers 16 8k;
 gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

 ##
 # Virtual Host Configs
 ##

 include /etc/nginx/conf.d/*.conf;
 include /etc/nginx/sites-enabled/*;
}

 

Installer une seedbox : Configuration du virtualhost

Supprimons la configuration du virtualhost par défaut et créons un virtual host pour rutorrent

rm /etc/nginx/conf.d/*.conf && mkdir /etc/nginx/sites-enabled
nano /etc/nginx/sites-enabled/seedbox

 

Avec la configuration suivante :

  • nous n’utilisons pas de domaine, vous pouvez très bien le faire en modifiant la variable server_name
  • nous redigeons les requêtes http vers https
  • dans cet exemple nous utilisons un certificat ssl auto-signé, si vous disposez de votre propre domaine, vous pouvez obtenir un certificat via let’s encrypt
  • Pour se connecter à rutorrent chaque utilisateur devra utiliser un login et un mot de passe
server {
 listen 80;
 listen [::]:80;
 # Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
 return 301 https://$host$request_uri;
}

#------------------------------------------------------------------------
# BLOCK SERVEUR HTTPS
#
server {

 listen 443 ssl http2;
 server_name seedbox; 
 root /var/www/html/rutorrent;
 index index.php index.html index.htm;

#------------------------------------------------------------------------
# SSL
#
 ssl_certificate /etc/nginx/ssl/seedbox.crt;
 ssl_certificate_key /etc/nginx/ssl/seedbox.key;

 ssl_protocols TLSv1.2;
 ssl_ciphers EECDH+CHACHA20:EECDH+AESGCM:EECDH+AES; 
 ssl_ecdh_curve secp384r1;
 ssl_prefer_server_ciphers on;

 # ssl optimizations
 ssl_session_timeout 5m;
 ssl_session_cache shared:SSL:20m;
 ssl_session_tickets on;


#------------------------------------------------------------------------
# SECURITY

 add_header X-XSS-Protection "1; mode=block";
 auth_basic "Restricted Area";
 auth_basic_user_file "/etc/nginx/auth/seedbox_auth";
  
#------------------------------------------------------------------------
# PHP
# 
 location / {
 index index.php index.html index.htm; 
 try_files $uri $uri/ /index.php?$args;
 }

 location ~ \.php$ {
 try_files $uri =404;
 fastcgi_split_path_info ^(.+\.php)(/.+)$;
 fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 include fastcgi_params; }

 location ^~ /conf/ {
 deny all;
 }

 location ^~ /share/ {
 deny all;
 }
}

 

Installer une seedbox  : Configuration SSL

Créons un répertoire qui contiendra notre certificat auto-signé

mkdir /etc/nginx/ssl

 

Dans ce répertoire, générons un certificat auto-signé

cd /etc/nginx/ssl
openssl ecparam -genkey -name secp384r1 -out seedbox.key
openssl req -new -key seedbox.key -sha256 -out seedbox.csr
openssl req -x509 -days 3650 -sha256 -key seedbox.key -in seedbox.csr -out seedbox.crt

 

Modifions les droits des fichiers

chmod 644 /etc/nginx/ssl/*.crt
chmod 640 /etc/nginx/ssl/*.key

 

 

Installer une seedbox : Installation et configuration d’Apache2

Installation d’Apache2

Installons apache2 ainsi que les modules nécessaires

apt-get install apache2 libapache2-mod-php7.0 libapache2-mod-scgi

 

Activons les modules nécessaires

a2enmod auth_digest ssl scg

 

Configuration d’Apache2

Créons les répertoires nécessaires et désactivons la configuration par défaut

mkdir /etc/apache2/auth && a2dissite 000-default

 

Configurons notre virtualhost

nano /etc/apache2/sites-available/seedbox.conf

 

Comme pour NGinx nous

  • nous n’utilisons pas de domaine, vous pouvez très bien le faire en modifiant la variable ServerName
  • nous redigeons les requêtes http vers https
  • dans cet exemple nous utilisons un certificat ssl auto-signé, si vous disposez de votre propre domaine, vous pouvez obtenir un certificat via let’s encrypt
  • Pour se connecter à rutorrent chaque utilisateur devra utiliser un login et un mot de passe
NameVirtualHost *:80
<VirtualHost *:80>
 ServerAdmin votre-email
 ServerName IP.DU.SERVEUR
 redirect / https://IP.DU.SERVEUR

</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
 ServerAdmin votre-email
 ServerName IP.DU.SERVEUR
 DocumentRoot /var/www/html/rutorrent
 
 SSLEngine On
 SSLCipherSuite EECDH+CHACHA20:EECDH+AESGCM:EECDH+AES
 SSLHonorCipherOrder on
 SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
 SSLCompression off
 SSLCertificateFile /etc/apache2/ssl/seedbox.crt
 SSLCertificateKeyFile /etc/apache2/ssl/seedbox.key
 
 
 <Directory />
 Options FollowSymLinks
 AllowOverride None
 </Directory>
 <Directory /var/www/html/rutorrent>
 Options Indexes FollowSymLinks MultiViews
 AllowOverride None
 Order allow,deny
 allow from all
 </Directory>
 
 ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
 <Directory "/usr/lib/cgi-bin">
 AllowOverride None
 Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
 Order allow,deny
 Allow from all
 </Directory>
 
 ErrorLog ${APACHE_LOG_DIR}/rutorrent-error.log
 
 # Possible values include: debug, info, notice, warn, error, crit,
 # alert, emerg.
 LogLevel warn
 
 CustomLog ${APACHE_LOG_DIR}/rutorrent-access.log combined
 
 
 <Location />
 AuthType Digest
 AuthName "seedbox"
 AuthDigestDomain /var/www/html/rutorrent/
 
 AuthDigestProvider file
 AuthUserFile /etc/apache2/auth/seedbox_auth
 Require valid-user
 SetEnv R_ENV "/var/www/html/rutorrent"
 </Location>
 
</VirtualHost>
</IfModule>

 

Activez ce vhost via la commande

a2ensite seedbox

 

Installer une seedbox  : Configuration SSL

Créons un répertoire qui contiendra notre certificat auto-signé

mkdir /etc/apache2/ssl

 

Dans ce répertoire, générons un certificat auto-signé

cd /etc/apache2/ssl
openssl ecparam -genkey -name secp384r1 -out seedbox.key
openssl req -new -key seedbox.key -sha256 -out seedbox.csr
openssl req -x509 -days 3650 -sha256 -key seedbox.key -in seedbox.csr -out seedbox.crt

 

Modifions les droits des fichiers

chmod 644 /etc/apache2/ssl/*.crt
chmod 640 /etc/apache2/ssl/*.key

 

 

Installer une seedbox : Ajout d’un utilisateur

Faites bien attention. Lorsque le nom d’utilisateur noobunbox est écrit en majuscules, vous devez faire de même

Ici nous allons ajoutez l’utilisateur : noobunbox

useradd --shell /bin/bash --create-home noobunbox
passwd noobunbox

 

Maintenant créons pour cet utilisateur les répertoires nécessaires au fonctionnement de rtorrent

mkdir -p /home/noobunbox/{torrents,watch,.session}

 

Créons un fichier de configuration rtorrent pour noobunbox

nano /home/noobunbox/.rtorrent.rc

 

Collez la configuration suivante

scgi_port = 127.0.0.1:5001
encoding_list = UTF-8
port_range = 45000-65000
port_random = no
check_hash = no
directory = /home/noobunbox/torrents
session = /home/noobunbox/.session
encryption = allow_incoming, try_outgoing, enable_retry
schedule = watch_directory,1,1,"load_start=/home/noobunbox/watch/*.torrent"
schedule = untied_directory,5,5,"stop_untied=/home/noobunbox/watch/*.torrent"
use_udp_trackers = yes
dht = off
peer_exchange = no
min_peers = 40
max_peers = 100
min_peers_seed = 10
max_peers_seed = 50
max_uploads = 15
execute = {sh,-c,/usr/bin/php /var/www/html/rutorrent/php/initplugins.php noobunbox &}
schedule = espace_disque_insuffisant,1,30,close_low_diskspace=500M

 

Puisque je suppose que vous n’avez pas crée d’utilisateur nommé noobunbox, voici une petite commande pour remplacer mon nom d’utilisateur par le votre (ici votre-utilisateur)

sed -i -e 's/noobunbox/votre-utilisateur/g' /home/votre-utilisateur/.rtorrent.rc

 

Maintenant appliquons les permissions nécessaires

chown --recursive noobunbox:noobunbox /home/noobunbox
chown root:root /home/noobunbox
chmod 755 /home/noobunbox

 

L’etape suivante dépend du programme utilisé comme serveur web, NGinx ou apache2. Vous trouverez ci-dessous les manipulations à effectuer

 

Sous NGinx

nano /etc/nginx/sites-enabled/seedbox

 

Et ajoutez le bloc suivant (le port de la variable scgi_pass pour l’utilisateur doit être le même que celui indiqué dans le fichier .rtorrent.rc)

 location /NOOBUNBOX 
{
 include scgi_params;
 scgi_pass 127.0.0.1:5001;
 auth_basic "Restricted Area"; 
 auth_basic_user_file "/etc/nginx/auth/seedbox_auth noobunbox";
 }

 

Puisque nous avons configuré NGinx pour demander un mot de passe lors de l’accès a rutorrent pour l’utilisateur noobunbox, configurons un mot de passe pour cet utilisateur.

htpasswd -c /etc/nginx/auth/seedbox_auth noobunbox

 

Protégeons un minimum ce fichier

chmod 600 /etc/nginx/auth/seedbox_auth
chown www-data:www-data /etc/nginx/auth/*

 

Créons maintenant un fichier de configuration rutorrent pour l’utilisateur noobunbox

mkdir /var/www/html/rutorrent/conf/users/noobunbox
nano /var/www/html/rutorrent/conf/users/noobunbox/config.php

 

Que nous configurons comme ci-dessous (encore une fois, le port scgi doit être le même que celui indiqué dans le fichier .rtorrent.rc et dans la configuration du vhost NGinx)

<?php

$pathToExternals['curl'] = '/usr/bin/curl';
$topDirectory = '/home/noobunbox';
$scgi_port = 5001;
$scgi_host = '127.0.0.1';
$XMLRPCMountPoint = '/NOOBUNBOX';

 

Corrigeons les permissions et redémarrons NGinx

chown -R www-data:www-data /var/www/html
service nginx restart

 

 

Sous Apache2

Commençons par éditer le fichier principal de la configuration d’apache2

nano /etc/apache2/apache2.conf

 

Ajoutez à la fin du fichier la configuration suivante (le port SCGIMount doit correspondre à celui de votre utilisateur)

ServerName localhost
SCGIMount /RPC1 127.0.0.1:5000

 

Puisque nous avons configuré Apache2 pour demander un mot de passe lors de l’accès a rutorrent, configurons un mot de passe pour notre utilisateur noobunbox. (seedbox correspond à la variable AuthName utilisé dans notre virtualhost)

htdigest -c /etc/apache2/auth/seedbox_auth seedbox noobunbox

 

Créons maintenant un fichier de configuration rutorrent pour l’utilisateur noobunbox

mkdir /var/www/html/rutorrent/conf/users/noobunbox
nano /var/www/html/rutorrent/conf/users/noobunbox/config.php

 

Que nous configurons comme ci-dessous (encore une fois, le port scgi doit être le même que celui indiqué dans le fichier .rtorrent.rc et dans la configuration générale d’Apache2)

<?php

$pathToExternals['curl'] = '/usr/bin/curl';
$topDirectory = '/home/noobunbox';
$scgi_port = 5001;
$scgi_host = '127.0.0.1';
$XMLRPCMountPoint = '/RPC1';

 

Corrigeons les permissions et redémarrons Apache2

chown -R www-data:www-data /var/www/html
service apache2 restart

 

 

Installer une seedbox : Configuration du Service rTorrent

Nous allons maintenant créer et configurer un script afin que rtorrent soit lancé par cet utilisateur

cd /etc/init.d/
touch noobunbox-rtorrent
chmod +x noobunbox-rtorrent

 

Configurons le script

nano noobunbox-rtorrent

 

Remplacez noobunbox par votre nom d’utilisateur

#!/usr/bin/env bash

# Dépendance : screen, killall et rtorrent
### BEGIN INIT INFO
# Provides: <username>-rtorrent
# Required-Start: $syslog $network
# Required-Stop: $syslog $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Start-Stop rtorrent user session
### END INIT INFO

## Début configuration ##
user="noobunbox"
## Fin configuration ##

rt_start() {
 su --command="screen -dmS ${user}-rtorrent rtorrent" "${user}"
}

rt_stop() {
 killall --user "${user}" screen
}

case "$1" in
start) echo "Starting rtorrent..."; rt_start
 ;;
stop) echo "Stopping rtorrent..."; rt_stop
 ;;
restart) echo "Restart rtorrent..."; rt_stop; sleep 1; rt_start
 ;;
*) echo "Usage: $0 {start|stop|restart}"; exit 1
 ;;
esac
exit 0

 

Nous souhaitons que ce script soit exécuté au démarrage du serveur

update-rc.d noobunbox-rtorrent defaults

 

La configuration de votre premier utilisateur est terminée. Si vous souhaitez ajouter un second utilisateur vous devrez répéter cette manipulation. N’oubliez pas que chaque utilisateur doit avoir un port scgi différent !

Il ne vous reste plus qu’à lancer votre seedbox via la commande suivante

service noobunbox-rtorrent start

 

Maintenant connectez-vous sur l’ip de votre seedbox (en HTTPS). Tout devrait fonctionner.

 

Merci à Francois pour la relecture 🙂

 

Source