Mise à jour : PeerTube 2.0.0 sur OpenBSD

J'écris cet article après avoir migré mon instance PeerTube de FreeBSD à OpenBSD. J'espère inspirer d'autres à faire ce saut. Je crois être le premier et le seul à l'avoir fait jusqu'à présent (invérifiable toutefois).

La version de PeerTube utilisée (et toujours en fonctionnement à l'heure de la publication de cet article) est 1.4.1 parce les versions plus récentes bugguent à l'installation.

Mais je voulais le faire. Je voulais installer PeerTube sur OpenBSD et écrire cet article et maintenant c'est fait. Donc on peut le faire, et on peut corriger les bugs des versions supérieures. J'espère que d'autres vont me dire où j'ai fait des erreurs et comment j'aurais pû mieux faire.

J'espère aussi qu'on va pouvoir améliorer la sécurité de PeerTube en utilisant OpenBSD, aussi bien comme OS support que comme comme facteur d'inspiration.

On peut faire tourner PeerTube sur OpenBSD !

La situation de départ

J'avais mon instance PeerTube tournant sur FreeBSD hebergée sur un VPS chez ARN. Je venais également de tester et réussir l'installation d'une instance fonctionnelle sur mon propre serveur, hébergé chez moi. C'est bon, je peux donc reproduire la chose sur mon instance en production.

Je profite donc de cet article pour réitérer mes remerciements à l'association ARN, ainsi qu'à ses membres, et tout particulièrement à ceux qui, individuellement, m'ont aidé à travers cette épreuve.

Première bou… étape

Je vérifie auprès d'ARN des possibilités, puis on trouve un jour où on peut travailler ensemble. C'était déjà une gageure…

Valentin, le président d'ARN, qui est celui avec qui je devais me coordonner pour ca me dit simplement qu'il va mettre un SSD sur le VPS, j'installe OpenBSD dessus, puis je peux monter le HDD précédent comme /home. Comme les BSD ont tous le même système de fichiers, ca passera.

En fait non.

Mais bon. C’était, il faut le reconnaître, une belle tentative d’optimisation. Sauf que non.

Le VPS

Le VPS livré par ARN se compose d'un disque SSD de 10 G et d'un disque dur de 200 G. Évidemment tout ça c'est du virtuel, pas du vrai dur de dur, mais de mon point de vue c'est pareil.

J'ai divisé le SSD comme suit. J'ai juste utilisé le résultat du système de partitionnement par défaut :

#                size        fstype
a:             1.2G          4.2BSD    # /
b:             0.2G          swap      # none
d:             3.0G          4.2BSD    # /usr
e:             5.6G          4.2BSD    # /var

J'espère ne pas avoir fait d'erreurs avec ce plan, mais en même temps, on peut pas savoir. Je suis le premier à avoir monté une instance PeerTube sur OpenBSD. Je dois donc payer les pots cassés.

À l'heure où j'écris ces lignes, /usr devrait rester tel quel, avec à peu près 500 M d'espace libre. /var lui est gros, entre autre pour y loger la base de données et PeerTube (cf plus bas) qui fait quand même un demi gigaoctet.

Le HDD va, quand à lui, constituer la partition /home. Je vais m'en servir principalement pour le stockage des vidéos, mais également comme backup perso.

Première installation d'OpenBSD

Je ne détaille pas l'installation d'OpenBSD sur une VM d'ARN ni la configuration réseau un peu ésotérique de la chose. C'est un poil difficile, mais c'est bien décrit dans leur doc et ça marche. Faut juste avoir une iso d'installation complète. Vous n'avez pas d'accès internet durant cette opération. En elle-même, l'installation d'OpenBSD se passe comme sur des roulettes. C'est pas comme si les choix par défaut n'étaient pas bien choisis dès le départ.

La VM passe sous le petit nom d'hôte (nom système) de dina. Dina c'est le chat dans Alice au Pays des Merveilles. Le chat qui reste en dehors du Pays des Merveilles. Parfait pour mon domaine internet, puisque tous les hôtes à l'intérieur de mon réseau local ont des noms tirés de ce conte.

Je passe la partition de l'ancien disque dur en partition OpenBSD via disklabel mais je ne touche pas la chose davantage.

Lors du reboot… Ça plante. Bon, il a fallu que le truc comprenne ce qui lui arrivait. Donc il y a bien eu cinq reboots successifs. Et à chaque fois, il y avait un truc différent qui plantait.

Finalement on réussi à faire démarrer la chose correctement. Puis lorsque je tente de monter le disque dur, non. Le système de fichiers ne peut être monté. C'est là qu'on se rend compte que même s'ils ont des noms et des origines voisines, les systèmes de fichiers des BSD sont maintenant bien différents.

Avoir une partition marqué comme OpenBSD sur le disque mais avec un système de fichiers FreeBSD n'était pas une bonne idée.

Deuxième tentative

Bon, on prend donc un VPS complet. La configuration sera neuve. Donc un SSD + HDD, même plan qu'auparavant, mais une nouvelle IP aussi. C'est bon, ça marche.

Là dessus, j'essaye donc de booter un live FreeBSD, de fsck puis de monter l'ancien disque dur pour pouvoir accéder aux données (OK) et les transférer sur le nouveau VPS.

Encore une fois, non.

Les deux VPS ne pouvaient pas communiquer. Pas de ping possible entre les deux instances. Je soupçonnais que le problème venait du fait que le FreeBSD était en live, ce qui, de toute façon, m’empêchait de lancer sshd ou un autre système de transfert.

Et je n'arrivais pas à faire booter le FreeBSD dans son état initial.

Troisième tentative

Donc à nouveau, on se propose, cette fois, de remonter le FreeBSD en dur, mais à l'arrache vite fait.

Valentin monte un SSD de 10 G pour abriter un système FreeBSD temporaire, on colle l'ancien disque de 200 G dessus et roule. J'installe FreeBSD en quatrième vitesse et je monte l'ancien disque dans /mnt, de toute facon c'est destiné à être un oneshot.

Bien, on commence à y arriver.

À ce moment là, un truc bizarre : je ne peux communiquer entre les deux VPS que via ipv6. Hourra pour ipv6 !

Le truc con, c'est donc que je ne peux pas faire de partage NFS, ce qui aurait été vachement puissant. OpenBSD ne fait pas de NFS sur ipv6.

Installation de PeerTube

À partir de ce moment, on a donc un système stable sur les deux machines virtuelles.

On peut donc installer PeerTube proprement dit sur OpenBSD. En premier lieu, on crée un utilisateur système dédié _peertube, avec comme repertoire /var/www/peertube. J'ai aussi créé une entrée dans login.conf :

peertube:\
    :openfiles=1024:\
    :tc=daemon:

Le transfert

Pour transférer la masse de données entre les deux VPS, je vais donc simplement lancer sshd sur FreeBSD et faire un rsync depuis la machine OpenBSD.

Mais attention, c'est pas fini ! On contrôle bien les deux VPS via ssh depuis une troisième machine. Il faut s'assurer que les opérations entre les deux VPS ne soit pas interrompues par la coupure intempestive de ssh depuis la machine de contrôle.

Donc on se connecte sur le VPS OpenBSD, on lance tmux et dans l'instance tmux, on lance rsync. Ca ressemblait à ca :

tmux
cd /home/peertube
doas -u _peertube openrsync -e ssh -6 root@rescue:/var/www/peertube/storage/ .
  1. doas -u _peertube : Je fais faire le job comme l'utilisateur _peertube et les fichiers seront donc sa propriété.
  2. openrsync : on utilise le rsync natif d'OpenBSD. Comme ça si le transfert crash, il suffit de reprendre, et rsync vérifiera juste qu'il ne manque aucun fichier entre les deux.
  3. ssh -6 : connexion via ssh en ipv6 plutôt qu'en ipv4, puisque c'est la seule manière de faire communiquer les deux VPS.
  4. root@rescue : pour les besoins de la chose, j'ai écris l'adresse ipv6 du VPS originel dans /etc/hosts sur dina, et je me connecte comme root comme ca je peux recuperer tous les fichiers sans rendre de comptes à personne. De toute facon, sur dina elle-même, ils seront propriété de _peertube comme dit en premier.
  5. dans le répertoire /home/peertube : les fichiers arrivent dans leur emplacement définitif (mais il y a un loup).

La partition /home

J'ai voulu vraiment intégrer PeerTube dans le système. Donc j'avais prévu de faire ca :

/etc/peertube/...
/home/peertube/...
/var/www/peertube/peertube-latest
                /versions/$VERSION

Mais en fait, c'est pas possible. Parce que le serveur web (nginx), qui va faire une bonne part du travail est chrooté. Et que donc il ne pourra pas envoyer les fichiers videos en dehors de /var ni mettre à jour la configuration dans /etc.

Il faut donc revenir aux consignes originelles de la documentation qui demande de faire une installation comme décrit ci-dessous. Peertube-latest est juste un lien vers la version qu'on lancera :

/var/www/PeerTube/storage
                /config
                /peertube-latest
                /versions/$VERSION

Que faire pour storage, soit les fichiers videos, sous-titres, images, etc ? Pour l'instant, ils se trouvent dans /home/peertube. Est-ce que je ne devrais pas consacrer cette partition entièrement au stockage de PeerTube ?

Non en fait je veux vraiment utiliser aussi cet espace assez conséquent pour d'autres raisons personnelles (espace de sauvegarde), probablement avec un /home/backup. Donc je vais garder les choses comme ceci. L'idéal à ce moment, ce serait de pouvoir monter en bind le répertoire /home/peertube dans /var/www/peertube/storage.

Sauf qu'OpenBSD n'a pas cette option de montage.

Donc en fait, j'ai exporté via NFS le repertoire /home/peertube et je l'ai monté en local dans le point de montage /var/www/peertube/storage.

/etc/exports

/home/peertube   -maproot=root   -alldirs localhost

/etc/fstab

# SSD
32d7755f555b0d5d.b none swap sw
32d7755f555b0d5d.a / ffs rw 1 1
32d7755f555b0d5d.d /usr ffs rw,wxallowed,nodev 1 2
32d7755f555b0d5d.e /var ffs rw,nodev,nosuid 1 2

# HDD
ffec183db71141e2.a /home ffs rw,nodev,nosuid 1 2

swap            /tmp mfs rw,nosuid,nodev,-s=250M 0 0

127.0.0.1:/home/peertube /var/www/peertube/storage   nfs rw,nodev,nosuid,noexec 0 0

/etc/rc.conf.local

check_quotas=NO
portmap_flags=
mountd_flags=
nfsd_flags="-tun 4" 

À noter que créer un lien logique (ln -s) dans le chroot de nginx n'aurait rien changé. Les liens logiques, c'est juste un raccourci logiciel entre deux points du système de fichiers. Hors, du point de vue de nginx, il n'existe pas de /home/peertube sur lequel pointe le lien.

dépendances

Les dépendances de PeerTube sont bien documentées. On peut donc installer :

doas pkg_add ffmpeg redis postgresql-server postgresql-contrib node nginx

À noter que j'ai eu besoin d'installer python3 :

doas pkg_add python3

N'oubliez pas d'ajouter tout ca dans rc.conf.local:

pkg_scripts=postgresql redis peertube nginx

PostgreSQL

Il vous faut également initialiser correctement PostgreSQL et installer les contrib.

Ne faîtes pas seulement du copier-coller, prenez le temps de comprendre ce que vous faîtes. Lisez quelques textes sur PostgreSQL pour comprendre.

# su - _postgresql
$ mkdir /var/postgresql/data
$ initdb -D /var/postgresql/data -U postgres -A scram-sha-256 -E UTF8 -W
$ createuser -P peertube
$ createdb -O peertube peertube_prod
$ psql -c "CREATE EXTENSION pg_trgm;" peertube_prod
$ psql -c "CREATE EXTENSION unaccent;" peertube_prod

Prenez donc cinq minutes pour lire la doc du port, et vérifier si vous avez besoin d'ajuster les paramètres du noyau ou autres trucs…

less /usr/local/share/doc/pkg-readmes/postgresql-server

libvips

Il y a également libvips comme dépendance et j'ai dû écrire un port pour l'installation correcte de cette bibliothèque. Je l'ai proposé pour intégration dans l'arbre des ports, mais n'ai pas reçu de réponse.

Le port doit être installé dans /usr/ports/multimedia/.

# $OpenBSD: Makefile,v 1.84 2019/08/08 23:04:22 kmos Exp $

COMMENT =       fast image processing library with low memory needs

VERSION = 8.8.3
DISTNAME =      vips-${VERSION}
CATEGORIES =    multimedia

SHARED_LIBS +=  vips                 0.0   # 53.1
SHARED_LIBS +=  vips-cpp             0.0    # 53.1

HOMEPAGE = https://libvips.github.io/libvips/

#MAINTAINER =           ???

# LGPLv2+
PERMIT_PACKAGE =        Yes

WANTLIB += ${COMPILER_LIBCXX} c expat fontconfig freetype m z
WANTLIB += ffi glib-2.0 gmodule-2.0 gobject-2.0 gthread-2.0 iconv
WANTLIB += gif jpeg png tiff webp webpdemux webpmux
WANTLIB += intl pcre

MASTER_SITES =          https://github.com/libvips/libvips/releases/download/v${VERSION}/

# Dependencies
LIB_DEPENDS +=          devel/glib2 graphics/png graphics/jpeg
LIB_DEPENDS +=          graphics/libwebp graphics/giflib graphics/tiff

SEPARATE_BUILD =        Yes
USE_GMAKE =             Yes

COMPILER = base-clang ports-gcc
CONFIGURE_STYLE =       gnu

.include <bsd.port.mk>

Téléchargement de PeerTube

export VERSION=…
cd /var/www/peertube/versions
doas -u _peertube wget "https://github.com/Chocobozzz/PeerTube/releases/download/${VERSION}/peertube-${VERSION}.zip"
doas -u _peertube unzip peertube-${VERSION}.zip && doas -u _peertube rm peertube-${VERSION}.zip

Node et Yarn

Il vous faut yarn pour l'installation. Du moins c'est ce qui est écrit.

doas npm install --global yarn

Sharp

À chaque fois que j'ai installé / réinstallé / mis à jour PeerTube, le truc qui faisait ch*** son monde, c'était Sharp. Devinez quoi ? Oui, là aussi.

L'installation du module Sharp a du mal avec la localisation de la librairie libvips, citée précédemment. S'il fait des siennes, faîtes ceci :

cd /var/www/peertube/peertube-latest
SHARP_IGNORE_GLOBAL_LIBVIPS=1 doas -u _peertube npm add sharp

Vous pouvez ensuite poursuivre le reste de manière définitive :

cd /var/www/peertube/peertube-latest
doas -u _peertube yarn install --production --pure-lockfile

Le script rc

Je me suis efforcé de coller au mieux au script rc fourni en template.

#!/bin/ksh

daemon_user="_peertube"

HOME_DIR="/var/www/peertube/"
CONF_DIR="/var/www/peertube/config/"

daemon="HOME=${HOME_DIR} NODE_CONFIG_DIR=${CONF_DIR} NODE_ENV=production USER=${daemon_user} \
        /usr/local/bin/node ${HOME_DIR}/peertube-latest/dist/server"

. /etc/rc.d/rc.subr

daemon_timeout=60

pexp="node: peertube"

rc_reload=NO

rc_cmd $1

Démons auxiliaires

Lors du démarrage de PeerTube, la première chose qu'il va faire c'est tester ses connections avec les serveurs auxiliaires indiqués dans sa configuration, à savoir PostgreSQL, Redis et smtp. S'il y a un problème de connexion, le démarrage de PeerTube échouera.

OpenBSD a un serveur smtp en base (il est là, d'office) donc il vaut peut-être la peine de l'utiliser directement plutôt que de passer par Google & co.

Ca signifie aussi que PeerTube doit démarrer après ces services.

Pour l'instant PeerTube ne peut pas se connecter via une socket locale aux bases de données.

Redis a accepté les connections sur ::1 mais pas celles sur 127.0.0.1. Vérifiez donc sa configuration à lui aussi.

Nginx

PeerTube utilise massivement Nginx.

Entre autre, il va servir directement et/ou mettre en cache les fichiers statiques (css, js), servir directement les vidéos (dans certains cas) et relayer les flux au tracker torrent intégré à l'instance.

Il vous sera très utile de lire les fichiers de configs PeerTube et Nginx fournis avec l'archive d'installation. Je les ai moi-même copiés et laissés presque tels quels après les avoir lus en diagonale.

Je n'ai pas encore réussi à voir qui de Nginx ou PeerTube doit démarrer avant l'autre. Il est fréquent que Nginx ne relaie pas le flux sur PeerTube, on a alors “Bad Gateway” sur la page d'accueil de PeerTube, malgré que les deux processus tournent bel et bien. Dans ce cas, un redémarrage de Nginx est la meilleure solution.

Je n'ai parlé ni de la configuration TLS et acme-client, ni des logs. De ce point de vue, l'instance est juste un serveur web comme les autres : il y aura des logs à la pelle (ceux de PeerTube et ceux de Nginx) et vous devez automatiser leur rotation et le renouvellement des certificats.

pf et ipv6

Idem de PF, à savoir qu'on a presque un serveur web normal, qui accepte des connections entrantes sur ses interfaces dans les ports habituels. Mais PeerTube ouvre aussi une palanquée de connections vers d'autres instances et reçoit des connections de navigateurs web dans tous les sens.

En ipv4 et ipv6.

Donc si vous avez une connectivité ipv6 mais qu'elle n'est pas parfaite ou simplement chancelante, vous aurez alors des problèmes erratiques : on pourra voir la page d'une vidéo se charger, mais pas le flux puisque certaines de ses connections fonctionneront toujours (celles en ipv4) quand d'autres seront dans les choux.

Enfin, et pour vous remercier d'avoir tout lu, je voulais vous montrer cette video pleine de joie et de bonheur d'Australie. Parce que je l'ai fait ! J'ai installé PeerTube sur OpenBSD !