PeerTube mit Docker installieren: Dezentrale, föderierte Videoplattform selbst hosten
PeerTube v8.2.0 ist die datenschutzkonforme YouTube-Alternative für Organisationen. Diese Anleitung zeigt die Installation mit Docker Compose – inklusive HTTPS, Let's Encrypt, RTMP-Livestreaming und ActivityPub-Federation.

YouTube-Alternativen gibt es viele, aber kaum eine überzeugt so sehr wie PeerTube, wenn es um Datenkontrolle und Datenschutz geht. PeerTube ist eine föderierte Open-Source-Videoplattform, die auf dem ActivityPub-Protokoll basiert – dem gleichen Standard, der Mastodon und das Fediverse antreibt. Zusätzlich verteilt WebTorrent die Streaming-Last direkt unter den aktiven Zuschauern, sodass dein Server auch bei vielen gleichzeitigen Abrufen nicht in die Knie geht. Mit über 14.800 GitHub-Sternen, mehr als 16.847 Commits und aktiver Pflege durch Framasoft (Frankreich) ist PeerTube eine reife, produktionstaugliche Lösung für Content Creator, NGOs, Bildungseinrichtungen und Unternehmen, die ihre Videos vollständig selbst hosten wollen – ohne Werbung, ohne Algorithmen und ohne Vendor-Lock-in. Diese Anleitung führt dich Schritt für Schritt durch die Installation mit Docker Compose auf einem beliebigen Linux-Server.
Voraussetzungen
- Docker Engine >= 20.x und Docker Compose V2 installiert – falls noch nicht vorhanden, folge der Anleitung Docker und Docker Compose auf Linux installieren.
- Linux-Server oder VPS (Ubuntu 22.04/24.04 oder Debian 12 empfohlen) mit mindestens 2 vCPU und 2 GB RAM (4 GB+ empfohlen für flüssigen Betrieb).
- Mindestens 20 GB SSD für das System; Videos benötigen zusätzlichen Speicher – plane großzügig oder nutze einen S3-kompatiblen Objektspeicher.
- Öffentliche IP-Adresse und eine registrierte Domain – HTTPS ist für PeerTube Pflicht, da ActivityPub-Federation nur über HTTPS funktioniert.
- DNS-Zugang: Ein A-Record (und optional AAAA für IPv6) muss auf die Server-IP zeigen, bevor du certbot startest.
- Eingehende Firewall-Freigaben für Port 80, 443 und optional 1935 (RTMP-Livestreaming). Wie du UFW korrekt konfigurierst, erklärt VPS absichern und härten mit UFW, SSH-Keys und Fail2Ban.
- openssl verfügbar (für die Generierung des
PEERTUBE_SECRET). - IPv6 muss auf dem Docker-Host aktiviert sein – dazu mehr in Schritt 1.
Schritt 1: IPv6 für Docker aktivieren und Projektordner anlegen
Das offizielle PeerTube-Compose-File aktiviert ein IPv6-fähiges Docker-Netzwerk. Ist IPv6 im Docker-Daemon nicht aktiviert, schlägt der Start fehl. Prüfe zunächst, ob /etc/docker/daemon.json bereits IPv6 aktiviert. Falls nicht, füge die folgenden Zeilen hinzu:
sudo nano /etc/docker/daemon.json
{
"ipv6": true,
"fixed-cidr-v6": "fd00::/80"
}Danach Docker neu starten:
sudo systemctl restart dockerJetzt den Projektordner anlegen. Du kannst jeden Pfad wählen; /opt/peertube ist für Server üblich:
sudo mkdir -p /opt/peertube
sudo chown $USER:$USER /opt/peertube
cd /opt/peertubeLege die benötigten Unterordner für Volumes und das Nginx-Template an:
mkdir -p docker-volume/data \
docker-volume/config \
docker-volume/db \
docker-volume/redis \
docker-volume/nginx/peertube \
docker-volume/certbot/conf \
docker-volume/nginx-logs \
docker-volume/opendkim/keysVerifizieren: Führe ls -la /opt/peertube/docker-volume/ aus. Du solltest alle acht Unterordner sehen. Außerdem: docker info | grep -i ipv6 – die Ausgabe muss IPv6: true enthalten, bevor du weitermachst.
Schritt 2: Nginx-Konfigurationstemplate herunterladen
Der Nginx-Webserver-Container enthält das Nginx-Konfigurationstemplate nicht im Image – es muss manuell aus dem offiziellen PeerTube-Repository heruntergeladen werden. Ohne diese Datei startet der webserver-Container nicht.
curl -fsSL \
https://raw.githubusercontent.com/Chocobozzz/PeerTube/develop/support/docker/production/config/nginx/peertube \
-o /opt/peertube/docker-volume/nginx/peertube/peertube.templatePrüfe, ob die Datei Inhalt hat:
wc -l /opt/peertube/docker-volume/nginx/peertube/peertube.templateVerifizieren: Die Ausgabe von wc -l sollte deutlich mehr als 0 Zeilen zeigen (typischerweise 80–150 Zeilen). Ist die Datei leer oder fehlt sie, schlägt der Webserver-Container beim Start mit „no such file or directory" fehl.
Schritt 3: .env-Datei erstellen
Alle Pflicht- und optionalen Einstellungen werden in einer .env-Datei im Projektordner gepflegt. Generiere zunächst ein sicheres Secret:
openssl rand -hex 32Kopiere die Ausgabe – du benötigst sie in der nächsten Zeile. Erstelle dann die .env-Datei:
nano /opt/peertube/.env
# === PostgreSQL ===
POSTGRES_USER=peertube_user
POSTGRES_PASSWORD=SicheresPasswortHierEinsetzen
POSTGRES_DB=peertube
# === PeerTube Datenbank ===
PEERTUBE_DB_USERNAME=${POSTGRES_USER}
PEERTUBE_DB_PASSWORD=${POSTGRES_PASSWORD}
PEERTUBE_DB_HOSTNAME=postgres
PEERTUBE_DB_SSL=false
# === PeerTube Kernkonfiguration ===
# ACHTUNG: PEERTUBE_WEBSERVER_HOSTNAME ist nach dem ersten Start UNVERAENDERLICH!
PEERTUBE_WEBSERVER_HOSTNAME=video.meinedomain.de
# Secret generieren mit: openssl rand -hex 32
PEERTUBE_SECRET=HIER_DEIN_32_ZEICHEN_HEX_SECRET_EINFUEGEN
# Vertrauenswuerdige Proxy-IPs (Nginx-Subnetz muss enthalten sein)
PEERTUBE_TRUST_PROXY=["127.0.0.1","loopback","172.18.0.0/16"]
# === Administrator ===
PEERTUBE_ADMIN_EMAIL=admin@meinedomain.de
# === SMTP / Postfix ===
PEERTUBE_SMTP_HOSTNAME=postfix
PEERTUBE_SMTP_PORT=25
PEERTUBE_SMTP_FROM=noreply@meinedomain.de
PEERTUBE_SMTP_TLS=false
# === Postfix / DKIM (optional) ===
POSTFIX_myhostname=meinedomain.de
OPENDKIM_DOMAINS=meinedomain.de=peertube
OPENDKIM_RequireSafeKeys=noSchütze die Datei vor fremdem Zugriff:
chmod 600 /opt/peertube/.envVerifizieren: Führe grep PEERTUBE_SECRET /opt/peertube/.env aus – der Wert darf nicht leer oder der Platzhalter sein. Prüfe außerdem, dass PEERTUBE_WEBSERVER_HOSTNAME deine echte Domain (ohne https://) enthält. Mit stat -c "%a" /opt/peertube/.env sollte 600 zurückkommen.
Schritt 4: compose.yaml erstellen
Lege die Compose-Datei im Projektordner an. Der Stack verwendet sieben Services: peertube, postgres, redis, webserver (Nginx), postfix, certbot und webserver-reloader. Der webserver-reloader-Container sendet alle 6 Stunden ein HUP-Signal an Nginx, damit neu ausgestellte Let's-Encrypt-Zertifikate sofort aktiv werden.
Eckdaten auf einen Blick
| Parameter | Wert |
|---|---|
| Image (PeerTube) | chocobozzz/peertube:production (v8.2.0) |
| Webserver-Image | chocobozzz/peertube-webserver:latest |
| Datenbank | postgres:17-alpine |
| Cache | redis:8-alpine |
| Port HTTP/HTTPS | 80, 443 (Nginx) |
| Port RTMP | 1935 (PeerTube direkt) |
| Architektur | linux/amd64, linux/arm64 |
| Lizenz | AGPL-3.0 |
| Volume (Host-Pfad) | Zweck |
|---|---|
| ./docker-volume/data | Videos, Thumbnails, Avatare |
| ./docker-volume/config | production.yaml (PeerTube-Konfiguration) |
| ./docker-volume/db | PostgreSQL-Datenbankdateien |
| ./docker-volume/redis | Redis-Persistenz |
| ./docker-volume/nginx/peertube | Nginx-Konfigurationstemplate |
| ./docker-volume/certbot/conf | Let's-Encrypt-Zertifikate |
| ./docker-volume/nginx-logs | Nginx-Zugriffs- und Fehlerprotokolle |
| ./docker-volume/opendkim/keys | DKIM-Schlüsseldateien für E-Mail |
services:
webserver:
image: chocobozzz/peertube-webserver:latest
env_file:
- .env
ports:
- "80:80"
- "443:443"
volumes:
- type: bind
source: ./docker-volume/nginx/peertube
target: /etc/nginx/conf.d/peertube.template
- assets:/var/www/peertube/peertube-latest/client/dist:ro
- ./docker-volume/data:/var/www/peertube/storage
- certbot-www:/var/www/certbot
- ./docker-volume/certbot/conf:/etc/letsencrypt
- ./docker-volume/nginx-logs:/var/log/nginx
depends_on:
- peertube
restart: "always"
certbot:
container_name: certbot
image: certbot/certbot
volumes:
- ./docker-volume/certbot/conf:/etc/letsencrypt
- certbot-www:/var/www/certbot
restart: unless-stopped
entrypoint: /bin/sh -c "trap exit TERM; while :; do certbot renew --webroot -w /var/www/certbot; sleep 12h & wait $${!}; done;"
depends_on:
- webserver
webserver-reloader:
image: alpine:latest
command: >
sh -c "trap exit TERM;
while :; do
sleep 21600 & wait $$!;
echo 'Sending reload signal to webserver...';
kill -HUP 1;
done"
pid: "service:webserver"
depends_on:
- webserver
restart: "always"
peertube:
image: chocobozzz/peertube:production
networks:
default:
ipv4_address: 172.18.0.42
ipv6_address: fdab:e4b3:21a2:ef1b::42
env_file:
- .env
ports:
- "1935:1935"
volumes:
- assets:/app/client/dist
- ./docker-volume/data:/data
- ./docker-volume/config:/config
depends_on:
- postgres
- redis
- postfix
restart: "always"
postgres:
image: postgres:17-alpine
env_file:
- .env
volumes:
- ./docker-volume/db:/var/lib/postgresql/data
restart: "always"
redis:
image: redis:8-alpine
volumes:
- ./docker-volume/redis:/data
restart: "always"
postfix:
image: mwader/postfix-relay
env_file:
- .env
volumes:
- ./docker-volume/opendkim/keys:/etc/opendkim/keys
restart: "always"
networks:
default:
enable_ipv6: true
ipam:
driver: default
config:
- subnet: 172.18.0.0/16
- subnet: fdab:e4b3:21a2:ef1b::/64
volumes:
assets:
certbot-www:Verifizieren: Führe docker compose -f /opt/peertube/compose.yaml config aus. Wenn die YAML-Syntax korrekt ist, gibt Docker die vollständig aufgelöste Konfiguration aus. Fehlermeldungen hier deuten auf Einrückungsfehler hin.
Schritt 5: Erstes TLS-Zertifikat ausstellen
Nginx startet nicht, wenn kein gültiges Zertifikat vorhanden ist. Vor dem ersten vollständigen Stack-Start musst du ein initiales Let's-Encrypt-Zertifikat holen. Stelle sicher, dass der DNS-A-Record deiner Domain bereits auf die Server-IP zeigt und Port 80 in der Firewall freigegeben ist.
Starte zunächst nur den Webserver temporär, um den Webroot-Pfad bereitzustellen, oder nutze den Standalone-Modus (direkter Port-80-Zugriff):
cd /opt/peertube
# Standalone-Modus: certbot belegt kurz Port 80 selbst
docker run --rm \
-v /opt/peertube/docker-volume/certbot/conf:/etc/letsencrypt \
-p 80:80 \
certbot/certbot certonly \
--standalone \
--email admin@meinedomain.de \
--agree-tos \
--no-eff-email \
-d video.meinedomain.deVerifizieren: Nach erfolgreichem Ausstellen liegt das Zertifikat unter /opt/peertube/docker-volume/certbot/conf/live/video.meinedomain.de/fullchain.pem. Prüfe mit:
ls -la /opt/peertube/docker-volume/certbot/conf/live/video.meinedomain.de/Schritt 6: Stack starten
Jetzt startest du alle sieben Container auf einmal:
cd /opt/peertube
docker compose up -dBeim ersten Start lädt Docker alle Images herunter (insgesamt mehrere Gigabyte). Das kann je nach Internetverbindung einige Minuten dauern. PeerTube führt außerdem automatisch alle Datenbank-Migrationen aus.
Beobachte die Logs von PeerTube selbst:
docker compose logs -f peertubeWarte, bis in den Logs keine neuen Migrationsmeldungen mehr erscheinen und du eine Zeile wie Server listening on localhost:9000 siehst.
Verifizieren: Führe docker compose ps aus. Alle sieben Services müssen den Status Up oder running zeigen:
docker compose ps
# Erwartete Ausgabe (gekürzt):
# NAME STATUS
# peertube-webserver-1 Up
# peertube-certbot-1 Up
# peertube-webserver-reloader-1 Up
# peertube-peertube-1 Up
# peertube-postgres-1 Up
# peertube-redis-1 Up
# peertube-postfix-1 UpTeste zusätzlich den HTTPS-Zugriff:
curl -I https://video.meinedomain.deDu solltest HTTP/2 200 oder eine Weiterleitung auf die PeerTube-Startseite erhalten.
Schritt 7: Admin-Passwort abrufen und Ersteinrichtung
PeerTube generiert beim allerersten Start automatisch ein zufälliges Root-Passwort und gibt es in den Container-Logs aus. Hole es so ab:
docker compose logs peertube | grep -A1 rootDu siehst eine Ausgabe ähnlich wie:
# User root created.
# User password: AbCdEf123456XyZÖffne jetzt https://video.meinedomain.de im Browser und melde dich mit dem Benutzernamen root und dem gefundenen Passwort an. Ändere das Passwort sofort unter „Administration > Benutzer > root".
Falls du das Passwort verpasst hast oder zurücksetzen möchtest:
docker compose exec -u peertube peertube npm run reset-password -- -u rootRichte im Admin-Panel anschließend folgende Punkte ein:
- Instanzname und Beschreibung unter „Administration > Konfiguration > Instanz".
- Registrierungsmodus: Offen, mit Genehmigung oder geschlossen – je nach Anwendungsfall.
- Federation: Unter „Administration > Federation > Instanzen" anderen Instanzen folgen oder eingehende Follows genehmigen.
- DKIM: Der Postfix-Container erzeugt automatisch DKIM-Schlüssel. Lies den öffentlichen Schlüssel aus und hinterlege ihn als DNS-TXT-Eintrag:
docker compose exec postfix cat /etc/opendkim/keys/meinedomain.de/peertube.txt
Verifizieren: Rufe https://video.meinedomain.de/api/v1/config im Browser auf. Die API antwortet mit einem JSON-Objekt, das "serverVersion" und deinen Instanznamen enthält – das bestätigt, dass PeerTube korrekt läuft und die API erreichbar ist.
Schritt 8: Updates und Backup
PeerTube-Updates sind dank Docker Compose unkompliziert. PeerTube führt alle Datenbank-Migrationen beim Start automatisch aus – kein manueller Eingriff nötig:
cd /opt/peertube
docker compose pull
docker compose up -dFür den Backup-Prozess sind drei Bereiche relevant:
- Datenbank:
./docker-volume/dbsichern (oderpg_dump– Anleitung: PostgreSQL pg_dump und pg_restore). - Videodaten:
./docker-volume/data– kann sehr groß werden; S3-Objektspeicher (z. B. MinIO) ist für größere Instanzen sinnvoll. - Konfiguration:
./docker-volume/configund.env-Datei.
Eine vollständige Backup-Strategie findest du unter 3-2-1-Backup-Strategie umsetzen.
Verifizieren: Nach dem Update prüfe die neue Version in der Web-UI unter „Administration > Konfiguration > Über" oder per API:
curl -s https://video.meinedomain.de/api/v1/config | grep serverVersionTroubleshooting / Typische Fehler
- „no such file or directory" beim Webserver-Container: Das Nginx-Template fehlt oder ist leer. Prüfe
ls -la ./docker-volume/nginx/peertube/und lade die Datei wie in Schritt 2 beschrieben erneut herunter. - Webserver startet nicht (Zertifikat-Fehler): Nginx erwartet ein vorhandenes Zertifikat. Stelle sicher, dass Schritt 5 erfolgreich abgeschlossen wurde und das Zertifikat unter
./docker-volume/certbot/conf/live/liegt. - Docker-Netzwerk startet nicht (IPv6-Fehler): Fehlermeldung ähnlich „failed to create network: IPv6 is not enabled". Lösung:
/etc/docker/daemon.jsonwie in Schritt 1 anpassen und Docker neu starten. - JWT-Fehler / Sessions funktionieren nicht:
PEERTUBE_SECRETfehlt, ist leer oder wurde nach dem ersten Start geändert. Das Secret invalidiert alle bestehenden Sitzungen. Setze es einmalig mitopenssl rand -hex 32und ändere es danach nie wieder. - Rate-Limit-Probleme oder falsche Client-IPs in Logs:
PEERTUBE_TRUST_PROXYenthält das Nginx-Subnetz (172.18.0.0/16) nicht. PeerTube sieht dann immer die interne Nginx-IP als Absender-IP und setzt Rate-Limits falsch. - RTMP-Livestreaming schlägt fehl: Port 1935 ist durch die Firewall blockiert. Freischalten:
sudo ufw allow 1935/tcp. - PostgreSQL-Volume-Fehler „wrong ownership": Das Verzeichnis
./docker-volume/dbwurde mit falschen Rechten angelegt. Lösung: Verzeichnis löschen und neu erstellen – PostgreSQL initialisiert es selbst. - Domain nachträglich ändern: Technisch nicht unterstützt. PeerTube schreibt die Domain beim ersten Start hart in die Datenbank. Einzige Option: Kompletter Neustart mit frischer Datenbank und neuer Domain in
.env.
Häufige Fragen
Kann ich PeerTube lokal ohne öffentliche Domain testen?
Ja – für lokale Tests kannst du das Nginx/Certbot-Setup weglassen und PeerTube direkt über einen einfachen Reverse Proxy oder mit einem selbstsignierten Zertifikat betreiben. Für den Produktionsbetrieb ist HTTPS jedoch Pflicht: ActivityPub-Federation funktioniert ausschließlich über HTTPS, da andere Instanzen deine Signatur-Anfragen ablehnen, wenn kein gültiges Zertifikat vorliegt.
Wie aktualisiere ich PeerTube auf eine neue Version?
Ändere optional den Image-Tag in der compose.yaml auf einen spezifischen Tag (z. B. chocobozzz/peertube:v8.2.0) und führe dann docker compose pull && docker compose up -d aus. PeerTube führt alle notwendigen Datenbank-Migrationen beim Start automatisch aus. Mache vorher unbedingt ein Backup der Datenbank.
Wie konfiguriere ich Federation mit anderen Instanzen?
Im Admin-Panel unter „Administration > Federation > Instanzen folgen" kannst du anderen PeerTube-Instanzen folgen. Videos der gefolgten Instanzen erscheinen dann im lokalen Feed. Eingehende Follows kannst du manuell genehmigen oder automatisch akzeptieren lassen – das ist unter „Konfiguration > Federation" einstellbar.
Kann ich PeerTube auf einem Raspberry Pi 5 betreiben?
Ja – das offizielle Image chocobozzz/peertube:production unterstützt linux/arm64. Raspberry Pi 4 und 5 mit einem 64-Bit-Betriebssystem (Raspberry Pi OS 64-Bit oder Ubuntu) sind kompatibel. Für 32-Bit-ARMv7 gibt es kein offizielles Image.
Wie groß ist der Speicherbedarf für Videos?
PeerTube selbst ist schlank, aber Videos summieren sich schnell auf Hunderte von Gigabytes. Plane ./docker-volume/data großzügig oder hänge ein separates Laufwerk ein. Für größere Instanzen empfiehlt sich ein S3-kompatibler Objektspeicher (z. B. MinIO oder Hetzner Object Storage), den du über die PEERTUBE_OBJECT_STORAGE_*-Variablen konfigurierst. Wie du MinIO selbst hostest, zeigt MinIO S3 selbst hosten mit Docker.
Was bedeutet P2P-Streaming in der Praxis?
Wenn mehrere Zuschauer ein Video gleichzeitig schauen, tauschen ihre Browser per WebTorrent Videosegmente direkt untereinander aus. Dein Server überträgt das Video dann nicht mehr vollständig an jeden Zuschauer – die Bandbreitenlast sinkt erheblich. Bei wenigen gleichzeitigen Zuschauern fällt dieser Effekt gering aus; bei populären Inhalten kann er die Server-Last signifikant reduzieren.
Fazit
PeerTube ist eine der technisch ausgereiftesten Self-Hosted-Videoplattformen, die du heute aufsetzen kannst. Der Docker-Compose-Stack ist zwar mit sieben Containern etwas umfangreicher als bei manch anderem Self-Hosted-Dienst, aber die Trennung der Verantwortlichkeiten (Nginx, Certbot, Datenbank, Cache, E-Mail) macht den Betrieb robust und wartbar. Die wichtigsten Punkte, die du im Kopf behalten solltest: Die Domain ist nach dem ersten Start unveränderlich, das PEERTUBE_SECRET muss vor dem Start gesetzt sein, und das Nginx-Template muss manuell heruntergeladen werden. Wer diese drei Fallstricke kennt, hat eine stabile Videoplattform, die sich dank ActivityPub nahtlos in das Fediverse integriert – vollständig unter eigener Kontrolle, ohne Werbung und ohne Abhängigkeit von Drittanbietern.
Weiterführende Anleitungen und Quellen
- Docker und Docker Compose auf Linux installieren – die Self-Hosting-Grundlage
- VPS absichern und härten: UFW, SSH-Keys und Fail2Ban
- MinIO S3 selbst hosten mit Docker und Traefik
- PostgreSQL pg_dump und pg_restore: Backup und Migration
- 3-2-1-Backup-Strategie praktisch umsetzen
- Jellyfin mit Docker: eigener Media-Server ohne Abo
Offizielle Quellen: PeerTube Docker-Installationsdokumentation (docs.joinpeertube.org) sowie das PeerTube GitHub-Repository (Chocobozzz/PeerTube).