Owncast mit Docker installieren: Selbstgehostete Live-Streaming-Plattform mit integriertem Chat
Owncast ist die quelloffene Twitch-Alternative als Docker-Container: RTMP-Ingest, HLS-Transcodierung, Webplayer und Chat ohne externe Datenbank. Diese Anleitung zeigt dir, wie du in 15 Minuten deinen eigenen Live-Stream-Server auf einem Linux-Host produktionsbereit aufsetzt.

Wer seinen Live-Stream lieber auf der eigenen Infrastruktur betreibt, als auf die Algorithmen und Regeln von Twitch oder YouTube angewiesen zu sein, findet in Owncast eine vollständige Antwort. Die Open-Source-Plattform (MIT-Lizenz, über 11.000 GitHub-Stars) ist ein einziger, eigenständiger Go-Container: Er nimmt den Stream per RTMP von OBS, Streamlabs oder Restream entgegen, transcodiert ihn intern über FFmpeg zu HLS und liefert ihn mit einem reaktiven Webplayer und einem integrierten Echtzeit-Chat an deine Zuschauer aus. Keine externe Datenbank, kein Redis, kein separater Medienserver – alles in einem Image unter 100 MB. Diese Anleitung richtet sich an Admins und ambitionierte Selfhoster, die ihre Streaming-Infrastruktur vollständig selbst kontrollieren wollen: von Community-Streams über Firmen-Webcasts bis hin zu privaten Broadcasts.
Voraussetzungen
- Docker Engine >= 20.10 und Docker Compose Plugin v2 (
docker composeohne Bindestrich) auf einem Linux-Host, einer VM oder einem NAS mit Docker-Unterstützung. Falls du Docker noch nicht installiert hast, hilft dir die Anleitung Docker und Docker Compose auf Linux installieren. - Mindestens 2 CPU-Kerne und 1 GB RAM für eine Ausgabequalität; für mehrere Qualitätsstufen (z. B. 1080p + 720p) empfehlen sich 4 Kerne und 2 GB RAM, da FFmpeg-Transcodierung sehr CPU-intensiv ist.
- Offene Ports in der Host-Firewall: TCP 8080 (Webinterface) und TCP 1935 (RTMP). Im Heimnetz zusätzlich NAT-Portweiterleitung am Router für öffentliche Erreichbarkeit.
- Mindestens 10 GB freier Speicherplatz für lokale HLS-Segmente. Bei längeren Streams empfiehlt sich S3-kompatibler Objektspeicher (AWS S3, Backblaze B2, Wasabi) – Konfiguration im Admin-Panel.
- Optional: Einen Reverse-Proxy (Caddy, Nginx, Traefik) für HTTPS. Ohne TLS funktioniert die Fediverse/ActivityPub-Integration nicht. Die Anleitung Caddy als Reverse Proxy einrichten erklärt das in wenigen Schritten.
- Streaming-Software: OBS Studio, Streamlabs OBS, Restream oder jede andere RTMP-fähige Software auf deinem Rechner.
Eckdaten auf einen Blick
| Parameter | Wert | Hinweis |
|---|---|---|
| Image | owncast/owncast:0.2.5 | Stabiles Produktions-Tag (April 2026); alternativ :latest für automatische Updates |
| Architekturen | amd64, arm64, arm/v7, 386 | Läuft auf x86-Server, Raspberry Pi 3/4/5, NAS |
| Port 8080 | HTTP – Webplayer + Admin | Pflicht; im Admin-Panel änderbar (erfordert Neustart) |
| Port 1935 | RTMP – Stream-Ingest | Pflicht; muss direkt vom Host erreichbar sein |
| Volume | ./data:/app/data | SQLite-DB, Konfiguration, Thumbnails, HLS-Segmente |
| Datenbank | SQLite (eingebettet) | Keine externe DB erforderlich |
| Standard-Login | admin / abc123 | Sofort nach Erststart ändern! |
| Standard-Stream-Key | abc123 | Separat vom Admin-Passwort – in OBS eintragen |
| Lizenz | MIT | 11.300+ GitHub-Stars, Maintainer: Gabe Kangas |
Schritt 1: Projektordner und Verzeichnisstruktur anlegen
Erstelle einen dedizierten Ordner für Owncast. Alle persistenten Daten (SQLite-Datenbank, Konfiguration, HLS-Segmente) landen im Unterordner data/, der als Docker-Volume gemountet wird. Docker legt diesen Ordner beim ersten Start automatisch an – du kannst ihn aber auch vorab anlegen, um Berechtigungsprobleme auszuschließen.
sudo mkdir -p /opt/owncast/data
cd /opt/owncastWenn du ohne sudo arbeitest oder einen NAS-Pfad nutzt, passe den Pfad entsprechend an, z. B. ~/owncast. Wichtig ist, dass der Docker-Daemon Schreibrechte auf das data/-Verzeichnis hat.
Verifizieren: Das Verzeichnis existiert und ist beschreibbar.
ls -la /opt/owncast/
# Erwartete Ausgabe:
# drwxr-xr-x data/Schritt 2: .env-Datei anlegen
Owncast benötigt keine Pflicht-Umgebungsvariablen – alle Konfiguration erfolgt über das Admin-Panel. Die .env-Datei ist trotzdem sinnvoll, um Port-Kollisionen mit anderen Diensten komfortabel zu lösen, ohne in der compose.yaml editieren zu müssen.
# /opt/owncast/.env
# Externe Ports für den Owncast-Container (Host-seitig)
OWNCAST_WEB_PORT=8080
OWNCAST_RTMP_PORT=1935
# Hinweis: Falls Port 8080 bereits belegt ist (z. B. durch Portainer),
# setze OWNCAST_WEB_PORT=8090 oder einen anderen freien Port.Verifizieren: Die Datei ist vorhanden und korrekt formatiert.
cat /opt/owncast/.env
# Ausgabe: Die beiden PORT-Variablen erscheinen ohne Fehler.Schritt 3: compose.yaml erstellen
Erstelle die Compose-Datei. Das Setup ist bewusst schlank: ein einziger Service, zwei Ports, ein Volume. Keine Datenbank-Abhängigkeit, kein separates Netzwerk notwendig – Owncast läuft vollständig eigenständig.
# /opt/owncast/compose.yaml
services:
owncast:
image: owncast/owncast:0.2.5
container_name: owncast
restart: unless-stopped
ports:
- "${OWNCAST_WEB_PORT:-8080}:8080" # Webinterface + Admin-Panel
- "${OWNCAST_RTMP_PORT:-1935}:1935" # RTMP-Ingest (OBS, Streamlabs ...)
volumes:
- ./data:/app/data # SQLite-DB, Konfig, HLS-Segmente
# Keine Pflicht-Umgebungsvariablen erforderlich.
# Alle Einstellungen im Admin-Panel: http://[HOST]:8080/admin
# Standard-Login: admin / abc123 -- SOFORT aendern!
# Standard-Stream-Key: abc123 -- SOFORT aendern!Wenn du lieber auf Updates reagieren möchtest, als ein fixes Tag zu pinnen, ersetze 0.2.5 durch latest und richte dir Diun oder WUD für automatische Update-Benachrichtigungen ein. Für Produktionsumgebungen ist das explizite Tag stabiler.
Verifizieren: Die YAML-Syntax ist gültig.
cd /opt/owncast
docker compose config
# Erwartete Ausgabe: Aufgelöste compose.yaml ohne Syntaxfehler.Schritt 4: Container starten
Starte Owncast im Hintergrund. Docker lädt das Image beim ersten Start automatisch herunter (ca. 87–93 MB je nach Architektur).
cd /opt/owncast
docker compose up -dDen aktuellen Status prüfst du so:
docker compose ps
# Erwartete Ausgabe (Spalte STATUS = "Up"):
# NAME IMAGE COMMAND SERVICE STATUS PORTS
# owncast owncast/owncast:0.2.5 ... owncast Up 0.0.0.0:8080->8080/tcp, 0.0.0.0:1935->1935/tcpDie Logs sollten keine Fehlermeldungen zu Ports oder Volumes zeigen:
docker compose logs owncast
# Erwartete Ausgabe enthaelt u. a.:
# Starting Owncast v0.2.5
# Web server is listening on port 8080
# RTMP is listening on port 1935Verifizieren: HTTP-Endpunkt antwortet mit einer 200-Antwort.
curl -I http://localhost:8080
# Erwartete Ausgabe:
# HTTP/1.1 200 OKSchritt 5: Ersteinrichtung im Admin-Panel
Öffne http://[HOST-IP]:8080/admin im Browser. Melde dich mit den Standard-Zugangsdaten admin / abc123 an – und ändere sie sofort. Ein öffentlich erreichbarer Server mit Standardpasswort ist innerhalb von Minuten kompromittiert.
Folgende Einstellungen solltest du direkt nach dem ersten Login vornehmen:
- Admin-Passwort ändern: Unter Server Settings → Change Admin Password. Wähle ein starkes, zufälliges Passwort.
- Stream-Key ändern: Unter Stream Keys. Der Stream-Key ist vom Admin-Passwort unabhängig und wird in OBS/Streamlabs eingetragen. Standard ist ebenfalls
abc123. - Server-Name und -URL setzen: Unter Server Settings → Server Name die öffentliche Domain eintragen (z. B.
stream.example.com). Ohne korrekte Domain funktioniert die Fediverse-Integration nicht. - Video-Ausgaben konfigurieren: Unter Video → Stream Output Variants. Für einen einzelnen VPS mit 2 CPU-Kernen empfehle ich eine einzige Ausgabevariante mit maximal 720p/30fps, um die CPU nicht zu überlasten.
- Chat-Einstellungen anpassen: Unter Chat kannst du Moderation, Authentifizierungspflicht und Emojis aktivieren.
Verifizieren: Melde dich nach dem Passwort-Wechsel erneut an – das alte Passwort abc123 darf nicht mehr funktionieren. Der neue Stream-Key ist unter Stream Keys sichtbar.
Schritt 6: OBS Studio verbinden und ersten Stream testen
In OBS Studio navigierst du zu Einstellungen > Stream und trägst folgende Werte ein:
| OBS-Feld | Wert |
|---|---|
| Dienst | Benutzerdefiniert… |
| Server | rtmp://[DEINE-IP-ODER-DOMAIN]:1935/live |
| Stream-Key | Dein in Owncast gesetzter Stream-Key |
Klicke auf „Streaming starten". Wechsle danach im Browser zu http://[HOST]:8080 – der Webplayer sollte nach wenigen Sekunden (HLS-Pufferzeit) deinen Stream anzeigen.
Verifizieren: Im Owncast-Admin unter Home wechselt der Status von „Offline" zu „Live". Die Logs zeigen die eingehende RTMP-Verbindung.
docker compose logs -f owncast
# Erwartete Ausgabe enthaelt:
# [RTMP] Connected: [OBS-Client-IP]
# Stream is now liveSchritt 7: Reverse Proxy und HTTPS einrichten
Owncast selbst terminiert kein TLS. Für HTTPS – Pflicht bei öffentlichen Streams und notwendig für die ActivityPub/Fediverse-Integration – schaltest du einen Reverse Proxy vor. Die ausführliche Konfiguration findest du in der Anleitung Caddy als Reverse Proxy einrichten.
Wichtig für Owncast: Der RTMP-Port 1935 kann nicht über einen HTTP-Proxy geleitet werden. Er muss immer direkt vom Host erreichbar sein – per Portmapping (1935:1935 in der compose.yaml) oder einem TCP-Proxy. Nur der Webport 8080 wird über den Reverse Proxy weitergeleitet.
Ein minimales Caddy-Beispiel:
stream.example.com {
reverse_proxy owncast:8080
}Nach der HTTPS-Konfiguration trägst du im Owncast-Admin unter Server Settings → Server URL die vollständige HTTPS-Domain ein, damit Fediverse-Links und Sharing-Funktionen korrekt funktionieren.
Verifizieren: HTTPS-Aufruf liefert 200 ohne Zertifikatsfehler.
curl -I https://stream.example.com
# HTTP/2 200Schritt 8: Updates durchführen und Backup einrichten
Owncast-Updates sind unkompliziert, weil alle Daten im Volume liegen:
cd /opt/owncast
docker compose pull
docker compose up -d
docker compose logs owncast | head -20Für das Backup reicht es, das ./data-Verzeichnis zu sichern – es enthält die SQLite-Datenbank owncast.db, alle Konfigurationen und Thumbnails. Owncast legt in diesem Verzeichnis automatisch Datenbank-Backups an. Für externe Sicherungen empfiehlt sich Restic; die Grundlagen erklärt die Anleitung 3-2-1-Backup-Strategie umsetzen.
Verifizieren: Container läuft nach dem Update mit der neuen Image-Version.
docker compose ps
docker inspect owncast | grep -i image
# Ausgabe zeigt das neue Image-Digest.Troubleshooting / Typische Fehler
- OBS verbindet sich, Stream startet aber nicht: Port 1935 ist in der Host-Firewall oder im Router blockiert. Prüfen mit
curl -v telnet://[HOST]:1935. Auf Ubuntu/Debian öffnen mit:sudo ufw allow 1935/tcp. - „address already in use" beim Containerstart: Ein anderer Dienst belegt Port 8080 (häufig: Portainer, Gitea, Grafana). Lösung:
OWNCAST_WEB_PORT=8090in der.envsetzen unddocker compose up -derneut ausführen. - Einstellungen nach Neustart weg: Das Volume
./data:/app/dataist nicht gemountet oder der Pfad stimmt nicht. Prüfen mitdocker inspect owncast | grep -A5 Mounts. Das lokaledata/-Verzeichnis muss Docker-beschreibbar sein. - Stream laggt oder bricht ab: Die CPU ist durch FFmpeg-Transcodierung überlastet. Im Admin-Panel unter Video → Stream Output Variants eine Ausgabevariante löschen oder die Auflösung reduzieren.
docker stats owncastzeigt die CPU-Last in Echtzeit. - Falscher Stream-Key in OBS: Eine falsche Key-Eingabe führt zur sofortigen Trennung ohne klare Fehlermeldung in OBS. Den aktuellen Key im Owncast-Admin unter Stream Keys kopieren und exakt in OBS eintragen.
- Fediverse-Integration funktioniert nicht: ActivityPub erfordert eine öffentlich erreichbare HTTPS-Domain. Localhost und reine IP-Adressen werden abgelehnt. Die Server-URL im Admin-Panel muss auf
https://deine-domain.tldzeigen. - Volume-Speicher füllt sich: HLS-Segmente langer Streams wachsen in
./data. Entweder S3-Speicher im Admin-Panel konfigurieren oder alte Segmente manuell löschen.du -sh /opt/owncast/data/zeigt den aktuellen Verbrauch. - Raspberry Pi armv6 nicht unterstützt: Das offizielle Image unterstützt arm/v7 und arm64, aber nicht armv6. Raspberry Pi 3/4/5 funktionieren problemlos.
Häufige Fragen
Brauche ich eine externe Datenbank wie PostgreSQL oder MySQL?
Nein. Owncast verwendet eine eingebettete SQLite-Datenbank, die automatisch als owncast.db in /app/data angelegt wird. Keinerlei externe Datenbankdienste erforderlich – das macht das Setup deutlich einfacher als viele andere Self-Hosting-Projekte.
Wie verbinde ich OBS mit Owncast genau?
In OBS unter Einstellungen > Stream: Dienst = „Benutzerdefiniert…", Server = rtmp://[DEINE-IP-ODER-DOMAIN]:1935/live, Stream-Key = der in Owncast konfigurierte Key. Nach dem Klick auf „Streaming starten" erscheint der Stream nach wenigen Sekunden im Owncast-Webplayer.
Funktioniert Owncast auf einem Raspberry Pi?
Ja, das offizielle Image unterstützt linux/arm64 und linux/arm/v7, also Raspberry Pi 3, 4 und 5. Beachte jedoch: FFmpeg-Transcodierung ist CPU-intensiv. Auf einem Raspberry Pi 4 sind 720p/30fps mit einer Ausgabevariante realistisch; 1080p kann die CPU überlasten. armv6 (Raspberry Pi 1/Zero) wird nicht unterstützt.
Wie richte ich RTMP hinter einem Reverse Proxy ein?
RTMP ist ein TCP-Protokoll und kann nicht über einen HTTP-Reverse-Proxy geleitet werden. Port 1935 muss per Docker-Portmapping (1935:1935) direkt vom Host erreichbar sein. Wenn du Traefik verwendest, ist ein TCP-Entrypoint konfigurierbar, aber das direkte Portmapping ist in den meisten Setups die einfachste Lösung.
Was ist die Fediverse-Integration und wie aktiviere ich sie?
Owncast unterstützt ActivityPub: Nutzer auf Mastodon und anderen Fediverse-Plattformen können deinem Owncast-Account folgen und erhalten automatisch Benachrichtigungen, wenn du live gehst. Voraussetzung ist eine öffentlich erreichbare HTTPS-Domain. Die Integration aktivierst du im Admin-Panel unter Federation nach dem Setzen der korrekten Server-URL.
Kann ich S3-Speicher für die Video-Segmente nutzen?
Ja. Im Admin-Panel unter Storage kannst du einen S3-kompatiblen Objektspeicher (AWS S3, Backblaze B2, Wasabi, MinIO) konfigurieren. Damit werden die HLS-Segmente direkt in den Objektspeicher geschrieben, was lokalen Speicherplatz spart und die Bandbreite des Servers entlastet – empfehlenswert für längere Streams oder viele gleichzeitige Zuschauer.
Was passiert bei einem Container-Neustart mit meinen Einstellungen?
Solange das Volume ./data:/app/data korrekt gemountet ist, bleiben alle Einstellungen, die SQLite-Datenbank, der Stream-Key und Thumbnails vollständig erhalten. Ohne korrektes Volume-Mapping gehen beim nächsten docker compose down alle Daten verloren.
Fazit
Owncast ist eines der kompaktesten Self-Hosting-Projekte überhaupt: ein einziger Container, zwei Ports, ein Volume – und du hast eine vollständige Live-Streaming-Plattform mit integriertem Chat, die du vollständig selbst kontrollierst. Der Verzicht auf externe Abhängigkeiten macht Setup und Betrieb erfreulich unkompliziert. Die größten Stolperfallen sind die Standard-Zugangsdaten (abc123 unbedingt sofort ändern!), der RTMP-Port in der Firewall und die CPU-Last bei mehreren Transcodierungs-Varianten. Für öffentliche Streams ist ein Reverse Proxy mit HTTPS unverzichtbar – sowohl aus Sicherheitsgründen als auch für die Fediverse-Integration. Wer seinen Stream nicht in der Cloud von Twitch oder YouTube lassen möchte, findet in Owncast eine ausgereifte, aktiv gepflegte Alternative.
Weiterführende Anleitungen und Quellen
- Docker und Docker Compose auf Linux installieren – die Self-Hosting-Grundlage
- Caddy als Reverse Proxy einrichten: Anfänger-Anleitung mit automatischem HTTPS
- Docker-Container automatisch aktualisieren: Diun, WUD und Renovate im Vergleich
- 3-2-1-Backup-Strategie umsetzen: Anleitung mit Restic, USB-Disk und S3-Cloud
- Jellyfin mit Docker: eigener Media-Server ohne Abo
Offizielle Quellen: Owncast Container/Docker Guide · Owncast GitHub Repository · Owncast auf Docker Hub