Kommunikation

Eigene Community-Plattform mit Stoat einrichten

Schritt-für-Schritt-Anleitung, um Stoat auf einem dataforest Seed einzurichten. Eigene Community-Plattform mit Text- und Sprachkanälen per Docker Compose.

AutorMarvin Strauch
Veröffentlicht am16. Mai 2026
Min. Lesezeit~22 min
Wörter3.800
Schwierigkeit Anfänger
StackStoat · Community · Chat · Voice · Docker

Stoat auf einem dataforest Seed installieren

Diese Anleitung beschreibt die Installation von Stoat (ehemals Revolt) auf einem dataforest Seed. Stoat ist eine Open-Source-Plattform mit Text- und Sprachkanälen, die Sie als Discord-Alternative auf eigenem Server betreiben können. Backend in Rust, Voice Chat über LiveKit, Oberfläche mit Server-, Kanal- und Rollenkonzept. Seit 2021 entwickelt, AGPLv3-Lizenz.

Nach Abschluss dieser Anleitung steht eine per HTTPS erreichbare Community-Plattform mit Text- und Sprachkanälen auf Ihrem Server.

Aufbau von Stoat
Aufbau von Stoat

Voraussetzungen

  • Ein Seed in der dataforest Cloud (empfohlen: 4 CPU, 16 GB RAM für Voice Chat; 4 CPU, 8 GB RAM reichen für reinen Text-Betrieb). Stoat besteht aus 16 Docker-Containern, darunter MongoDB, Redis, RabbitMQ, MinIO und LiveKit. Voice Chat ist die ressourcenintensivste Komponente.
  • SSH-Zugriff auf den Seed
  • Eine eigene Domain (z.B. chat.ihre-community.de), die per DNS A-Record auf die IP-Adresse Ihres Seeds zeigt. Den A-Record setzen Sie bei Ihrem Domain-Anbieter: Tragen Sie dort die IP-Adresse des Seeds als Ziel für die gewünschte Subdomain ein. Nach dem Setzen kann es bis zu einer Stunde dauern, bis der Eintrag weltweit aktiv ist.

Docker installieren

Verbinden Sie sich per SSH mit Ihrem Seed und installieren Sie Docker. Das offizielle Installationsskript erkennt Ihr Betriebssystem automatisch und richtet Docker inklusive Docker Compose ein:

bash
curl -fsSL https://get.docker.com | sh

Repository klonen und Konfiguration generieren

Stoat stellt ein offizielles Repository mit Docker Compose-Konfiguration und einem Konfigurationsskript bereit. Klonen Sie das Repository und führen Sie das Skript mit Ihrer Domain aus:

bash
git clone https://github.com/stoatchat/self-hosted /opt/stoat
cd /opt/stoat
chmod +x ./generate_config.sh
./generate_config.sh chat.ihre-community.de

Ersetzen Sie chat.ihre-community.de durch Ihre Domain.

Das Skript stellt zwei Fragen:

  1. "Would you like to place Stoat behind another reverse proxy?" Antworten Sie mit N (Nein). Stoat bringt Caddy als Reverse Proxy mit, der automatisch ein SSL-Zertifikat von Let's Encrypt bezieht.
  2. "Would you like to enable camera and screen sharing?" Antworten Sie mit Y (Ja), wenn Voice und Video genutzt werden sollen.

Das Skript generiert alle nötigen Konfigurationsdateien:

  • secrets.env: Kryptographische Schlüssel für Verschlüsselung und Voice-Authentifizierung
  • Revolt.toml: Zentrale Anwendungskonfiguration mit allen Service-URLs
  • .env und .env.web: Domain- und Frontend-Einstellungen
  • livekit.yml: Voice-Server-Konfiguration

Wichtig: Sichern Sie secrets.env sofort an einem separaten Ort. Ohne diese Datei ist der Zugriff auf bereits hochgeladene Dateien nicht mehr möglich. Die Schlüssel in dieser Datei verschlüsseln den Dateispeicher.

MongoDB-Speicher begrenzen

MongoDB beansprucht standardmäßig 50% des verfügbaren Arbeitsspeichers für seinen internen Cache. Auf einem Server mit 16 GB RAM wären das 7,5 GB, was bei 16 parallel laufenden Containern zu Engpässen führt.

Erstellen Sie die Datei compose.override.yml, um den Cache auf 1,5 GB zu begrenzen:

yaml
services:
  database:
    command: mongod --wiredTigerCacheSizeGB 1.5

Docker Compose liest compose.override.yml automatisch und überschreibt den Startbefehl der Datenbank. 1,5 GB Cache reichen für Communities mit mehreren hundert Mitgliedern. Der Vorteil einer Override-Datei: Bei Updates über git pull bleibt Ihre Anpassung erhalten, da nur compose.yml überschrieben wird.

Starten

bash
docker compose up -d

Docker lädt alle Images herunter und startet die 16 Container. Der erste Start dauert einige Minuten, da alle Images heruntergeladen werden müssen. Caddy bezieht automatisch ein Let's Encrypt-Zertifikat für Ihre Domain.

Den Status aller Container prüfen:

bash
docker compose ps

Alle Container sollten den Status running zeigen. Der Container createbuckets zeigt Exited (0) an. Das ist korrekt: Er erstellt beim Start die nötigen Speicher-Buckets in MinIO und beendet sich dann.

Falls ein Container nicht startet:

bash
docker compose logs api

Sobald alle Container laufen, ist die Plattform unter Ihrer Domain erreichbar.

Firewall-Ports für Voice öffnen

Voice Chat benötigt zusätzliche Ports, die über die Standard-Webports (80/443) hinausgehen. LiveKit nutzt Port 7881 für die Signalisierung und die Ports 50000 bis 50100 für Audio- und Videodatenströme.

Auf einem frischen Debian 13-Seed ist keine Firewall aktiv, die Ports sind standardmäßig erreichbar. Falls eine Firewall konfiguriert ist:

bash
ufw allow 7881/tcp
ufw allow 50000:50100/udp

Ohne diese Ports funktionieren Textkanäle, aber Voice Chat schlägt fehl.

Erster Account und Server einrichten

Rufen Sie Ihre Domain im Browser auf (z.B. https://chat.ihre-community.de). Die Plattform zeigt ein Registrierungsformular. Erstellen Sie den ersten Account mit E-Mail-Adresse und Passwort.

Server erstellen

Nach der Anmeldung erstellen Sie Ihren ersten Server:

  1. Klicken Sie auf das + Symbol in der Seitenleiste
  2. Wählen Sie Server erstellen
  3. Vergeben Sie einen Namen (z.B. den Namen Ihrer Community)
  4. Der Server wird mit einem Standard-Textkanal erstellt

Kanäle anlegen

Innerhalb des Servers lassen sich weitere Kanäle erstellen:

  1. Klicken Sie auf das Zahnrad-Symbol neben dem Servernamen
  2. Unter Kanäle erstellen Sie Textkanäle und Sprachkanäle
  3. Kanäle lassen sich in Kategorien gruppieren (z.B. "Allgemein", "Gaming", "Entwicklung")

Rollen und Berechtigungen

Rollen steuern, wer welche Kanäle sehen und nutzen kann:

  1. In den Server-Einstellungen unter Rollen erstellen Sie neue Rollen
  2. Jede Rolle kann farblich gekennzeichnet werden
  3. Berechtigungen lassen sich pro Rolle und pro Kanal konfigurieren

Mitglieder einladen

Erstellen Sie einen Einladungslink unter Server-Einstellungen > Einladungen. Teilen Sie den Link mit Ihrer Community. Mitglieder können sich über den Browser oder die Android-App registrieren und dem Server beitreten.

Voice Chat testen

Erstellen Sie einen Sprachkanal und klicken Sie auf Beitreten. Der Browser fragt nach der Mikrofonberechtigung. Sobald mindestens zwei Mitglieder im Kanal sind, wird die Verbindung über LiveKit hergestellt.

Falls Voice Chat nicht funktioniert:

  1. Prüfen Sie, ob die Ports 7881/tcp und 50000-50100/udp erreichbar sind: nc -zv IHRE_SERVER_IP 7881
  2. Prüfen Sie die LiveKit-Logs: docker compose logs livekit
  3. Prüfen Sie, ob VITE_CFG_ENABLE_VIDEO=true in .env.web gesetzt ist

Registrierung einschränken (optional)

Standardmäßig kann sich jeder über das Registrierungsformular einen Account erstellen. Für eine geschlossene Community lässt sich die Registrierung auf Einladungscodes beschränken.

Öffnen Sie Revolt.toml und fügen Sie folgende Zeilen hinzu:

toml
[api.registration]
invite_only = true

Starten Sie den API-Container neu:

bash
docker compose restart api

Einladungscodes lassen sich über die MongoDB-Datenbank erstellen:

bash
docker compose exec database mongosh --eval 'use revolt; db.invites.insertOne({ _id: "IHR_EINLADUNGSCODE" })'

Ersetzen Sie IHR_EINLADUNGSCODE durch einen Code Ihrer Wahl. Neue Mitglieder geben diesen Code bei der Registrierung ein.

Backup einrichten

Datenbank-Backup

Die MongoDB-Datenbank enthält alle Nachrichten, Server, Kanäle und Benutzerkonten. Erstellen Sie zunächst das Backup-Verzeichnis:

bash
mkdir -p /opt/backups

Ein einzelnes Backup lässt sich jederzeit manuell erstellen:

bash
docker compose -f /opt/stoat/compose.yml exec -T database mongodump --archive --gzip > /opt/backups/stoat-db-$(date +%Y%m%d).gz

Der Befehl führt mongodump im Datenbank-Container aus und speichert ein komprimiertes Backup mit dem aktuellen Datum im Dateinamen. Die Option -T deaktiviert die Terminal-Emulation, was für automatisierte Befehle nötig ist.

Damit das Backup automatisch läuft, richten Sie einen Cronjob ein. Ein Cronjob ist ein zeitgesteuerter Befehl, der vom Betriebssystem regelmäßig ausgeführt wird:

bash
crontab -e

Fügen Sie folgende Zeile hinzu:

text
0 3 * * * docker compose -f /opt/stoat/compose.yml exec -T database mongodump --archive --gzip > /opt/backups/stoat-db-$(date +\%Y\%m\%d).gz

Die fünf Werte 0 3 * * * bedeuten: Minute 0, Stunde 3, jeden Tag, jeden Monat, jeden Wochentag. Das Backup wird also täglich um 03:00 Uhr nachts erstellt.

Dateispeicher sichern

Alle hochgeladenen Dateien (Bilder, Dokumente, Emojis) liegen im MinIO-Speicher unter /opt/stoat/data/minio/. Dieses Verzeichnis sollte regelmäßig gesichert werden, zum Beispiel mit rsync auf ein externes System.

Server-Backup über dataforest Cloud

Die dataforest Cloud bietet automatische tägliche Offsite-Backups als zubuchbare Option. Damit lassen sich alle Daten auf Ihrem Seed sichern und jederzeit wiederherstellen. Backups sind nicht standardmäßig aktiv und müssen in der Cloud-Konsole aktiviert werden.

Fehlerbehebung

Plattform ist nicht erreichbar: Prüfen Sie, ob alle Container laufen (docker compose ps). Falls der Caddy-Container nicht startet, ist möglicherweise Port 80 oder 443 bereits durch einen anderen Dienst belegt (ss -tlnp | grep -E ':80|:443').

Kein HTTPS-Zertifikat: Caddy benötigt eine Domain, die per DNS auf die IP-Adresse des Seeds zeigt. Prüfen Sie mit dig +short chat.ihre-community.de, ob der A-Record korrekt gesetzt ist. Caddy zeigt Zertifikatsfehler in seinen Logs: docker compose logs caddy.

Weiße Seite nach dem Start: Das Web-Frontend benötigt nach dem ersten Start bis zu zwei Minuten zum Laden. Prüfen Sie den Status mit docker compose logs web.

Voice Chat funktioniert nicht: Häufigste Ursache: Die Ports 7881/tcp und 50000-50100/udp sind nicht erreichbar. Prüfen Sie die Firewall und testen Sie die Erreichbarkeit von einem externen Gerät: nc -zv IHRE_SERVER_IP 7881.

Hoher Speicherverbrauch: Prüfen Sie, ob die MongoDB-Speicherbegrenzung aktiv ist:

bash
docker compose exec database mongosh --eval "db.serverStatus().wiredTiger.cache['maximum bytes configured']"

Der Wert sollte ca. 1,5 GB (1610612736 Bytes) betragen.

Aktualisieren

Stoat befindet sich in aktiver Entwicklung. Updates werden über das Git-Repository verteilt:

bash
cd /opt/stoat
git pull
./generate_config.sh --overwrite chat.ihre-community.de
docker compose pull
docker compose up -d

Die Option --overwrite generiert die Konfigurationsdateien neu, behält aber die bestehenden Schlüssel aus secrets.env bei.

Zusammenfassung

Nach Abschluss dieser Anleitung läuft eine eigene Community-Plattform auf Ihrem Server, per HTTPS erreichbar und mit automatischen Backups abgesichert. Text- und Sprachkanäle, Rollen, Berechtigungen und Custom Emojis sind sofort nutzbar.

Weitere Möglichkeiten für Ihren Seed finden Sie in unseren Lösungen und Anleitungen. Wenn Sie Ihren Server zusätzlich per VPN absichern möchten, beschreibt der WireGuard-Guide die Einrichtung eines eigenen VPN-Servers.

Bereit loszulegen?

Erstellen Sie Ihren ersten Seed und starten Sie in wenigen Minuten.