[Linux] Installation de Pyload un gestionnaire de téléchargement en python

Pyload est un gestionnaire de téléchargement direct (à l’instar de Jdownloader) développé en python.

Il est administrable depuis une interface web et ne nécessite pas forcément une interface graphique pour fonctionner.

Cet article décrit une installation sur serveur headless (Odroid XU4) basé sur Debian et sans interface graphique, avec mise en place d’un reverse proxy pour accéder à l’interface web depuis l’extérieur.

Pré-requis

  • Un système ayant accès à Internet 
  • Des droits sudo pour administrer le système (installer des paquets, modifier des fichiers de conf, etc..). Je conseille de se loguer temporairement en root pour effectuer toute l’installation, ça évitera d’être embêté pour des problèmes de droits sur certaines actions.
  • Être à l’aise sous Linux. J’ai tenté d’écrire un article le plus générique possible mais chacun possède son propre système et sa configuration (par exemple ici je suis sur Debian et j’utilise nginx, peut être que vous êtes sur CentOS et vous utilisez apache). Je ne peux pas détailler tous les cas de figures et prendre en compte toutes les erreurs rencontrées par chacun pendant l’installation, il faut savoir s’adapter. Je reste néanmoins disponible dans l’espace commentaire si vous êtes bloqué.

L’installation ci-dessous est effectuée sur une distribution basée sur Debian, si vous êtes sur une distribution différente (famille RedHat par ex) il faudra vous adapter pour trouver des paquets équivalents (notamment les dépendances python).

Préparation 

  • Créer un utilisateur ‘pyload’, c’est lui qui sera dédié à exécuter pyload :
useradd -s /usr/sbin/nologin -d /home/pyload -m pyload
  • Installer les dépendances pour pyload, qui est script python soit dit en passant, c’est pour cela qu’on installe des dépendances liées à python :
apt install python-support python-crypto python-pycurl tesseract-ocr tesseract-ocr-eng python-imaging
  • Installer spidermonkey (moteur Javascript), certains préconisent d’installer rhino mais ce dernier tourne sous Java et… Java a tendance à gobber de la mémoire… bref je déconseille.

Il faut trouver la bonne version de spidermonkey à installer, car celle-ci peut être différente suivant la distribution. Pour cela faire une recherche dans les paquets disponibles à l’installation et repérer les version proposées :

apt-cache search libmozjs-*
libgjs0g - Mozilla-based javascript bindings for the GNOME platform
libmozjs-17.0-0 - Spidermonkey javascript engine
libmozjs-17.0-0-dbg - Spidermonkey javascript engine (debug symbols)
libmozjs-17.0-bin - Spidermonkey javascript shell
libmozjs-17.0-bin-dbg - Spidermonkey javascript shell (debug symbols)
libmozjs-17.0-dev - Spidermonkey javascript library - development headers
libmozjs-24-0 - Spidermonkey JavaScript engine
libmozjs-24-0-dbg - Spidermonkey JavaScript engine (debug symbols)
libmozjs-24-bin - Spidermonkey JavaScript shell
libmozjs-24-bin-dbg - Spidermonkey JavaScript shell (debug symbols)
libmozjs-24-dev - Spidermonkey JavaScript library - development headers
libmozjs-52-0 - SpiderMonkey JavaScript library
libmozjs-52-dev - SpiderMonkey JavaScript library - development headers
libmozjs-60-0 - SpiderMonkey JavaScript library
libmozjs-60-dev - SpiderMonkey JavaScript library - development headers
libmozjs185-1.0 - SpiderMonkey JavaScript engine
libmozjs185-dev - SpiderMonkey JavaScript library - development headers

Nous avons besoin du moteur JS (Spidermonkey JavaScript engine) et du binaire associé (Spidermonkey javascript shell). Ici la version 24 étant la dernière proposant ces deux paquets, on l’installe :

apt install libmozjs-24-0 libmozjs-24-bin
ln -sf /usr/bin/js24 /usr/bin/js

Installation de pyload

  • Récupérer la dernière version stable de pyload. Il existe un paquet .deb mais on évitera de l’installer car il n’est pas à jour. Télécharger la dernière archive et la décompresser : 
cd /home/pyload
wget https://github.com/pyload/pyload/archive/stable.zip
unzip stable.zip

Configuration de pyload

Au premier démarrage du script, celui-ci va demander un certain nombre d’informations pour mettre en place la configuration de base de pyload. En cas d’erreur cet assistant peut être relancé à tout moment en ajoutant l’option -s.

Lancer l’assistant :

cd pyload-stable/
python pyLoadCore.py -s

Répondre aux questions tels que ci-dessous :

Choose your Language / Wähle deine Sprache ([en], de, fr, it, es, nl, sv, ru, pl, cs, sr, pt_BR): fr

Bienvenue dans l'Assistant de Configuration de pyLoad.
Il analysera votre système et effectuera une configuration basique afin de pouvoir exécuter pyLoad.

Les valeurs entre crochets [] sont toujours celles par défauts,
si vous ne souhaitez pas les changer ou si vous n'êtes pas sur de votre choix, appuyer juste sur entrée.
N'oubliez pas : vous pouvez relancez cet assistant à tout moment en ajoutant les paramètres --setup ou -s lorsque vous exécutez pyLoadCore.
Si vous avez un problème avec cet assistant appuyer sur CTRL-C,
pour annuler et l'empêcher de démarrer avec pyLoadCore automatiquement.

Quand vous êtes prêt pour la vérification du système, appuyer sur entrée.

## Vérification du Système ##
Version de Python : OK
pycurl : OK
sqlite3 : OK

pycrypto : OK
py-OpenSSL : OK

py-imaging : OK
tesseract : OK

PyQt4 : OK

jinja2 : OK
beaker : OK
moteur JS : OK

Vérification du système fini, appuyer sur entrée pour voir votre rapport de status.

A ce stade, toutes les vérifications doivent afficher 'OK', sinon il manque une dépendance qu'il va falloir installer avant de poursuivre.

## Status ##

Fonctions disponibles : décryptage des conteneurs, connexion ssl, décryptage automatique des catchas, GUI, Interface web, extension Click'N'Load

Continuer la configuration ? ([o]/n): o

Voulez vous modifier le dossier de configuration ? Pour l'instant il s'agit de /home/pyload/.pyload
If you use pyLoad on a server or the home partition lives on an internal flash it may be a good idea to change it.
Modifier le dossier de configuration ? (o/[n]): n

Voulez vous configurer les identifiants et les paramètres principaux?
Cette étape est recommandé lors du premier démarrage.
Mettre en place la configuration de base ? ([o]/n): o

## Configuration Basique ##

Les identifiants de connexion suivants sont valide pour la CLI, le GUI et l'interface web.
Nom d'utilisateur [User]: toto (c'est l'identifiant qui permettra de se connecter à l'interface web)
Mot de passe :
Mot de passe (encore) :

External clients (GUI, CLI or other) need remote access to work over the network.
However, if you only want to use the webinterface you may disable it to save ram.
Enable remote access ([o]/n): n

Langage ([en], de, fr, it, es, nl, sv, ru, pl, cs, sr, pt_BR): fr
Dossier de téléchargement [Downloads]: /home/pyload/Telechargements (adaptez, mais notez que l'utilisateur pyload devra avoir accès en écriture au répertoire. Évitez les accents dans le nom du répertoire, ça ne plait pas à pyload)
Téléchargements parallèle maximum [3]: 15 (adaptez suivant votre configuration matérielle)
Utiliser reconnexion ? (o/[n]): n

Souhaitez vous configurer ssl ?
Paramétrer ssl ? (o/[n]): n (on ne mets pas de ssl à ce niveau, c'est le reverse proxy qui se chargera de fournir une connexion sécurisée https)

Souhaitez vous configurer l'interface web ?
Paramétrer l'interface web ? ([o]/n): o

## Configuration Interface Web ##

Activer l'interface web ? ([o]/n): o

Adresse d'écoute, si vous utilisez 127.0.0.1 ou localhost, l'interface web ne sera accessible que localement.
Adresse [0.0.0.0]: 127.0.0.1
Port [8000]: 8000

pyLoad propose différents serveurs de gestion, décrits ci-après.
builtin: Serveur par défaut ; c'est le meilleur choix si vous ne savez pas lequel choisir.
threaded: Ce serveur permet l'utilisation de SSL ; c'est une bonne alternative à builtin.
fastcgi: Peut être utilisé par Apache, lighttpd ; vous devez le configurer manuellement, ce qui peut s'avérer difficile.
lightweight: Une alternative très rapide écrite en C, nécessite libev et des connaissances en linux.
Téléchargez le depuis : https://github.com/jonashaag/bjoern, compilez-le
et copiez bjoern.so vers module/lib

Attention : dans certain cas le serveur intégré ne marche pas, si vous avez des problèmes avec l'interface web,
revenez ici et changez le serveur de “builtin” à “threaded”.
Serveur ([builtin], threaded, fastcgi, lightweight): builtin

pyLoad offers several web user interface templates, please choose a webinterface template you like.
Template (pyplex, [modern], classic): modern

Configuration définie avec succès.
Appuyez sur entrée et redémarrer pyLoad

Créer le répertoire de téléchargements : 

mkdir -p /home/pyload/Telechargements
chown pyload:pyload /home/pyload/Telechargements
chmod -R 750 /home/pyload/Telechargements

Ce répertoire peut aussi être un lien symbolique pointant sur un répertoire de disque externe. A ce moment là il faudra veiller d’avoir les droits en écriture pour l’utilisateur pyload sur ce répertoire.

Vérifier que pyload tourne, sinon le redémarrer en mode daemon en l’exécutant avec l’utilisateur pyload :

ps -aux | grep pyload

cd /home/pyload/pyload-stable
sudo -u pyload pyLoadCore.py --daemon

Laissons de côté pyload pour le moment, celui-ci n’étant pas encore accessible depuis le navigateur, il faut mettre en place le reverse proxy nginx.

Configuration de nginx

C’est le reverse proxy nginx qui fera office d’intermédiaire entre le service pyload et le navigateur web. Le daemon Pyload écoute en local sur le port 8000, le reverse proxy devra rediriger les requêtes vers ce port.

Je ne vais pas entrer dans les détails concernant le hardening de nginx et son fichier de conf principal nginx.conf, c’est un gros sujet et il y a moults articles sur Internet qui en parlent. Je détaille ici uniquement la mise en place du vhost faisant office de reverse proxy.

Aussi il me semble essentiel de posséder un nom de domaine pour accéder à pyload depuis le web. Si vous n’avez pas de nom de domaine, vous pouvez en acheter un chez OVH (les .ovh ne sont vraiment pas cher, environ 3€/an). C’est toujours possible de faire sans mais il va falloir bidouiller son fichier hosts…

Vhost 80

Si ce n’est pas déjà fait, installer nginx :

apt install nginx

Créer un nouveau vhost dans sites-available (attention si vous n’êtes pas sur une distribution basée sur Debian il est possible que ce répertoire n’existe pas et que les vhosts doivent être placés ailleurs) :

sudo vim /etc/nginx/sites-available/reverse-proxy-pyload.conf
server {
listen 80;
server_name dl.mondomaine.com;

# Forcer https
# return 301 https://$server_name$request_uri; # Commenter cette ligne qu'on gardera pour plus tard
root /var/www/dl.mondomaine.com;

access_log /var/log/nginx/dl.mondomaine.com_access.log;
error_log /var/log/nginx/dl.mondomaine.com_error.log;
}

Activer ce nouveau vhost :

cd /etc/nginx/sites-enabled/
ln -s ../sites-available/reverse-proxy-pyload.conf

Tester la configuration, nginx ne doit pas retourner d’erreur :

sudo nginx -t

A ce niveau et sous réserve que le paramétrage DNS et les redirections de port de votre box sont en place, le vhost devrait fonctionner et votre navigateur devrait afficher la page d’accueil nginx ou au moins une page blanche.. mais pas d’erreur 404 ou autre.

Nous reviendrons plus tard pour la configuration du SSL (https) et du reverse proxy car il faut d’abord commander un certificat, ce que nous allons faire tout de suite.

Certificat Let’s Encrypt 

J’ai déjà créé un article sur getssl, le script bash qui va nous permettre de commander un certificat SSL. Pour éviter les doublons, je vous invite à suivre cet article jusqu’à la fin et de commander un certificat pour le nom de domaine dl.mondomaine.com

Lien vers l’article : https://yavin4.ovh/index.php/2019/09/19/certificat-ssl-lets-encrypt-avec-getssl/

A ce stade, vous devriez exécuter la commande suivante pour commander votre certificat (exemple) : 

./getssl dl.mondomaine.com

Maintenant que nous avons un certificat SSL, mettre en place le vhost nginx qui va écouter sur le port 443 afin de passer le site en HTTPS.

D’abord, il faut limiter le vhost 80 à renvoyer vers le vhost 443, c’est tout ce qu’il devra faire. Editer le vhost précédemment créé :

vim /etc/nginx/sites-available/reverse-proxy-pyload.conf

Et décommenter la ligne précédemment commentée, afin de rediriger toutes les requêtes sur le port 80 (http) vers 443 (https) :

server {
listen 80;
server_name dl.mondomaine.com;

# Forcer https
return 301 https://$server_name$request_uri;
root /var/www/dl.mondomaine.com;

access_log /var/log/nginx/dl.mondomaine.com_access.log;
error_log /var/log/nginx/dl.mondomaine.com_error.log;
}

Vhost 443

Ceci étant fait, créer le nouveau vhost écoutant sur le port 443 :

vim /etc/nginx/sites-available/reverse-proxy-pyload_ssl.conf

C’est ce vhost qui fera office de reverse proxy et qui renverra les requêtes vers le serveur web embarqué de pyload :

upstream pyload { # Défini le groupe de serveurs qui va répondre aux requêtes derrière le reverse proxy. Ici en l’occurrence c'est ce même serveur et le service pyload écoutant sur le port 8000
server 127.0.0.1:8000;
}

server {
listen 443 ssl;
server_name dl.mondomaine.com;

ssl_certificate /etc/nginx/ssl/dl.mondomaine.com/dl.mondomaine.com.crt;
ssl_certificate_key /etc/nginx/ssl/dl.mondomaine.com/dl.mondomaine.com.key;

# Add headers to serve security related headers
add_header Strict-Transport-Security "max-age=15552000; includeSubDomains";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;

# Racine du site
root /var/www/dl.mondomaine.com;

# Fichiers de logs
access_log /var/log/nginx/dl.mondomaine.com_ssl_access.log;
error_log /var/log/nginx/dl.mondomaine.com_ssl_error.log;

# Ne pas autoriser les robots à indexer le site
location = /robots.txt {
deny all;
log_not_found off;
access_log off;
}

location / {
include /etc/nginx/proxy_params; # Inclut quelques directives et en-têtes pour les proxys
proxy_pass http://pyload/; # On redirige les requêtes vers le groupe de serveurs 'pyload' défini plus haut
}
}

Tester la conf : 

nginx -t

Si rien n’a été oublié, nginx ne devrait pas retourner d’erreur, redémarrer le service :

service nginx restart

Tester l’accès dans le navigateur, l’interface de pyload devrait être accessible et celle-ci propose de créer un nouveau compte administrateur : https://dl.mondomaine.com

Script init 

Afin de démarrer et stopper pyload facilement et que celui-ci démarre automatiquement au reboot, créer le script init suivant : 

vim /etc/init.d/pyload

#!/bin/sh

### BEGIN INIT INFO
# Provides: pyload
# Required-Start: $syslog $local_fs $network $remote_fs
# Required-Stop: $syslog $local_fs $network $remote_fs
# Should-Start: $remote_fs $named
# Should-Stop: $remote_fs $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts pyload daemon
# Description: This script runs the pyload service
### END INIT INFO

# Starts and stops the pyload daemon.

PATH=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/home/pyload/pyload-stable/pyLoadCore.py
PIDFILE="/home/pyload/pyload.pid"

. /lib/lsb/init-functions

start() {
log_daemon_msg "Starting pyLoad server"

sudo -u pyload $DAEMON --daemon

if [ $? != 0 ]; then
log_end_msg 1
exit 1
else
log_end_msg 0
fi
}

stop() {
log_daemon_msg "Stoping pyLoad server"

$DAEMON -q

if [ $? != 0 ]; then
log_end_msg 1
# exit 1
else
log_end_msg 0
fi
}

case "$1" in
start)
start
;;

stop)
stop
;;

restart)
stop
sleep 2
start
;;

*)
echo "Usage: $0 {start|stop|restart|force-reload}"
exit 1
;;
esac

exit 0

Recharger systemd pour qu’il prenne en compte le script :

systemctl daemon-reload

Puis stopper et ou redémarrer pyload pour vérifier que le script fonctionne : 

service pyload stop
service pyload start

Quoi qu’il arrive le script exécute pyloadCore.py en tant que l’utilisateur pyload, il n’y a donc aucun soucis à redémarrer le service en tant que root ou avec sudo.

C’est terminé! L’interface web de pyload est accessible en https : https://dl.mondomaine.com

De mon côté j’ai noté quelques plantages de pyload de temps en temps, surement un plantage du serveur web intégré ‘builtin’ car on vient bien avec netstat qu’il n’écoute plus sur le port 8000. Dans ce cas l’interface web affiche une erreur 500 et il faut juste redémarrer le service.

N’hésitez pas à utiliser l’espace commentaires si vous avez des difficultés

Vous aimerez aussi...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

%d blogueurs aiment cette page :