Articles - Logiciel & scripts

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

  |   2874  |   Commentaires (2)  |  Logiciel & scripts

img-01-2


Exemple d'installation d'une instance Peertube 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 (ou plus) 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

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

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



Chaque résolution transcodée engendre la création de fichiers vidéos supplémentaires (un fichier suffixé pour chaque définition inférieure). 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 dans les paramètres de Peertube, 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 bande passante pour les mobiles.
  • il n'existe pour le moment aucun moyen facile 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 et du nombre de vidéos et d'utilisateurs à desservir, 2-4Go de RAM sont largement suffisants. Si plus, ce sera utilisé en tant que cache de vidéos et autres fichiers statiques par l'OS, cela n'est pas perdu.

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* + 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

* = Le nom lambda est ici volontairement générique car donner le d'utilisateur réel que j'utilise serait une aide pour d'éventuels tipiakeurs. Donc à vous de le remplacer par ce que vous voulez, soyez inventif.

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 mais très conseillé)


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 iperf3 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 Node.js 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://docs.joinpeertube.org/#/install-any-os?id=installation
Il est très conseillé de la suivre. Ce qui est marqué ici date de 2018. Il peut y avoir des différences depuis.

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 mediainfo

Installer les pré-requis (dépendances) - Partie 2 (Node.js - Version 10 au moment de la création de cette page)


Rappel : N'utilisez pas les versions majeures impaires de Node.js.
Code BASH :
root@peertube:~#curl -sL https://deb.nodesource.com/setup_10.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
 

MAJ décembre 2021 : Comme indiqué dans les changelogs de Peertube : Attention à votre version d'ffmpeg ! Il se peut que la version de votre distribution soit trop ancienne (< 4.1). La version 4.4.0 n'est pas compatible avec Peertube. J'ai recompilé manuellement en 4.2 il fût un temps puis en version 4.4.1 récemment pour ne pas avoir de problème. Si vous compilez, pensez à rajouter la bibliothèque libfdk-aac car Peertube s'en sert.

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 -E UTF8 -T template0 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


Créer les dossiers d'installation :
Code BASH :
root@peertube:~#su - peertube
peertube@peertube:~$cd /var/www/peertube && sudo -u peertube mkdir config storage versions && cd versions

Récupérer le nom de la dernière version disponible :
Code BASH :
peertube@peertube:~$export VERSION=$(curl -s https://api.github.com/repos/chocobozzz/2018/217/releases/latest | grep tag_name | cut -d '"' -f 4) && echo "Latest Peertube version is $VERSION"

Récupération du .zip de la dernière version :
Code BASH :
peertube@peertube:~$cd /var/www/2018/217/versions
peertube@peertube:~/versions$wget -q "https://github.com/Chocobozzz/2018/217/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/2018/217/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.
Nom valeur Par défaut Description Exemple
webserver-hostname example.com FQDN instance video.jonathandupre.fr
database-password peertube Mot de passe du rôle peertube (postgresql)
log-level info Verbosité du log warning
admin-email admin@example.com Adresse courriel compte admin
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/2018/217/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/2018/217/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/2018/217/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, n'oubliez pas également la messagerie pour l'envoi des courriels si vous utilisez cette fonction. 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 https :

8 - Se connecter à Peertube


L'utilisateur par défaut est "root" sur l'interface web, 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/2018/217/peertube-latest && NODE_CONFIG_DIR=/var/www/2018/217/config NODE_ENV=production npm run reset-password -- -u root 
 
> peertube@1.0.1 reset-password /var/www/2018/217/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 pour créer les autres utilisateurs, configurer et uploader :

Rappel : n'utilisez pas l'utilisateur root pour publier des vidéos. root est un utilisateur technique qui sert uniquement pour administrer l'instance ponctuellement. Créez des comptes utilisateurs normaux et publiez vos vidéos avec ces autres comptes.