Articles - Logiciel & scripts

Installation d'une instance Peertube (sur Debian Stretch 9.6)

  |   167  |  Poster commentaire  |  Logiciel & scripts


Exemple d'installation d'une instance Peertube (le logiciel au logo d'i-télé) en mode production, publique pour le web (extranet).
Il existe une version YunoHost ainsi qu'en conteneur Docker

1 - Le choix du serveur (attention au transcodage)



Concernant le processeur, attention à ne pas prendre de CPU trop faible comme par exemple un Intel Atom, car Peertube transcode chaque vidéo uploadée sur le serveur lui-même via ffmpeg. Et plus le CPU est petit plus cela va mettre du temps. Pour exemple sur un serveur Kimsufi KS-3 CPU Intel Atom N2800 - 2 threads réservés pour une vidéo de 6 minutes uploadée (1080p 6Mbps). Rappel : le fichier original en 1080p est lui-aussi transcodé.

Résolution Total Ratio
1080 60 minutes x10
480 15 minutes x2.5
360 11 minutes x1.83
720 29 minutes x4.83
240 6 minutes x1


Voici la liste des fichiers produits :

Code BASH :
total 205588
-rw-r--r-- 1 peertube peertube 110780508 nov.  23 22:22 a085b702-44c2-44e9-9cc4-1ef3ddfafe3f-1080.mp4
-rw-r--r-- 1 peertube peertube  11951659 nov.  23 23:21 a085b702-44c2-44e9-9cc4-1ef3ddfafe3f-240.mp4
-rw-r--r-- 1 peertube peertube  17378062 nov.  23 22:46 a085b702-44c2-44e9-9cc4-1ef3ddfafe3f-360.mp4
-rw-r--r-- 1 peertube peertube  24457145 nov.  23 22:37 a085b702-44c2-44e9-9cc4-1ef3ddfafe3f-480.mp4
-rw-r--r-- 1 peertube peertube  45945911 nov.  23 23:15 a085b702-44c2-44e9-9cc4-1ef3ddfafe3f-720.mp4


Total = 60 + 15 + 11 + 29 + 6 = 121 minutes = 2 heures de conversion pour 6 minutes de vidéos



La même chose sur un Xeon E3-1225 V2 dans les mêmes conditions :

Résolution Total Ratio
1080 7 minutes x1
480 2 minutes x0.3
360 2 minutes x0.3
720 3 minutes x0.5
240 2 minutes x0.3


Code BASH :
total 205588
-rw-r--r-- 1 peertube peertube 110780508 nov.  27 03:04 f92690f5-5396-46cd-a3c6-c06fc4d5a3f6-1080.mp4
-rw-r--r-- 1 peertube peertube  11951659 nov.  27 03:10 f92690f5-5396-46cd-a3c6-c06fc4d5a3f6-240.mp4
-rw-r--r-- 1 peertube peertube  17378062 nov.  27 03:06 f92690f5-5396-46cd-a3c6-c06fc4d5a3f6-360.mp4
-rw-r--r-- 1 peertube peertube  24457145 nov.  27 03:05 f92690f5-5396-46cd-a3c6-c06fc4d5a3f6-480.mp4
-rw-r--r-- 1 peertube peertube  45945911 nov.  27 03:09 f92690f5-5396-46cd-a3c6-c06fc4d5a3f6-720.mp4


Total = 7 + 2 + 2 + 3 + 2 = 16 minutes de conversion pour 6 minutes de vidéos



Comme vous pouvez le remarquer, activer l'encodage engendre la création de fichiers vidéos supplémentaires sur le serveur, ces fichiers réclament évidemment de l'espace. Si la vidéo originale en 1080p occupe 110Mo à elle seule, avec les définitions inférieures on arrive presque au double (total = 205Mo).

On pourrait donc être tenté de désactiver le transcodage, seulement :
  • le fichier téléversé sur le serveur peut ne pas être compatible avec tous les navigateurs clients.
  • certains clients n'ont pas le débit ADSL pour regarder la vidéo native en 1080, il faut donc proposer le 720p voire même en dessous pour économiser la BP pour les mobiles.
  • il n'existe pour le moment aucun moyen de transcoder sur son PC toutes les résolutions et de téléverser les fichiers directement. Ce qui aurait été pratique pour ceux qui ont la fibre. Si vous tentez un max de bricolage en base de données vous attend et il vaut mieux éviter.


Pour la mémoire évidemment tout dépend de la charge, donc du nombre de visiteurs à desservir, 2-4Go de RAM sont largement suffisants. Si plus, ce sera utilisé en tant que cache de vidéos et miniatures par l'OS.

Let's GO !



Vous vous apercevrez que la procédure "hardcore" est longue mais pas infaisable pour autant. 😁 Bon courage. 👍

2 - Première connexion au serveur livré & préparation/personnalisation du système



Après livraison d'un serveur chez Kimsufi/SoYouStart/PeuImporte, se connecter en root avec le couple login/mot de passe fourni par courriel. Rappel : les courriels sont aussi visibles depuis l'interface client (Mon Compte > Mes emails > "Installation de votre serveur terminée").

Mise à jour du serveur (pas toujours nécessaire)



Code BASH :
root@peertube:~#apt-get update
root@peertube:~#apt-get upgrade
root@peertube:~#cat /etc/debian_version
9.6


Remettre le serveur dans le bon fuseau horaire (Europe/Paris)



Code BASH :
root@peertube:~#dpkg-reconfigure tzdata


Création d'un utilisateur "lambda" (nom générique à remplacer) + génération d'une paire de clés



Code BASH :
root@peertube:~#useradd lambda -d /home/lambda -m -s /bin/bash
root@peertube:~#su - lambda
lambda@peertube:~$ssh-keygen
lambda@peertube:~$exit


Activer le mécanisme de sudoers + rajouter lambda aux sudoers



Code BASH :
root@peertube:~#apt install sudo
root@peertube:~#usermod -aG sudo lambda


Positionner un mot de passe à l'utilisateur lambda



Code BASH :
root@peertube:~#passwd lambda


Contrôle



A ce stade vérifier que lambda peut se connecter en SSH au serveur avec son mot de passe (avec une nouvelle session à part). Une fois connecté vérifier que lambda peut passer root via sudo :

Code BASH :
lambda@peertube:~$sudo su -
root@peertube:~#


Sécurisations SSH (Facultatif)



Copier votre clé publique dans le fichier authorized_keys de lambda (dans mon cas depuis Mobaxterm). Suivre ce tutoriel pour plus d'informations. La même chose peut se faire avec PuTTY, et c'est bien évidemment encore plus facile depuis Linux.

Code BASH :
ssh-copy-id lambda@IP_SERVEUR


Reconfigurer le démon SSHD :

Code BASH :
root@peertube:~#vi /etc/ssh/sshd_config


  • Port XXXX (changer le port par défaut, mettre autre que 22)
  • LoginGraceTime (descendre)
  • MaxAuthTries (descendre)
  • PermitRootLogin no (ne pas autoriser la connexion au compte root depuis SSH)
  • PubkeyAuthentication yes (activer l'authentification par clé publique)
  • X11Forwarding yes (activer la redirection X11, vous en aurez besoin, activé par défaut)
  • PasswordAuthentication no (désactiver l'authentification par mot de passe)


Relancer le démon SSHD pour prendre en compte les changements :

Code BASH :
root@peertube:~#systemctl restart sshd


Dorénavant seul l'utilisateur lambda peut se connecter au serveur sur le nouveau port SSH indiqué et uniquement avec la clé publique du client (Mobaxterm/PuTTY).

Installation de divers paquets intéressants



Code BASH :
root@peertube:~#apt-get install htop iperf speedtest-cli ufw curl file fail2ban


Tester la bande passante du serveur :

Code BASH :
root@peertube:~# speedtest-cli
Retrieving speedtest.net configuration...
Testing from OVH SAS (188.165.236.17)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by Naitways (Paris) [1.88 km]: 5.041 ms
Testing download speed................................................................................
Download: 818.86 Mbit/s
Testing upload speed....................................................................................................
Upload: 251.53 Mbit/s


Code BASH :
root@peertube:~# iperf -c ping.online.net
------------------------------------------------------------
Client connecting to ping.online.net, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[  3] local 188.165.236.17 port 39566 connected with 62.210.18.40 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   301 MBytes   252 Mbits/sec


Configuration et activation du pare-feu (facultatif mais très conseillé)



Code BASH :
root@peertube:~#ufw logging off #(désactiver journalisation)
root@peertube:~#ufw allow 80/tcp #(Peertube NGINX HTTP)
root@peertube:~#ufw allow 443/tcp #(Peertube NGINX HTTPS)
root@peertube:~#ufw allow 9000/tcp #(Peertube NodeJS websockets)


Concernant l'accès via SSH :

Option 1 - Soit SSH accessible uniquement depuis la maison, s'assurer d'avoir une IP fixe ! (Plus sécurisé)
Code BASH :
root@peertube:~#ufw allow proto tcp from $IP_MAISON to any port $PORT_SSH

Option 2 - Soit SSH accessible depuis partout (Moins sécurisé, trouvable par nmap)
Code BASH :
root@peertube:~#ufw allow $PORT_SSH/tcp


Facultatif - Ajout supervision par SNMP (par exemple avec Centreon) accessible uniquement depuis la maison, s'assurer d'avoir une IP fixe :

Code BASH :
root@peertube:~#ufw allow proto udp from $IP_MAISON to any port 161


Activer le pare-feu et activer son lancement au démarrage :

Code BASH :
root@peertube:~#ufw enable
root@peertube:~#systemctl enable ufw


Faire un reboot et confirmer que le serveur est toujours accessible.

3 - Pré-installation de Peertube



La documentation officielle est accessible ici : https://github.com/Chocobozzz/PeerTube/blob/develop/support/doc/production.md

Installer les pré-requis (dépendances) - Partie 1



Code BASH :
apt-get install unzip nginx ffmpeg pgadmin3 pgtop pg-activity postgresql postgresql-contrib openssl g++ make redis-tools redis-server git certbot python-certbot-nginx xauth


Installer les pré-requis (dépendances) - Partie 2 (NodeJS - Version 11.2)



Code BASH :
root@peertube:~#curl -sL https://deb.nodesource.com/setup_11.x | bash -
root@peertube:~#apt-get install -y nodejs


Installer les pré-requis (dépendances) - Partie 3 (Yarn)



Code BASH :
root@peertube:~#curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
root@peertube:~#echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
root@peertube:~#apt-get update && apt-get install yarn
root@peertube:~# yarn --version
1.12.3
 


Créer l'utilisateur système peertube et renseigner son mot de passe



Code BASH :
root@peertube:~#useradd -m -d /var/www/peertube -s /bin/bash -p peertube peertube
root@peertube:~#passwd peertube
Entrez le nouveau mot de passe UNIX :
Retapez le nouveau mot de passe UNIX :
passwd: password updated successfully
 


Créer le rôle peertube + la base de données PostgreSQL nommée peertube_prod



Code BASH :
root@peertube:~#su - postgres
postgres@peertube:~$createuser -P peertube
[CHOISIR UN MOT DE PASSE ET LE RETENIR !!!]
postgres@peertube:~$createdb -O peertube peertube_prod
postgres@peertube:~$psql -c "CREATE EXTENSION pg_trgm;" peertube_prod
postgres@peertube:~$psql -c "CREATE EXTENSION unaccent;" peertube_prod


4 - Récupération & installation de Peertube



Récupérer le nom de la dernière version disponible :

Code BASH :
root@peertube:~#export VERSION=$(curl -s https://api.github.com/repos/chocobozzz/peertube/releases/latest | grep tag_name | cut -d '"' -f 4) && echo "Latest Peertube version is $VERSION"


Créer les dossiers d'installation :

Code BASH :
root@peertube:~#cd /var/www/peertube && sudo -u peertube mkdir config storage versions && cd versions


Récupération du .zip de la dernière version :

Code BASH :
root@peertube:/var/www/peertube/versions#su peertube
peertube@peertube:~/versions$wget -q "https://github.com/Chocobozzz/PeerTube/releases/download/${VERSION}/peertube-${VERSION}.zip"


Dézip et création d'un lien symbolique :

Code BASH :
peertube@peertube:~/versions$unzip peertube-${VERSION}.zip && rm peertube-${VERSION}.zip
peertube@peertube:~/versions$cd ../ && ln -s versions/peertube-${VERSION} ./peertube-latest


Installation :

Code BASH :
peertube@peertube:~$cd ./peertube-latest && yarn install --production --pure-lockfile
yarn install v1.12.3
[1/5] Validating package.json...
...
...
...
...
Done in 20.68s.
Done in 60.29s.


5 - Configurer Peertube + divers



Copier le modèle de fichier de configuration fourni :

Code BASH :
root@peertube:~#cd /var/www/peertube && sudo -u peertube cp peertube-latest/config/production.yaml.example config/production.yaml


Editez le fichier de configuration : Code BASH :
root@peertube:~#vi /var/www/peertube/config/production.yaml


Le remplacement des deux premières valeurs du tableau est indispensable !
Le reste peut être fait plus tard via l'interface d'administration web.

Ligne Nom valeur Par défaut Description Exemple
8 webserver-hostname example.com FQDN instance video.jonathandupre.fr
23 database-password peertube Mot de passe du rôle peertube (postgresql)
59 log-level info Verbosité du log warning
113 admin-email admin@example.com Adresse courriel compte admin
135 transcoding-threads 1 Nombre de threads occupés pour l'encodage Selon le nombre de cœurs de votre serveur (2 pour un quad core)


Configurer NGINX



Copier le fichier de configuration fourni :

Code BASH :
root@peertube:~#cp /var/www/peertube/peertube-latest/support/nginx/peertube /etc/nginx/sites-available/peertube


Remplacez le domaine peertube.example.com par le vrai nom de domaine de votre instance :

Code BASH :
root@peertube:~#sed -i 's/peertube.example.com/video.monsite.fr/g' /etc/nginx/sites-available/peertube


Activer ce fichier de configuration dans nginx :

Code BASH :
root@peertube:~#ln -s /etc/nginx/sites-available/peertube /etc/nginx/sites-enabled/peertube


6 - Procédure de génération du certificat Let's Encrypt


Maintenant assurez-vous que le nom de domaine pointe bien sur votre serveur dans la zone DNS (video.monsite.fr --> IP_SERVEUR). Cela est nécessaire pour Let's Encrypt.

Arrêter Nginx :
Code BASH :
root@peertube:~#systemctl stop nginx

Commenter les directives ssl_certificate and ssl_certificate_key (lignes 22 et 23) :
Code BASH :
root@peertube:~# vim /etc/nginx/sites-available/peertube

Lancer certbot et répondre aux questions de l'assistant :
Code BASH :
root@peertube:~#certbot --authenticator standalone --installer nginx --post-hook "systemctl start nginx"

Décommenter les directives ssl_certificate and ssl_certificate_key (lignes 22 et 23) :
Code BASH :
root@peertube:~#vim /etc/nginx/sites-available/peertube

Nginx est déja relancé par l'option post-hook de certbot, envoyer un signal pour qu'il recharge sa configuration :
Code BASH :
root@peertube:~#systemctl reload nginx


TCP/IP Tuning



Code BASH :
root@peertube:~#cp /var/www/peertube/peertube-latest/support/sysctl.d/30-peertube-tcp.conf /etc/sysctl.d/
root@peertube:~#sysctl -p /etc/sysctl.d/30-peertube-tcp.conf
net.core.default_qdisc = fq_codel
net.ipv4.tcp_congestion_control = bbr


systemd



Copier l'unité fournie, l'ajouter au système et activer le lancement automatique de peertube au boot :

Code BASH :
root@peertube:~#cp /var/www/peertube/peertube-latest/support/systemd/peertube.service /etc/systemd/system/
root@peertube:~#systemctl daemon-reload
root@peertube:~#systemctl enable peertube


7 - Démarrer Peertube



A ce stade, il est acquis que Nginx, Postgres et Redis soient déjà lancés avant de démarrer Peertube.

Code BASH :
root@peertube:~#ps -ef | grep redis
redis    24322     1  0 01:02 ?        00:00:01 /usr/bin/redis-server 127.0.0.1:6379


Code BASH :
root@peertube:~#ps -ef | grep nginx
root     27491     1  0 01:50 ?        00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 27492 27491  0 01:50 ?        00:00:00 nginx: worker process
www-data 27493 27491  0 01:50 ?        00:00:00 nginx: worker process
www-data 27494 27491  0 01:50 ?        00:00:00 nginx: worker process
www-data 27495 27491  0 01:50 ?        00:00:00 nginx: worker process


Code BASH :
root@peertube:~#ps -ef | grep postgres
postgres 23454     1  0 00:49 ?        00:00:00 /usr/lib/postgresql/9.6/bin/postgres -D /db/postgresql/9.6/main -c config_file=/etc/postgresql/9.6/main/postgresql.conf
postgres 23456 23454  0 00:49 ?        00:00:00 postgres: 9.6/main: checkpointer process
postgres 23457 23454  0 00:49 ?        00:00:00 postgres: 9.6/main: writer process
postgres 23458 23454  0 00:49 ?        00:00:00 postgres: 9.6/main: wal writer process
postgres 23459 23454  0 00:49 ?        00:00:00 postgres: 9.6/main: autovacuum launcher process
postgres 23460 23454  0 00:49 ?        00:00:00 postgres: 9.6/main: stats collector process


Ces 3 services sont UP, on peut lancer :

Code BASH :
root@peertube:~#systemctl start peertube


Le lancement se fait en background (démon), utiliser cette commande suivante pour voir si tout va bien (suivi du log) :

Code BASH :
root@peertube:~#journalctl -feu peertube


En cas d'erreur en boucle, faire un stop pour analyser le problème (stacktrace), au besoin le log par défaut sort dans /var/log/syslog. Si vous avez tout bien fait, vous pouvez vous connecter à votre instance en http/https :



8 - Se connecter à Peertube



L'utilisateur par défaut est "root" sur l'interface web est, il est créé d'office dans la base PostgreSQL peertube_prod. Mais son mot de passe est dans les logs. Changeons-le dès maintenant en utilisant le script fourni :

Code BASH :
root@peertube:/var/log# su - peertube 
peertube@peertube:~$ cd /var/www/peertube/peertube-latest && NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run reset-password -- -u root 
 
> peertube@1.0.1 reset-password /var/www/peertube/versions/peertube-v1.0.1 
> node ./dist/scripts/reset-password.js "-u" "root" 
 
New password? 
User password updated. 
peertube@peertube:~/peertube-latest$


Il ne vous reste plus qu'à l'utiliser sur l'interface pour rentrer :



Maintenant vous avez accès à tout :