PeerTube – Videos auf extra Maschinen rendern (peertube-runner)

PeerTube ist eine Videoplattform, welche man selbst hosten kann.
Dabei werden wie z.B. bei YouTube auch, die hochgeladenen Videos in ein passendes Format konvertiert, damit man sie im Browser geräteübergreifend abspielen kann.
Dies braucht je nach Format, Qualitätseinstellungen und Auflösung allerdings viel Zeit und Rechenleistung.
Wer dieses Renderprozess gerne auslagern möchte, kann dies jetzt tun.

In dieser kurzen Anleitung zeige ich dir, wie du ein eigenen PeerTube Runner installieren kannst.

Was ist peertube-runner?
PeerTube Runner (peertube-runner) ist eine Anwendung, die auf einem anderen Server laufen kann.
Sie frägt via API bei deiner PeerTube-Instanz nach, ob es etwas zu konvertieren gibt.
Wenn was vorhanden ist, wird das Video über https heruntergeladen und auf dem Runner-Server in die gewünschten Auflösungen konvertiert.
Ist dies abgeschlossen, lädt der Runner die Datei wieder hoch.
Der Runner selbst benötigt daher auch keine extra Portfreigaben im Router, da er selbst die Verbindung iniziiert.
Der Runner funktioniert nicht nur für Videos, auch für Livestreams kann er eingesetzt werden.

Welche Formate unterstützt der Runner?
Aktuell wird nur x264 unterstützt. Andere Formate wie VP9 oder AV1 lassen sich noch nicht konfigurieren.
(Schau hier für aktuelle Infos: https://github.com/Chocobozzz/PeerTube/issues/5858)
Bei der Aktivierung der Runner, wird auch das Transkodierungsprofil deaktiviert.


Was brauchen wir?
– Eine funktionierende PeerTube-Instanz (Anleitung gibts HIER)
– Root-Zugang oder Administrator-Rechte zu der PeerTube-Instanz
– Ein extra Server (x86/x64 – arm/arm64 hab ich noch nicht getestet)
– Linux als Betriebssystem (Debian 12 habe ich getestet)
– CPU und RAM je nach dem wie schnell der Renderprozess laufen soll (nach oben keine Grenze)
– Min. 2x freien Speicherplatz, wie die größte Videodatei ist, die du hochladen willst (Ist sie 30GB, stell 60GB bereit)
– Eine Internetanbindung für den Server

Hinweis: Nutzt du ein LXC, aktiviere „Nesting“ bei den Extra-Funktionen, damit alles sauber funktioiert.

1. Logge dich auf deinem Runner-Server per Root ein
2. Installiere folgende Pakete:

# apt install ffmpeg npm htop curl sudo unzip nano iftop -y

3. Installiere NodeJS

# curl -sL https://deb.nodesource.com/setup_20.x | bash -
# apt install -y nodejs -y

4. Installiere über npm peertube-runner

# sudo npm install -g @peertube/peertube-runner

5. Lege einen extra Benutzer für den peertube-runner an (er muss ja nicht mit root laufen)

# useradd -m -d /srv/prunner -s /bin/bash -p prunner prunner

6. Lege eine SystemD-Startdatei an

# nano /etc/systemd/system/prunner.service

Inhalt:

[Unit]
Description=PeerTube runner daemon
After=network.target

[Service]
Type=simple
Environment=NODE_ENV=production
User=prunner
Group=prunner
ExecStart=peertube-runner server
WorkingDirectory=/srv/prunner
SyslogIdentifier=prunner
Restart=always

; Some security directives.
; Mount /usr, /boot, and /etc as read-only for processes invoked by this service.
ProtectSystem=full
; Sets up a new /dev mount for the process and only adds API pseudo devices
; like /dev/null, /dev/zero or /dev/random but not physical devices. Disabled
; by default because it may not work on devices like the Raspberry Pi.
PrivateDevices=false
; Ensures that the service process and all its children can never gain new
; privileges through execve().
NoNewPrivileges=true
; This makes /home, /root, and /run/user inaccessible and empty for processes invoked
; by this unit. Make sure that you do not depend on data inside these folders.
ProtectHome=true
; Drops the sys admin capability from the daemon.
CapabilityBoundingSet=~CAP_SYS_ADMIN

[Install]
WantedBy=multi-user.target

7. Aktiviere die SystemD-Datei und starte den Runner

# systemctl daemon-reload
# systemctl enable prunner.service
# systemctl restart prunner.service

8. Passe ggf. die Anzahl, der zu verwendenen Threads an (Standard sind 2)

# nano /srv/prunner/.config/peertube-runner-nodejs/default/config.toml

9. Starte den Runner anschließend neu

# systemctl restart prunner.service

Optionaler Tipp:
Füge in die Hosts-Datei einen Eintrag für deine PeerTube-Instanz hinzu, damit der Runner den Weg zu 100% finden kann.

# nano /etc/hosts
192.168.20.15   peertube.DOMAIN.COM

10. Öffne die Runner-Liste in der PeerTube-Instanz
https://peertube.DOMAIN.COM/admin/system/runners/runners-list

11. Drücke auf „Runner registration tokens“ und dann auf „Token generieren“
Du erhälst ein Token der mit ptrrt-……….. beginnt.

12. Schicke folgenden Befehl ab, passe davor die URL sowie den Token an und ggf. den runner-name

# sudo -u prunner peertube-runner register --url https://peertube.DOMAIN.COM --registration-token ptrrt-XXXXX-XXXXX-XXXXXX-XXXXXX --runner-name Runner1337

Hinweis: Die URL muss passend mit HTTP oder HTTPS beginnen, da die automatische Umleitung von HTTP zu HTTPS nicht funktioniert!

13. Prüfen ob der Runner sich verbunden hat

# sudo -u prunner peertube-runner list-registered

14. In den Einstellungen von PeerTube nun die Runner aktivieren
https://peertube.DOMAIN.COM/admin/config/edit-custom#transcoding
>> Enable remote runners for VOD

15. PeerTube neu starten lassen, damit alles sauber übernommen wird

# systemctl restart peertube

Hinweis: Dieser Befehl muss natürlich auf dem Server abgeschickt werden, auf dem PeerTube installiert ist.

Ab jetzt gibt es im Webinterface auch ein neuer Eintrag.
Administration >> System >> Remote Runners
Hier siehst du, was deine Runner aktuell arbeiten.

Das Prozedere kannst du für jeden Server den du zur Verfügung hast wiederholen.
Je mehr Runner du hast, desto verteilter können deine Jobs laufen.

7 Kommentare

  1. So hab ich es auch. Was mich aber echt stört ist wie hart der remote-runner komprimiert. Hast du eine Möglichkeit gefunden, ein paar ffmpeg Optionen am Runner zu setzen?

    • Leider nein.
      Ich selbst bin deswegen wieder auf den lokalen Konverter ausgewichen, da ich dadurch auch AV1 nutzen kann.
      Auf Anfrage bei Github, ob man hier ggf. was an Einstellungsmöglichkeiten nachpflegen könnte, bekam ich nur die Antwort nach dem Motto, „bau’s halt ein, Code ist ja Opensource“.

      • Hey Hoerli,
        tausend Dank für diese klasse Anleitung hier! Ich habe ziemlich verzweifelt nach so etwas gesucht, um RemoteRunner in WSL/Ubuntu zum Laufen zu bringen und mit Deiner Anleitung hat alles butterweich geklappt!

        Ich bin blutiger Anfänger in Sachen Linux und für Leute wie mich wäre es super interessant zu erfahren, ob Du es auch geschafft hast, Transkriptionen zu aktivieren.

        Ich bin mit python Installationen nicht vertraut, weiß nicht, ob man da eine venv-Umgebung initiieren muss, um whisper-ctranslate2 da reinzuinstallieren…aber wo registriert man dann die entsprechenden Pfade überall, damit sie global funktionieren? Ich reime mir die Sachen superschnell selbst zusammen, brauche aber ein Krümelchen Starthilfe, weil so elementare Sachen wirklich nirgends richtig erklärt werden.

        Es wäre absolut riesig, wenn Du mir bei EInbindung von whisper-ctranslate2 ein ganz klein bissel helfen könntest. Die Erklärungen auf joinpeertube.org reichen einfach nicht aus und bei Google ist man in der Sache schnell am Ende. Ich verspreche Dir, dass ich das Ganze dann als Komplettanleitung für RemoteRunner in WSL/Ubuntu für Transkriptionen/Transkodierungen auf Reddit poste, um etwas Gutes für alle zurückzugeben.

        Vielen lieben Dank!

  2. Ich hab mir das jetzt mal angeschaut und genau den Kommentar aus Github aufgegriffen. Also dass man ja den Command umbiegen kann:
    https://github.com/locked-fg/peertube-remote-runner

    Funktioniert bei jetzt, sogar mit Transkription.

    • Kannst Du vielleicht beschreiben, wie Du die Transkriptionen aktivieren konntest? Ich scheitere damit bislang, die Transcodierungen laufen dagegen tadellos. Es wäre echt toll, wenn Du die Schritte beschreiben könntest, es gibt wirklich nirgendwo eine Anleitung dafür.

      Lieben Dank!

  3. Ahhh ich hab den Code mittlerweile bei Codeberg: https://codeberg.org/locked-fg/peertube-remote-runner
    Darüber hinaus habe ich nichts gemacht – oder zumindest kann ich mich nicht daran erinnern.
    Ich starte den Runner genau so wie er in dem Repo ist – der rest läuft dann. Funktioniert das bei dir nicht?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.