Seedbox basée sur Transmission
Le but de ce post est de déployer sur son serveur dédié une seedbox. Pour ceux qui ne connaissent pas, une seedbox est un serveur privé utilisé pour le partage de fichiers numériques. L’avantage d’utiliser un serveur dédié est de disposer d’une bande passante importante (100Mbps ou plus) et symétrique, ce qui permet des chargements et/ou de diffuser (seed) ses propres fichiers très rapidement. Je sais on trouve déjà pas mal de tutos sur le net, mais là il s’agit de ne pas faire les choses à moitié. Je propose ici de mettre en place :
- une seedbox basée sur le protocole BitTorrent
- une interface web de contrôle
- h5ai, une interface web « clean » pour le rapatriement de fichiers
- le tout sécurisé par contrôle d’accès et chiffrement SSL
Et afin de créer le meilleur tuto possible, toutes les configurations ont été passées sur un VPS Classic d’OVH à 2.39€ par mois fraîchement installé. J’ai même utilisé Dyn pour faire pointer le dns seedbox-bt.writesthisblog.com
sur le VPS. Ne cherchez pas, au moment où vous lirez ces lignes, le domaine n’existera plus et le vps aura été reformaté. En attendant, soyez assuré que toute la configuration fonctionne, au nom de domaine près que vous aurez à changer bien évidemment. Question performances, j’ai obtenu sans problème des pointes de download à 12Mo/s, tout dépend, bien sûr, de la popularité du torrent.
Environnement
OS : Debian 7.5 stable (Wheezy) 64bits
Nginx : nginx/1.2.1
PHP : 5.4.4
Transmission : 2.52
Pré-Requis
Quelques packages nécessaires à l’installation complète de la seedbox.
1 2 | root@seedbox-bt:~# apt-get update && apt-get upgrade root@seedbox-bt:~# apt-get install unzip nginx php5-fpm apache2-utils |
J’ai essayé de garder les packages à installer au strict minimum ce qui me semble une bonne pratique. Unzip et apache2-utils peuvent être enlevés une fois l’installation terminée.
Installation de Transmission
La première étape consiste à installer Transmission. Il s’agit d’un client BitTorrent léger et open-source. Debian wheezy fourni dans ses repository la version 2.52 à l’heure où j’écris ces lignes. L’installation est donc très simple, il vous suffit de passer les lignes suivantes dans le shell:
1 | root@seedbox-bt:~# apt-get install transmission-daemon |
Les paramètres de configurations se trouvent dans le fichier /var/lib/transmission-daemon/info/settings.json
. Vous pouvez les modifier en fonction de vos besoins et de la capacité du serveur, mais seulement deux sont importants à changer ici :
1 2 | "rpc-authentication-required": false, "rpc-bind-address": "127.0.0.1", |
Il ne vous reste plus qu’à recharger la configuration avec un service transmission-daemon reload
. Attention à ne pas utiliser un restart ou stop avant, sous peine d’écraser vos modifications ! La commande suivante vous permet de confirmer le bon fonctionnement :
1 2 3 4 5 6 | root@seedbox-bt:~# netstat -ntpul | grep transmission tcp 0 0 127.0.0.1:9091 0.0.0.0:* LISTEN 5373/transmission-d tcp 0 0 0.0.0.0:51413 0.0.0.0:* LISTEN 5373/transmission-d tcp6 0 0 :::51413 :::* LISTEN 5373/transmission-d udp 0 0 0.0.0.0:51413 0.0.0.0:* 5373/transmission-d udp6 0 0 2001:41d0:xx:xxx::51413 :::* 5373/transmission-d |
L’interface de transmission écoute sur le port 9091 et il est très important qu’elle soit liée au localhost (127.0.0.1) pour des raisons de sécurité.
Installation Web h5ai
Nous allons maintenant installer l’interface web h5ai qui servira à récupérer, via son navigateur, les fichiers téléchargés. Sur ce lien se trouve un exemple de h5ai, c’est beau non? Et oui, elle génère aussi des QR Code !! Ceci dit, elle pose quelques difficultés pour la configuration web, notamment, elle ne supporte pas du tout les alias et configurations un peu évoluées. Il faut donc la charger directement à l’intérieur du répertoire de « download » de transmission avec pour « root directory » le répertoire contenant « download ».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | root@seedbox-bt:~# cd /var/lib/transmission-daemon/downloads/ root@seedbox-bt:/var/lib/transmission-daemon/downloads# wget http://release.larsjung.de/h5ai/h5ai-0.24.1.zip --2014-05-02 00:32:06-- http://release.larsjung.de/h5ai/h5ai-0.24.1.zip Resolving release.larsjung.de (release.larsjung.de)... 95.143.172.102 Connecting to release.larsjung.de (release.larsjung.de)|95.143.172.102|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 476161 (465K) [application/zip] Saving to: `h5ai-0.24.1.zip' 100%[==============================================================================================================>] 476,161 --.-K/s in 0.09s 2014-05-02 00:32:07 (5.11 MB/s) - `h5ai-0.24.1.zip' saved [476161/476161] root@seedbox-bt:/var/lib/transmission-daemon/downloads# unzip ./h5ai-0.24.1.zip root@seedbox-bt:/var/lib/transmission-daemon/downloads# rm ./h5ai-0.24.1.zip |
La configuration par défaut est bonne telle quelle. Mais on peut toujours aller l’ajuster, selon ses goûts, dans le fichier /var/lib/transmission-daemon/downloads/_h5ai/conf/options.json
.
Pré-requis Nginx pour la Sécurité
Il s’agit maintenant de créer les certificats SSL et le fichier de mots de passe pour contrôler l’accès en https à l’interface web de la seedbox. Dans ce tuto, ils sont placés dans le répertoire /etc/nginx/secu/
.
Pour créer les mots de passe, j’utilise htpasswd
fourni dans le package debian apache2-utils. L’option -c crée le fichier contenant les mots de passe. Enlevez l’option -c
pour rajouter des utilisateurs supplémentaires, sous peine d’écraser les précédents déjà saisis. Cela permet un meilleur contrôle si vous partagez votre seedbox, les noms des utilisateurs apparaissant dans les logs nginx. De plus, les révocations sont simples, il suffit d’éditer le fichier avec nano ou vi.
1 2 3 4 5 6 7 8 9 10 11 12 | root@seedbox-bt:~# mkdir /etc/nginx/secu root@seedbox-bt:~# htpasswd -c /etc/nginx/secu/password-transmission phil New password: Re-type new password: Adding password for user phil root@seedbox-bt:~# htpasswd /etc/nginx/secu/password-transmission user1 New password: Re-type new password: Adding password for user user1 root@seedbox-bt:~# cat /etc/nginx/secu/password-transmission phil:$apr1$TVQWVJ0e$3Xgk2x74pHboqqch9JdTE1 user1:$apr1$h1N1jeEG$N7B5g5e7J/0DQY8JItdOA0 |
Je vous renvoie à ce précédent tuto pour plus de détails concernant la création des certificats.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | root@seedbox-bt:~# nano ./create_cert root@seedbox-bt:~# chmod a+x ./create_cert root@seedbox-bt:~# ./create_cert transmission 1095 Generating server key Generating certificate request You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:FR State or Province Name (full name) [Some-State]: Locality Name (eg, city) []:Roubaix Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []:Seedbox-BT Common Name (e.g. server FQDN or YOUR name) []:seedbox-bt.writethisblogs.com Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:1234 An optional company name []:phil.writesthisblog.com Generating certificate Signature ok subject=/C=FR/ST=Some-State/L=Roubaix/O=Internet Widgits Pty Ltd/OU=Seedbox-BT/CN=seedbox-bt.writethisblogs.com Getting Private key transmission.key: votre cle privee transmission.crt: votre certificat serveur root@seedbox-bt:~# mv ./transmission.* /etc/nginx/secu/ |
On ne le répétera jamais assez, les mots de passe et certificats n’ont d’intérêt que s’il restent privés. Il ne doivent donc être lisibles que par l’utilisateur root ou le process nginx.
1 2 3 4 5 6 7 8 9 | root@seedbox-bt:~# chmod 600 /etc/nginx/secu/* root@seedbox-bt:~# chown www-data. /etc/nginx/secu/password-transmission root@seedbox-bt:~# ls -alh /etc/nginx/secu/ total 20K drwxr-xr-x 2 root root 4.0K May 2 00:55 . drwxr-xr-x 6 root root 4.0K May 2 00:42 .. -rw------- 1 www-data www-data 87 May 2 00:49 password-transmission -rw------- 1 root root 1.3K May 2 00:54 transmission.crt -rw------- 1 root root 1.7K May 2 00:52 transmission.key |
Configuration Nginx
Quelques explications concernant cette configuration à placer dans le fichier /etc/nginx/sites-available/transmission
- Le premier bloc
server
, qui écoute sur le port 80, permet de transformer les requêtes http en https - Les auth_basic permettent l’authentification par mots de passe
- Les 3 premiers blocs
location
passent les requêtes vers l’interface transmission - Le bloc
location ~ \.php
interprête le code php de h5ai - Le bloc
location /downloads
permet d’afficher le contenu du répertoire downloads
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | root@seedbox-bt:~# cat /etc/nginx/sites-available/transmission server { listen 80; server_name seedbox-bt.writesthisblog.com; return 301 https://seedbox-bt.writesthisblog.com$request_uri; } server { listen 443 ssl; server_name seedbox-bt.writesthisblog.com; access_log /var/log/nginx/transmission_access.log; error_log /var/log/nginx/transmission_error.log; # gere le controle d acces a l interface transmission auth_basic "Veuillez-vous authentifier"; auth_basic_user_file /etc/nginx/secu/password-transmission; # See https://wiki.mozilla.org/Security/Server_Side_TLS#Nginx ssl_certificate /etc/nginx/secu/transmission.crt; ssl_certificate_key /etc/nginx/secu/transmission.key; ssl_session_timeout 5m; ssl_protocols TLSv1.1 TLSv1.2; ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; # passe le Header Transmission-Session location / { proxy_read_timeout 300; proxy_pass_header X-Transmission-Session-Id; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # passe en reverse proxy vers l interface rpc de transmission sur le port 9091 par defaut proxy_pass http://127.0.0.1:9091/transmission/web/; } # Specifique a transmission location /rpc { proxy_pass http://127.0.0.1:9091/transmission/rpc; } location /upload { proxy_pass http://127.0.0.1:9091/transmission/upload; } location ~ \.php { root /var/lib/transmission-daemon; try_files $uri $uri/ /downloads/_h5ai/server/php/index.php; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index /downloads/_h5ai/server/php/index.php; } location /downloads { # autorise le listing du repertoire de download de transmission autoindex on; # definit le root directory et verifie l existence avant de renvoyer vers h5ai root /var/lib/transmission-daemon; try_files $uri $uri/ /downloads/_h5ai/server/php/index.php; # va chercher en index l interface h5ai index /downloads/_h5ai/server/php/index.php; } } |
Il ne vous reste plus qu’à désactiver le serveur par défaut de nginx et activer la configuration de votre seedbox.
1 2 3 | root@seedbox-bt:~# ln -s /etc/nginx/sites-available/transmission /etc/nginx/sites-enabled/transmission root@seedbox-bt:~# rm /etc/nginx/sites-enabled/default root@seedbox-bt:~# service nginx reload |
Resultats
Vous pouvez maintenant aller dans votre navigateur préféré et vous connecter à votre seedbox avec les urls seedbox-bt.writesthisblog.com
pour obtenir l’interface de transmission:
Et seedbox-bt.writesthisblog.com/downloads
pour récupérer les fichiers.
Transmission Remote GUI
Transmission Remote GUI permet de contrôler depuis une GUI locale transmission. Elle fonctionne bien sûr avec notre configuration. Il suffit d’activer le SSL et définir le « RPC Path » comme /rpc
Portabilité sur les autres Linux
Ces configurations sont assez indépendantes du linux utilisé. Je les ai testées ici sur un VPS, mais j’utilise une config très similaire sur mon serveur dédié physique sans aucun problème. Sans aller jusqu’à y mettre ma main à couper, je pense que cela devrait aussi fonctionner tel quel sur Ubuntu. Par contre, pour les autres versions CentOS, Gentoo, Fedora, etc. il n’est pas impossible qu’il y ait quelques adaptations à faire, notamment sur les répertoires utilisés par transmission.
Pour Aller plus Loin
Firewall et iptables: les ports à ouvrir sur la seedbox sont 80/tcp et 443/tcp pour nginx, et 51413 en upd/tcp et IPv4/v6 pour Transmission par défaut.
Vous l’aurez constaté, la version de transmission dans les packages debian (2.52) présente quelques erreurs d’affichage corrigées à la version 2.70. En attendant, on peut les corriger manuellement (tickets #4987 et #5008) avec:
1 2 | root@seedbox-bt:~# sed -i "s/setTextContent/setInnerHTML/g" /usr/share/transmission/web/javascript/torrent-row.js root@seedbox-bt:~# sed -i "s/\&\#8203\;/\xe2\x80\x8b/g" /usr/share/transmission/web/javascript/file-row.js |
Il manque quelques fonctionnalités à l’interface h5ai, vous pouvez le constater en allant sur seedbox-bt.writesthisblog.com/downloads/_h5ai/index.html
. Elles sont optionnelles, mais si vous souhaitez les rajouter :
Pour le cache
1 | root@seedbox-bt:~# chown www-data. /var/lib/transmission-daemon/downloads/_h5ai/cache/ |
Pour les « Images Thumbs » et le « Shell Zip »
1 | root@seedbox-bt:~# apt-get install php5-gd zip |
Pour les « PDF Thumb » (assez volumineux)
1 | root@seedbox-bt:~# apt-get install imagemagick |
Pour les « Movie thumbs » (assez volumineux)
1 | root@seedbox-bt:~# apt-get install ffmpeg |
Paramètres de Transmission
La quasi totalité des paramètres de transmission sont accessibles depuis l’interface web. Je pense que ceux par défaut ne sont pas trop mal pour un VPS, je recommanderais juste de définir le Stop seeding at ratio
à une valeur de votre choix. Par contre, n’hésitez pas à augmenter dans le fichier /var/lib/transmission-daemon/info/settings.json
la valeur du cache pour optimiser les I/O disques:
1 | "cache-size-mb": 25, |
Vous pouvez aussi changer les ports par défaut de transmission, voir utiliser des ports aléatoires. Le port 51413 de transmission est connu et votre hébergeur ne manquera pas de le voir dans ses statistiques réseau. par contre, n’oubliez pas d’adapter votre configuration iptables en conséquence.
Pour Conclure
Vous avez maintenant une seedbox à disposition et assez bien sécurisée pour 2,39€ par mois. Et je dois avouer avoir été agréablement surpris par les débits réels proche des 100 Mbps même si l’espace disque disponible se limite à 9,4Go une fois tout installé. Bien sûr, vous pouvez toujours upgrader votre VPS, ceci dit, vu les premiers prix des offres Kimsufi, autant passer rapidement à un véritable serveur dédié avec 500Go de disque dur et de meilleures performances.
Et bien sûr, cela va sans dire, vous êtes priés de ne partager que du contenu légal !!
Une pensée sur “Seedbox basée sur Transmission”