Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung Cloud / Hosting 05.07.2026 · 11 min Lesezeit

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.

PeerTube mit Docker installieren: Dezentrale und föderierte Videoplattform für Self Hosting mit Docker Container, Fediverse Integration, Video Streaming, Community Verwaltung, Datenschutz und Open Source Alternative zu zentralen Videoplattformen.

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

  1. Docker Engine >= 20.x und Docker Compose V2 installiert – falls noch nicht vorhanden, folge der Anleitung Docker und Docker Compose auf Linux installieren.
  2. 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).
  3. Mindestens 20 GB SSD für das System; Videos benötigen zusätzlichen Speicher – plane großzügig oder nutze einen S3-kompatiblen Objektspeicher.
  4. Öffentliche IP-Adresse und eine registrierte Domain – HTTPS ist für PeerTube Pflicht, da ActivityPub-Federation nur über HTTPS funktioniert.
  5. DNS-Zugang: Ein A-Record (und optional AAAA für IPv6) muss auf die Server-IP zeigen, bevor du certbot startest.
  6. 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.
  7. openssl verfügbar (für die Generierung des PEERTUBE_SECRET).
  8. 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 docker

Jetzt 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/peertube

Lege 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/keys

Verifizieren: 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.template

Prüfe, ob die Datei Inhalt hat:

wc -l /opt/peertube/docker-volume/nginx/peertube/peertube.template

Verifizieren: 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 32

Kopiere 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=no

Schütze die Datei vor fremdem Zugriff:

chmod 600 /opt/peertube/.env

Verifizieren: 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

ParameterWert
Image (PeerTube)chocobozzz/peertube:production (v8.2.0)
Webserver-Imagechocobozzz/peertube-webserver:latest
Datenbankpostgres:17-alpine
Cacheredis:8-alpine
Port HTTP/HTTPS80, 443 (Nginx)
Port RTMP1935 (PeerTube direkt)
Architekturlinux/amd64, linux/arm64
LizenzAGPL-3.0
Volume (Host-Pfad)Zweck
./docker-volume/dataVideos, Thumbnails, Avatare
./docker-volume/configproduction.yaml (PeerTube-Konfiguration)
./docker-volume/dbPostgreSQL-Datenbankdateien
./docker-volume/redisRedis-Persistenz
./docker-volume/nginx/peertubeNginx-Konfigurationstemplate
./docker-volume/certbot/confLet's-Encrypt-Zertifikate
./docker-volume/nginx-logsNginx-Zugriffs- und Fehlerprotokolle
./docker-volume/opendkim/keysDKIM-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.de

Verifizieren: 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 -d

Beim 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 peertube

Warte, 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              Up

Teste zusätzlich den HTTPS-Zugriff:

curl -I https://video.meinedomain.de

Du 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 root

Du 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 root

Richte im Admin-Panel anschließend folgende Punkte ein:

  1. Instanzname und Beschreibung unter „Administration > Konfiguration > Instanz".
  2. Registrierungsmodus: Offen, mit Genehmigung oder geschlossen – je nach Anwendungsfall.
  3. Federation: Unter „Administration > Federation > Instanzen" anderen Instanzen folgen oder eingehende Follows genehmigen.
  4. 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 -d

Für den Backup-Prozess sind drei Bereiche relevant:

  1. Datenbank: ./docker-volume/db sichern (oder pg_dump – Anleitung: PostgreSQL pg_dump und pg_restore).
  2. Videodaten: ./docker-volume/data – kann sehr groß werden; S3-Objektspeicher (z. B. MinIO) ist für größere Instanzen sinnvoll.
  3. Konfiguration: ./docker-volume/config und .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 serverVersion

Troubleshooting / Typische Fehler

  1. „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.
  2. 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.
  3. Docker-Netzwerk startet nicht (IPv6-Fehler): Fehlermeldung ähnlich „failed to create network: IPv6 is not enabled". Lösung: /etc/docker/daemon.json wie in Schritt 1 anpassen und Docker neu starten.
  4. JWT-Fehler / Sessions funktionieren nicht: PEERTUBE_SECRET fehlt, ist leer oder wurde nach dem ersten Start geändert. Das Secret invalidiert alle bestehenden Sitzungen. Setze es einmalig mit openssl rand -hex 32 und ändere es danach nie wieder.
  5. Rate-Limit-Probleme oder falsche Client-IPs in Logs: PEERTUBE_TRUST_PROXY enthä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.
  6. RTMP-Livestreaming schlägt fehl: Port 1935 ist durch die Firewall blockiert. Freischalten: sudo ufw allow 1935/tcp.
  7. PostgreSQL-Volume-Fehler „wrong ownership": Das Verzeichnis ./docker-volume/db wurde mit falschen Rechten angelegt. Lösung: Verzeichnis löschen und neu erstellen – PostgreSQL initialisiert es selbst.
  8. 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

  1. Docker und Docker Compose auf Linux installieren – die Self-Hosting-Grundlage
  2. VPS absichern und härten: UFW, SSH-Keys und Fail2Ban
  3. MinIO S3 selbst hosten mit Docker und Traefik
  4. PostgreSQL pg_dump und pg_restore: Backup und Migration
  5. 3-2-1-Backup-Strategie praktisch umsetzen
  6. Jellyfin mit Docker: eigener Media-Server ohne Abo

Offizielle Quellen: PeerTube Docker-Installationsdokumentation (docs.joinpeertube.org) sowie das PeerTube GitHub-Repository (Chocobozzz/PeerTube).

Passende Anleitungen auf S-EDV

  1. GPT-5.5-Cyber: OpenAI startet Sicherheitsmodell als Konkurrenz zu Anthropic Myth
  2. FFmpeg PixelSmash: Kritische Sicherheitslücke in weit verbreitetem Video-Decoder
  3. nginx 1.31.2 schließt kritische Lücken in HTTP/3, gRPC und Charset Modul