Server-Dokumentation · Deutsch
Ein eigener Server für eure Community.
Auf einem Linux-Server genügt ein Befehl: Das Installationsskript fragt nach Domain, HTTPS und Directory, schreibt die Konfiguration mit sicheren Zufallswerten und startet alles mit Docker. Auf einem Windows-Rechner erledigt dasselbe ein Paket, das ohne Docker auskommt. In beiden Fällen holt der mitgelieferte Caddy das HTTPS-Zertifikat, PostgreSQL speichert die Serverdaten, LiveKit übernimmt Sprache und Video. Weder Git noch Node.js noch ein Quellcode-Build sind dafür nötig.
Das installierst du: den Open-Source-Server Squorli Server und seinen Webclient. Squorli Directory ist ein separater Dienst und nicht Open Source; du verbindest ihn nur, du installierst ihn nicht mit.
Wähle deinen Weg. Alles darunter – erste Anmeldung, Directory, Reverse Proxy, Fehler beheben – gilt für jeden davon.
Linux-Server mit Docker
Der empfohlene Weg für einen gemieteten Server: ein Skript, ein paar Fragen, fertig.
Was du brauchst
- Einen Linux-Server (x86_64) mit root-Zugang über
sudo, etwa einen gemieteten vServer mit Debian oder Ubuntu, dazu curl. Docker samt Compose-Plugin installiert das Skript bei Bedarf mit. Rund 1 GB Arbeitsspeicher für App, Datenbank und LiveKit zusammen, mehr bei vielen gleichzeitigen Videos. - Eine eigene Domain, etwa
chat.example.org, deren DNS auf den Server zeigt. Browser geben Mikrofon und Kamera nur über HTTPS frei; einzige Ausnahme ist localhost. - Eingehend 80/tcp und 443/tcp für den mitgelieferten Proxy sowie 7881/tcp und 7882/udp direkt zu LiveKit. Die Medienports laufen nie über einen HTTP-Proxy; hinter einem Router leitest du sie weiter. Sind 7881 oder 7882 schon belegt, wählst du im Skript andere.
- Für Video Upload-Bandbreite am Server: LiveKit leitet jede Kamera an alle Zuschauenden weiter, der Upload wächst also mit Kameras mal Zuschauenden. Ein voller Kanal mit 15 Kameras und 15 Zuschauenden braucht grob 60 Mbit/s Upload und 20 Mbit/s Download – hochgerechnet aus einer Messung von etwa 4 Mbit/s je zuschauender Person. Für große Videokanäle mietest du einen Server; ein Heimanschluss reicht dafür meist nicht.
Belastbare Größenempfehlungen für den Produktivbetrieb oder garantierte Teilnehmerzahlen liegen noch nicht vor. Wer bereits einen Reverse Proxy betreibt, wählt das im Skript aus; mehr dazu unter Vorhandenen Reverse Proxy verwenden.
Installieren
Melde dich per SSH auf dem Server an, lade das Installationsskript und starte es. Es ist ein lesbares Bash-Skript: Vorher ansehen kannst du es auf GitHub.
curl -fsSL https://raw.githubusercontent.com/danielklessa/squorli/main/deploy/install.sh -o install.sh
sudo bash install.shDas Skript fragt der Reihe nach, auf Deutsch oder Englisch. Vorschläge in eckigen Klammern übernimmst du mit Enter:
- Domain – genau der Hostname, den die Browser aufrufen, ohne
https://. Das Skript zeigt, auf welche Adresse sie im DNS zeigt. - Servername – der Anfangsname, später in der Verwaltung änderbar.
- Wer sich um HTTPS kümmert – der mitgelieferte Caddy mit Let's-Encrypt-Zertifikat, ein Reverse Proxy auf demselben Rechner oder einer auf einem anderen Rechner (Vorhandenen Reverse Proxy verwenden).
- Ports – das Skript zeigt, welche Ports es braucht, prüft, ob ein anderer Dienst sie schon belegt, und schlägt dann freie vor. Jeden Port kannst du auch selbst wählen. Nur Caddy braucht fest 80 und 443, weil Let's Encrypt die Domain darüber prüft.
- Squorli Directory – ja (Vorschlag, bringt deinen Mitgliedern ein globales Konto), nein (der Server arbeitet für sich allein, mit eigenen Serverkonten
~name) oder ein anderes Directory. - Wer Eigentümerin wird – dein Squorli-Konto über seinen öffentlichen Schlüssel (nur mit Directory), ein Serverkonto (
~name), das du mit einem Einrichtungscode registrierst, den das Skript erzeugt und am Ende anzeigt, oder wer sich zuerst mit einem Konto anmeldet (Erste Anmeldung). - Öffentliche IP für Sprache und Video – leer lassen, dann ermittelt LiveKit sie selbst. Nur bei NAT oder mehreren Netzwerkschnittstellen trägst du die öffentliche IP ein.
- Container-Image – der Vorschlag ist
ghcr.io/danielklessa/squorli-server:latest. Für den Produktivbetrieb setzt du einen festen Tag oder Digest von der Paketseite bei GitHub ein.
Nach einer Zusammenfassung und deiner Bestätigung erledigt es den Rest. Fehlt Docker, installiert es Docker nach Rückfrage mit dem offiziellen Skript von get.docker.com. Es legt die Konfiguration in /opt/squorli ab, erzeugt Datenbankpasswort und LiveKit-Geheimnis als Zufallswerte in einer nur für root lesbaren .env, öffnet nach Rückfrage die Ports in einer aktiven ufw- oder firewalld-Firewall, holt die Images, startet die Container und prüft /api/health und /rtc/validate über deine Domain. Eine Firewall beim Hoster und Weiterleitungen im Router richtest du selbst ein.
Am Ende nennt das Skript die Adresse deines Servers. Antwortet sie noch nicht über HTTPS, stimmen meist DNS oder die eingehenden Ports noch nicht; Caddy versucht es von allein weiter (Fehler beheben).
Du kannst das Skript jederzeit erneut ausführen: Es erkennt die bestehende Installation und bietet an, sie zu aktualisieren oder ihre Einstellungen zu ändern. Geheimnisse, Datenbank und Dateien bleiben dabei erhalten, geänderte Dateien sichert es mit der Endung .bak. Das fertige Image gibt es derzeit nur für x86_64 (amd64); auf ARM-Rechnern baust du aus dem Quellcode.
Updates und Backups
Das Installationsskript richtet den Befehl squorli ein, der die Installation in /opt/squorli verwaltet:
# The installer's command for this installation (run as root)
sudo squorli status
sudo squorli logs server
sudo squorli backup
sudo squorli update
# Checks domain, certificate, proxy, LiveKit, media ports and the directory
sudo squorli doctor
# Replaces database and files with a backup (asks first)
sudo squorli restore /opt/squorli/backups/20260925-120000squorli backup schreibt einen Datenbank-Dump, ein Archiv mit Anhängen und Vorschaubildern und eine Kopie der .env in einen Ordner unter /opt/squorli/backups. Der Identitätsschlüssel des Servers liegt in der Datenbank; Anhänge allein sind kein vollständiges Backup. Bewahre die Kopien außerhalb des Servers auf. squorli restore mit so einem Ordner spielt ihn zurück: Es hält die App an, ersetzt Datenbank und alle Dateien durch die der Sicherung und startet wieder; die .env bleibt, wie sie ist. Für einen Umzug auf einen neuen Host installierst du dort zuerst, kopierst dann den Ordner hinüber und spielst ihn zurück. squorli update holt die aktuellen Images, sichert zuerst, wenn eines davon neu ist, und startet nur die Container neu, deren Image sich geändert hat; die anderen laufen weiter. Das Installationsskript erneut auszuführen und „Aktualisieren“ zu wählen, erneuert zusätzlich die Konfigurationsdateien von Compose, Caddy und LiveKit.
squorli doctor prüft, was bei einer Einrichtung am häufigsten schiefgeht, und benennt die wahrscheinliche Ursache: ob die Domain auflöst und das Zertifikat gilt, ob der Proxy das WebSocket-Upgrade und /rtc zu LiveKit durchreicht, ob LiveKit den API-Schlüssel annimmt, ob der TCP-Medienport erreichbar ist und ob das Directory den Server erreicht. Ist ein Directory eingetragen, wiederholt es die Prüfungen von außen, denn ob die eigenen Ports aus dem Internet offen sind, sieht der Server selbst nicht. Dieselbe Prüfung gibt es im Client unter Verwaltung › Server › „Verbindung prüfen“; dort baut der Browser zusätzlich eine echte Medienverbindung auf und sagt, ob sie über UDP läuft, nur über TCP oder gar nicht.
Notiere die Image-Version: latest ist veränderlich, und Migrationen laufen beim Start – ein Zurücksetzen des Images macht eine Datenbankänderung nicht rückgängig.
Automatische Updates
squorli autoupdate on richtet einen Job ein, der in einem Abstand deiner Wahl, von stündlich bis einmal täglich, nach neuen Images sucht und sie einspielt. Gibt es nichts Neues, startet nichts neu; gibt es etwas, sichert der Job zuerst und startet nur neu, was sich geändert hat. squorli autoupdate zeigt den Stand und die letzten Läufe, squorli autoupdate off entfernt den Job. squorli update --check sieht nur nach.
# Looks for new images every so many hours and installs them; asks for the hours (1 to 24)
sudo squorli autoupdate on
# The state and the last runs
sudo squorli autoupdate
sudo squorli autoupdate off
# Only looks: exit code 10 when something is new, 0 when not
sudo squorli update --checkVor dem Einschalten lesen. Ein Update startet den App-Server neu, wann immer eine neue Version erscheint; wer in dem Moment schreibt oder spricht, wird kurz getrennt. Mit 24 Stunden läuft der Job einmal täglich um 04:17 Uhr, das ist die ruhige Wahl. Eine Version, die vor dem Update Handarbeit verlangt, wird nicht automatisch eingespielt: Der Job vermerkt sie in seinem Log und wartet auf dein squorli update. Ein Update, das fehlschlägt, wird unter Linux nicht zurückgenommen: Die Sicherung von davor bringt den alten Stand zurück. Der Job folgt dem Image-Tag in APP_IMAGE: stable nennt die neueste veröffentlichte Version, und der Befehl bietet an, ihn einzutragen; latest ändert sich mit jeder Änderung in der Entwicklung; eine feste Version ändert sich nie von selbst.
Kennt dein squorli den Befehl autoupdate noch nicht, führe das Installationsskript erneut aus und wähle „Aktualisieren“: Es schreibt den Befehl neu.
Windows ohne Docker
Für einen Windows-Rechner gibt es ein Paket, das kein Docker braucht: der App-Server mit eigenem Node.js, dazu PostgreSQL, LiveKit und Caddy, eingerichtet als Windows-Dienste. Es ist dasselbe Squorli wie unter Linux, mit denselben Fragen bei der Einrichtung und demselben Befehl squorli zum Verwalten.
Neu und noch nicht überall erprobt. Installiert und betrieben wurde das Paket bisher auf Windows 11, mit dem mitgelieferten Caddy, mit einem Reverse Proxy auf demselben Rechner und unter localhost: Einrichtung, Dienste, Sprache, Neustart des Rechners, Backup und Zurückspielen, Update, Entfernen. Der automatische Test des Pakets (Einrichtung, alle Befehle, Backup, Update, Entfernen) läuft auch auf Windows Server durch. Noch aus stehen IIS davor, Windows 10 und ein Windows Server im Betrieb mit Menschen.
Was du brauchst
- Windows 10 ab 22H2, Windows 11 (auch Home) oder Windows Server 2019, 2022 oder 2025, jeweils 64 Bit (x64). Ein Konto mit Administratorrechten, 2 GB freier Speicherplatz, rund 1 GB Arbeitsspeicher. Die Windows PowerShell gehört zu Windows; fehlt die Laufzeit von Microsoft Visual C++, lädt das Setup sie nach Rückfrage von Microsoft.
- Domain, Ports und Bandbreite wie beim Linux-Server: eine Domain, die auf den Rechner zeigt, eingehend 80/tcp und 443/tcp für den mitgelieferten Caddy sowie 7881/tcp und 7882/udp für Sprache und Video.
- Ein PC als Server hat Grenzen: Windows Update startet ihn neu, im Standby ist der Server nicht erreichbar (das Setup bietet an, Standby im Netzbetrieb abzuschalten), und der Upload eines Heimanschlusses ist für Video knapp. Hinter einem Router leitest du die Ports weiter; wechselt die öffentliche Adresse des Anschlusses, braucht die Domain DynDNS.
- Die Programme im Paket sind nicht signiert. Windows fragt deshalb unter Umständen nach, bevor es sie ausführt.
Installieren
Lade auf der Release-Seite bei GitHub aus dem neuesten Release mit dem Namen „Squorli Server“ zwei Dateien in denselben Ordner: squorli-server-<Version>-windows-x64.zip und die gleichnamige Datei mit der Endung .sha256. Öffne dann eine PowerShell als Administrator (Rechtsklick auf Start › Terminal (Administrator)), wechsle in diesen Ordner und führe aus:
# In the folder with the two downloaded files
$zip = Get-Item .\squorli-server-*-windows-x64.zip
# The next two lines must print the same value
(Get-FileHash $zip -Algorithm SHA256).Hash.ToLower()
(Get-Content "$zip.sha256").Split(' ')[0]
Unblock-File $zip
& "$env:SystemRoot\System32\tar.exe" -xf $zip
cd $zip.BaseName
powershell -ExecutionPolicy Bypass -File .\install.ps1Die beiden ausgegebenen Zeilen müssen gleich sein: Dann ist das Paket das, das veröffentlicht wurde. Das Setup stellt dieselben Fragen wie das Installationsskript für Linux, auf Deutsch oder Englisch – ohne die nach dem Container-Image. Dazu kommt, was Windows braucht:
- Ordner – die Programme liegen in
C:\Program Files\Squorli, die Daten inC:\ProgramData\Squorli. - Alle fünf Ports – neben den Medienports auch die von App-Server, LiveKit-Signalisierung und Datenbank, weil sie hier Ports des Rechners selbst sind. Belegte ersetzt das Setup durch freie.
- Windows-Firewall – nach Rückfrage gibt das Setup die Medienports frei, mit dem mitgelieferten Caddy auch 80 und 443.
- Standby – nur auf einem PC: ob Standby und Ruhezustand im Netzbetrieb abgeschaltet werden.
Danach kopiert es die Programme, schreibt die .env mit frischen Zufallswerten (lesbar nur für Administratoren und den Dienst des App-Servers), legt die Datenbank an und richtet die Dienste SquorliPostgres, SquorliLiveKit, SquorliServer und – mit dem mitgelieferten Caddy – SquorliCaddy ein. Sie starten mit Windows, ohne dass sich jemand anmeldet, laufen jeweils unter einem eigenen Dienstkonto und werden nach einem Absturz neu gestartet. Zum Schluss prüft das Setup /api/health und /rtc/validate und nennt die Adresse und, falls gewählt, den Einrichtungscode für die erste Anmeldung.
Verwalten, Updates und Backups
Das Setup richtet den Befehl squorli ein. Er gilt in neu geöffneten Fenstern und braucht Administratorrechte:
# The setup's command for this installation (in a newly opened window, as administrator)
squorli status
squorli logs server
squorli backup
squorli update
# Checks domain, certificate, proxy, LiveKit, media ports and the directory
squorli doctor
# One service, or all of them, with the services that depend on it
squorli restart server
# Replaces database and files with a backup (asks first); takes a backup of a Linux installation too
squorli restore C:\ProgramData\Squorli\backups\20260928-120000squorli backup schreibt Datenbank, Dateien und eine Kopie der .env in einen Ordner unter C:\ProgramData\Squorli\backups, den nur Administratoren lesen können; bewahre Kopien außerhalb des Rechners auf. squorli restore spielt so einen Ordner zurück und nimmt auch die Sicherung einer Linux-Installation an – so zieht ein Server von Linux nach Windows um. squorli logs zeigt die letzten Zeilen, mit -Follow liest es weiter mit. squorli doctor prüft dasselbe wie unter Linux.
squorli update holt das neueste Release von GitHub, prüft dessen SHA-256-Prüfsumme, sichert zuerst und führt dann das Setup der neuen Version aus. Angehalten werden nur die Dienste, deren Programme sich geändert haben: Bringt ein Update nur eine neue Version von Squorli, laufen PostgreSQL und LiveKit weiter. Startet die neue Version nicht, holt es die bisherigen Programmdateien zurück. Migrationen der Datenbank macht das nicht rückgängig: Dafür ist die Sicherung da, die das Update zuvor geschrieben hat.
# Change settings: the setup again, it finds the installation
powershell -ExecutionPolicy Bypass -File "C:\Program Files\Squorli\install.ps1"
# Remove services and programs; the data stays unless you type "delete"
powershell -ExecutionPolicy Bypass -File "C:\Program Files\Squorli\uninstall.ps1"Das Setup erneut auszuführen, ändert die Einstellungen; Geheimnisse, Datenbank und Dateien bleiben. Beim Entfernen bleibt der Datenordner erhalten, solange du nicht ausdrücklich „löschen“ eintippst.
Automatische Updates
squorli autoupdate on richtet in der Aufgabenplanung von Windows eine Aufgabe ein, die in einem Abstand deiner Wahl, von stündlich bis einmal täglich, nach einer neuen Version sucht und sie einspielt. Gibt es keine, wird nichts angehalten; gibt es eine, sichert die Aufgabe zuerst und hält nur an, was sich geändert hat. squorli autoupdate zeigt den Stand und die letzten Läufe, squorli autoupdate off entfernt die Aufgabe. squorli update -Check sieht nur nach.
# Looks for a new version every so many hours and installs it; asks for the hours (1 to 24)
squorli autoupdate on
# The state and the last runs
squorli autoupdate
squorli autoupdate off
# Only looks: exit code 10 when there is a newer version, 0 when not
squorli update -CheckVor dem Einschalten lesen. Ein Update startet den App-Server neu, wann immer eine neue Version erscheint; wer in dem Moment schreibt oder spricht, wird kurz getrennt. Mit 24 Stunden läuft die Aufgabe einmal täglich um 04:17 Uhr, das ist die ruhige Wahl. Eine Version, die vor dem Update Handarbeit verlangt, wird nicht automatisch eingespielt: Der Job vermerkt sie in seinem Log und wartet auf dein squorli update. Startet eine neue Version nicht, kommen die bisherigen Programmdateien zurück; was geschah, steht in C:\ProgramData\Squorli\logs\autoupdate.log.
Die Befehle kommen mit der ersten Version nach 0.6.0: Kennt dein squorli den Befehl autoupdate noch nicht, führe einmal squorli update aus.
Mit vorhandenem Webserver
Auf vielen Windows-Servern hält IIS bereits die Ports 80 und 443. Das Setup erkennt das, nennt das Programm und schlägt „Ein Reverse Proxy auf diesem Rechner“ vor: App-Server und LiveKit lauschen dann nur auf 127.0.0.1, und dein Webserver leitet an sie weiter. Vorlagen für nginx, Caddy und IIS (URL Rewrite und Application Request Routing) liegen nach der Installation in C:\Program Files\Squorli\proxies; die für IIS wurde noch nicht mit einer echten Installation geprüft. Was der Proxy können muss, steht unter Vorhandenen Reverse Proxy verwenden.
Von Hand mit Docker Compose
Das Installationsskript für Linux führt nur die folgenden Schritte aus. Wer jeden davon selbst in der Hand behalten möchte, installiert so von Hand – in einem beliebigen Ordner, mit Docker Engine, Compose-Plugin, curl und OpenSSL. Was der Server braucht, steht unter Linux-Server.
Konfiguration herunterladen
mkdir -p squorli/deploy/caddy squorli/deploy/livekit squorli/deploy/proxies
cd squorli
curl -fL https://raw.githubusercontent.com/danielklessa/squorli/main/.env.example -o .env
curl -fL https://raw.githubusercontent.com/danielklessa/squorli/main/deploy/compose.yml -o deploy/compose.yml
curl -fL https://raw.githubusercontent.com/danielklessa/squorli/main/deploy/caddy/Caddyfile -o deploy/caddy/Caddyfile
curl -fL https://raw.githubusercontent.com/danielklessa/squorli/main/deploy/livekit/livekit.yaml -o deploy/livekit/livekit.yaml
curl -fL https://raw.githubusercontent.com/danielklessa/squorli/main/deploy/proxies/nginx.ports.yml -o deploy/proxies/nginx.ports.ymlDiese Befehle laden fünf Konfigurationsdateien in einen neuen Ordner squorli, keinen Quellcode: Anwendung und Webclient kommen aus dem fertigen Container-Image. Das nginx-Overlay brauchst du nur für das Heim-Setup oder einen eigenen Reverse Proxy. Führe den Download einmal in einem neuen Verzeichnis aus – ein erneuter Download würde deine ausgefüllte .env überschreiben. Squorli Server steht unter der Apache License 2.0; siehe LICENSE und NOTICE im Repository.
Die Datei .env ausfüllen
Öffne .env im Ordner squorli mit einem Texteditor und ersetze Hostnamen und Geheimnisse. Die Datei enthält Passwörter: halte sie privat.
PUBLIC_DOMAIN=chat.example.org
SERVER_NAME=My community
APP_IMAGE=ghcr.io/danielklessa/squorli-server:latest
PROXY_MODE=bundled
POSTGRES_PASSWORD=REPLACE_WITH_RANDOM_HEX
LIVEKIT_API_KEY=squorli
LIVEKIT_API_SECRET=REPLACE_WITH_ANOTHER_RANDOM_HEX
DIRECTORY_URL=https://directory.squorli.com
LIVEKIT_NODE_IP=
# Optional: reserve initial ownership for your public key
# OWNER_PUBLIC_KEY=YOUR_64_CHARACTER_HEX_PUBLIC_KEYErzeuge für jedes Geheimnis einen eigenen Zufallswert. Ein Hex-Wert vermeidet außerdem reservierte Zeichen in der Datenbank-URL.
openssl rand -hex 32| Wert | Bedeutung |
|---|---|
PUBLIC_DOMAIN | Genau der Hostname, den die Browser aufrufen – ohne Protokoll und ohne Pfad. Anmeldesignaturen sind daran gebunden. |
APP_IMAGE | Das veröffentlichte Image ghcr.io/danielklessa/squorli-server:latest. Verfügbare Tags und Digests stehen auf der Paketseite bei GitHub; für den Produktivbetrieb setzt du einen festen Tag oder Digest ein. |
PROXY_MODE | bundled für den mitgelieferten Caddy. Der Wert muss zum Compose-Profil passen; die Vorlage steht auf external, du änderst ihn also ausdrücklich. |
POSTGRES_PASSWORDLIVEKIT_API_SECRET | Je ein eigener Zufallswert aus dem Befehl oben. Das LiveKit-Geheimnis braucht mindestens 32 Zeichen; verwende nie den Wert aus einer Entwicklungsumgebung. |
DIRECTORY_URL | https://directory.squorli.com ist die Voreinstellung und bringt deinen Mitgliedern ein globales Konto. Leer lassen heißt: Der Server arbeitet für sich allein, alle Konten sind Serverkonten (~name und Passwort, auf jedem Gerät nutzbar). |
LOCAL_ACCOUNTS | Serverkonten (~name) neben Squorli-Konten: true oder false legt es fest, leer lassen heißt, die Verwaltung entscheidet (Voreinstellung aus). Ohne Directory immer an. |
LIVEKIT_NODE_IP | Leer lassen – LiveKit ermittelt seine öffentliche Adresse selbst. Bei NAT oder mehreren Netzwerkschnittstellen trägst du die öffentliche IP des Hosts ein. |
OWNER_PUBLIC_KEY | Der öffentliche Schlüssel deines Squorli-Kontos (64 Hex-Zeichen), damit nur du Eigentümerin wirst; siehe Erste Anmeldung. |
OWNER_SETUP_CODE | Stattdessen oder zusätzlich: ein geheimer Code (zum Beispiel aus openssl rand -hex 12). Wer beim Registrieren eines Serverkontos diesen Code eingibt, wird Eigentümerin, solange es keine gibt. |
Alle weiteren Variablen sind in der Umgebungsvorlage dokumentiert, darunter SERVER_NAME (Anfangsname, später in der Verwaltung änderbar), MAX_UPLOAD_MB (Obergrenze für Anhänge, Standard 25), LINK_PREVIEWS (Vorschauen zu verlinkten Seiten, standardmäßig an; false schaltet sie und die ausgehenden Anfragen des Servers ab) und LOG_REQUESTS (eine Log-Zeile pro Anfrage mit IP-Adresse, nur zur Fehlersuche; standardmäßig aus).
Starten und prüfen
cd deploy
docker compose --env-file ../.env --profile bundled pull
docker compose --env-file ../.env --profile bundled up -d --no-build
docker compose --env-file ../.env --profile bundled ps
docker compose --env-file ../.env --profile bundled logs --tail=100 serverGib immer --env-file ../.env an: ohne diese Angabe bleiben Datenbankpasswort und LiveKit-Schlüssel leer. pull holt das fertige Image, --no-build verhindert einen lokalen Build. Die Datenbankmigrationen laufen beim Start der App automatisch.
Caddy fordert jetzt ein Zertifikat für deine Domain an; dafür müssen DNS und die eingehenden Ports stimmen. Danach prüfst du zwei Adressen:
curl -fsS https://chat.example.org/api/health
curl -s -o /dev/null -w '%{http_code}\n' https://chat.example.org/rtc/validateDie Health-Antwort nennt ok: true, deine domain und einen serverKey. HTTP 401 von /rtc/validate ist ohne Token richtig und zeigt, dass die Anfrage LiveKit erreicht. Ob Medien fließen, ist damit noch nicht geprüft – das zeigt erst der erste Sprachkanal.
Sichern, aktualisieren, zurückspielen
Du sicherst und aktualisierst aus squorli/deploy mit diesen Befehlen – mit deinem tatsächlichen Profil und deinen Overlays, ohne git pull und ohne die .env erneut herunterzuladen:
# Run from deploy; write a logical database backup to a private location
docker compose --env-file ../.env --profile bundled exec -T postgres pg_dump -U chat -d chat > squorli-database.sql
# Attachments and link preview pictures out of the volume of the project squorli
docker run --rm -v squorli_appdata:/data:ro -v "$PWD":/backup alpine tar czf /backup/squorli-files.tar.gz -C /data .Pausiere für einen konsistenten Stand die Schreibzugriffe während der Sicherung. Der SQL-Dump enthält Serverdaten, aber weder Anhänge noch .env.
# Run from squorli/deploy after reviewing the update and backing up
docker compose --env-file ../.env --profile bundled pull
docker compose --env-file ../.env --profile bundled up -d --no-build
docker compose --env-file ../.env --profile bundled logs --tail=100 serverZurückspielen, im Ordner mit den beiden Sicherungsdateien:
# Run from deploy with your profile and overlays; replaces the database and all files
docker compose --env-file ../.env --profile bundled stop server
docker compose --env-file ../.env --profile bundled exec -T postgres psql -U chat -d postgres -c 'DROP DATABASE chat WITH (FORCE)' -c 'CREATE DATABASE chat OWNER chat'
docker compose --env-file ../.env --profile bundled exec -T postgres psql -q -v ON_ERROR_STOP=1 -U chat -d chat < squorli-database.sql
docker run --rm -i -v squorli_appdata:/data alpine sh -c 'find /data -mindepth 1 -delete && tar xzf - -C /data' < squorli-files.tar.gz
docker compose --env-file ../.env --profile bundled up -d --no-buildNotiere die Image-Version: latest ist veränderlich, und Migrationen laufen beim Start – ein Zurücksetzen des Images macht eine Datenbankänderung nicht rückgängig. Vermeide docker compose down -v auf dem Produktivserver: Der Befehl löscht die Volumes mit allen Daten.
Zuhause ausprobieren
Zum Kennenlernen braucht es weder Domain noch Zertifikat: Der Server läuft auf deinem eigenen Rechner, und du rufst ihn unter http://localhost:3000 auf. Weil Browser localhost als sicheren Kontext behandeln, funktionieren dort auch Mikrofon, Kamera und Bildschirmfreigabe.
Unter Windows geht es auch ohne Docker: Installiere das Paket für Windows und antworte auf die Frage nach der Domain mit localhost. Das Setup schlägt dann einen Reverse Proxy auf diesem Rechner vor und stellt LiveKit auf localhost ein; ein Proxy ist für den Test nicht nötig. Öffne danach die Adresse, die das Setup am Ende nennt – in der Regel http://localhost:3000 –, und lies unten beim Erstellen des Serverkontos weiter.
Mit Docker brauchst du unter Windows Docker Desktop, unter Linux Docker Engine mit dem Compose-Plugin. Dieses Heim-Setup wird von Hand eingerichtet, nicht mit dem Installationsskript.
Hole die Konfiguration – unter Linux mit dem Download-Befehl der Installation von Hand, unter Windows mit diesem Block in einer PowerShell:
mkdir squorli\deploy\caddy, squorli\deploy\livekit, squorli\deploy\proxies
cd squorli
$b = "https://raw.githubusercontent.com/danielklessa/squorli/main"
curl.exe -fL $b/.env.example -o .env
curl.exe -fL $b/deploy/compose.yml -o deploy\compose.yml
curl.exe -fL $b/deploy/caddy/Caddyfile -o deploy\caddy\Caddyfile
curl.exe -fL $b/deploy/livekit/livekit.yaml -o deploy\livekit\livekit.yaml
curl.exe -fL $b/deploy/proxies/nginx.ports.yml -o deploy\proxies\nginx.ports.ymlDanach füllst du .env so aus – der Inhalt ist auf beiden Systemen derselbe:
PUBLIC_DOMAIN=localhost
SERVER_NAME=Test
APP_IMAGE=ghcr.io/danielklessa/squorli-server:latest
PROXY_MODE=external
POSTGRES_PASSWORD=REPLACE_WITH_RANDOM_HEX
LIVEKIT_API_KEY=squorli
LIVEKIT_API_SECRET=REPLACE_WITH_ANOTHER_RANDOM_HEX
# Local test only: the browser reaches LiveKit directly, LiveKit offers itself as 127.0.0.1
LIVEKIT_PUBLIC_URL=ws://localhost:7880
LIVEKIT_NODE_IP=127.0.0.1
# A server on localhost cannot prove its host to the Directory: sign in with a server account (~name)
DIRECTORY_URL=Die Zufallswerte erzeugst du unter Linux mit openssl rand -hex 32, unter Windows mit der ersten Zeile des folgenden Blocks. notepad .env öffnet die Datei, die letzte Zeile prüft den laufenden Server:
# One random value per secret
-join (1..32 | ForEach-Object { '{0:x2}' -f (Get-Random -Maximum 256) })
notepad .env
# After the start: the server answers on localhost
curl.exe -fsS http://localhost:3000/api/healthGestartet wird auf beiden Systemen mit demselben Befehl. Das Overlay nginx.ports.yml veröffentlicht App und LiveKit nur auf 127.0.0.1, von außen bleibt alles zu:
cd deploy
docker compose --env-file ../.env -f compose.yml -f proxies/nginx.ports.yml --profile external pull
docker compose --env-file ../.env -f compose.yml -f proxies/nginx.ports.yml --profile external up -d --no-buildÖffne http://localhost:3000 und erstelle ein Serverkonto (~name und Passwort); die erste Anmeldung mit Konto wird Eigentümerin; ein zweites Browserfenster – am besten ein privates Fenster oder ein zweites Profil – ist dein zweites Mitglied. Damit es ohne Einladung hineinkommt, schaltest du in der Verwaltung unter Server den offenen Beitritt ein. Texte, Sprachkanäle, Kamera und Bildschirmfreigabe funktionieren zwischen diesen Fenstern vollständig.
Zwei Grenzen hat der lokale Test: Ein zweites Gerät im Heimnetz kann nicht mitmachen, weil es localhost nicht erreicht und Browser über eine reine HTTP-Adresse kein Mikrofon freigeben. Und ein Directory-Konto funktioniert hier nicht: Das Directory prüft die Kontrolle über die Domain, indem es /api/health abruft – bei localhost landet es bei sich selbst. Melde dich im Test also mit einem Serverkonto an. Zum Aufräumen mit Docker:
# From squorli/deploy: stops the test and deletes its database and files
docker compose --env-file ../.env -f compose.yml -f proxies/nginx.ports.yml --profile external down -vVom Test zum echten Heimserver: Sobald Freunde mitmachen sollen, brauchst du eine Domain – auch ein kostenloser DynDNS-Name genügt – und in deinem Router Weiterleitungen für 80/tcp, 443/tcp, 7881/tcp und 7882/udp auf den Rechner, der den Server trägt. Danach installierst du auf einem Linux-Rechner oder einem Windows-Rechner und wählst den mitgelieferten Caddy: Er holt das Zertifikat, und Squorli läuft genauso wie auf einem gemieteten Server. Steht dein Anschluss hinter einem Carrier-Grade-NAT (keine eigene öffentliche IPv4-Adresse), funktionieren Portweiterleitungen nicht – dann bleibt nur ein Server mit öffentlicher Adresse.
Erste Anmeldung
- Rufe
https://chat.example.orgin einem aktuellen Browser auf. - Melde dich mit deinem Squorli-Konto (
@name) an. Ohne Directory erstellst du unter „Konto erstellen“ ein Serverkonto (~nameund Passwort). - Die erste Anmeldung mit Konto wird Eigentümerin, oder – mit Einrichtungscode – wer beim Erstellen des Serverkontos den Code aus der Installation in das Feld „Einrichtungscode“ einträgt. Einen Zugang nur mit einem Browser-Schlüssel gibt es nicht mehr.
- Ab jetzt ist der Server geschlossen: weitere Mitglieder brauchen einen Einladungslink. Mit Directory entscheidest du in der Verwaltung unter Server, ob neben Squorli-Konten auch Serverkonten erlaubt sind.
Die erste Anmeldung absichern. Ohne Festlegung wird die erste Person, die sich mit einem Konto anmeldet, Eigentümerin des Servers; ohne Directory ist das, wer das erste Serverkonto erstellt. Festlegen kannst du es auf zwei Wegen: mit dem öffentlichen Schlüssel deines Squorli-Kontos (OWNER_PUBLIC_KEY, der Client zeigt ihn unter Einstellungen > Konto) oder mit einem Einrichtungscode (OWNER_SETUP_CODE): Wer beim Registrieren eines Serverkontos diesen Code eingibt, wird Eigentümerin – auch wenn Serverkonten sonst ausgeschaltet sind. Ohne beides meldest du dich direkt nach der Installation selbst als Erste an, bevor du die Adresse weitergibst. Eine spätere Änderung holt verlorene Eigentümerrechte nicht zurück.
Alles Weitere – Servername und Icon, Kategorien und Kanäle, Rollen, Einladungen, Moderation, Webradio und die Status-API – richtest du in der Verwaltung ein. Das erklärt die Anleitung für Administratoren mit Bildern der echten Oberfläche. Was deine Mitglieder danach im Alltag erwartet, steht in der Anleitung für Mitglieder.
Globales Konto: Squorli Directory
Mit DIRECTORY_URL=https://directory.squorli.com – der Vorschlag der Einrichtung – melden sich deine Mitglieder mit einem Konto an, das auf jedem verbundenen Server gilt. Sie bekommen ein Handle wie @name, ein passwortverschlüsseltes Backup ihres Schlüssels, Authenticator und Wiederherstellungscodes, ihr Profilbild, synchronisierte Einstellungen sowie Freunde und Direktnachrichten über Servergrenzen hinweg. Ohne Konto bleibt der Schlüssel in genau einem Browser: geht er verloren, ist der Zugang weg.
Der Server registriert sich selbst mit einem eigenen Schlüssel. Das Directory ruft dazu deinen öffentlichen Endpunkt /api/health ab und vergleicht den Serverschlüssel – so kann nur der Betreiber einer Domain sie beanspruchen. Der Hostname muss zu PUBLIC_DOMAIN passen; DIRECTORY_PROOF_URL brauchst du nur, wenn der Health-Endpunkt unter einer anderen Adresse erreichbar ist. Um das Directory später ein- oder auszuschalten, führst du das Installationsskript oder das Setup erneut aus und wählst „Einstellungen ändern“; bei einer Installation von Hand erstellst du den App-Container nach der Änderung mit demselben Compose-Befehl neu.
Die Registrierung veröffentlicht deinen Server nicht: öffentliche Auflistung, Beschreibung und offener Beitritt sind getrennte Schalter in der Verwaltung. Direktnachrichten zwischen Freunden sind Ende-zu-Ende-verschlüsselt; das ist keine Aussage über Kanalnachrichten, Anhänge, Voice oder Video. Fällt das Directory aus, laufen Gespräche auf deinem Server weiter; Directory-Funktionen und neue Schlüsselabrufe nicht.
Vorhandenen Reverse Proxy verwenden
Läuft auf dem Rechner schon ein Webserver oder Reverse Proxy (nginx, Apache, Plesk, IIS), wählst du in der Einrichtung „Ein Reverse Proxy auf diesem Rechner“: Der mitgelieferte Caddy bleibt aus, App und LiveKit lauschen nur auf 127.0.0.1. Steht der Proxy auf einem anderen Rechner, etwa ein Nginx Proxy Manager, wählst du die dritte Möglichkeit und gibst die LAN- oder VPN-Adresse dieses Servers und die IP des Proxys an.
Im Proxy leitest du dann /rtc* an Port 7880 und alle übrigen Anfragen an Port 3000 weiter; beide Routen brauchen WebSocket-Upgrades. Die Einrichtung nennt dir am Ende genau diese Ziele, auch wenn du andere Ports gewählt hast. Die Medienports 7881/tcp und 7882/udp führen weiterhin direkt zum Chat-Server. Bei einer Installation von Hand setzt du PROXY_MODE=external und startest mit dem Profil external und dem passenden Overlay:
# Run from the deploy directory
docker compose --env-file ../.env -f compose.yml -f proxies/nginx.ports.yml --profile external pull
docker compose --env-file ../.env -f compose.yml -f proxies/nginx.ports.yml --profile external up -d --no-buildDie Anleitung für vorhandene Reverse Proxys zeigt nginx, Nginx Proxy Manager, Plesk und Traefik samt vertrauenswürdigen Proxys, Firewall und Prüfschritten. Hosting unter einem Unterpfad wird nicht unterstützt.
Fehler beheben
Erste Anlaufstelle ist squorli doctor auf dem Server oder Verwaltung › Server › „Verbindung prüfen“ im Client: Beide benennen die wahrscheinliche Ursache.
| Problem | Prüfung |
|---|---|
Die Einrichtung meldet, dass https://… noch nicht antwortet | Der DNS-Eintrag der Domain muss auf den Server zeigen, und 80/tcp und 443/tcp müssen von außen erreichbar sein – auch in einer Firewall beim Hoster oder im Router. Caddy versucht es weiter; squorli logs caddy zeigt, woran es hängt. |
| Die Einrichtung meldet belegte Ports 80 oder 443 | Auf dem Rechner läuft schon ein Webserver. Wähle „Ein Reverse Proxy auf diesem Rechner“ (Vorhandenen Reverse Proxy verwenden); dein Webserver leitet dann an Squorli weiter. Andere belegte Ports ersetzt die Einrichtung selbst durch freie. |
| Anmeldung schlägt mit 401 fehl | PUBLIC_DOMAIN muss zum Hostnamen im Browser passen. Signaturen sind daran gebunden. |
| Voice verbindet sich, aber es kommt kein Ton an | Prüfe 7881/tcp und 7882/udp sowie die öffentliche IP des Hosts (LIVEKIT_NODE_IP), dazu Mikrofonrechte und Audiofreigabe im Browser. |
| Im Heim-Setup mit Docker kommt kein Ton an | Im lokalen Test müssen LIVEKIT_PUBLIC_URL=ws://localhost:7880 und LIVEKIT_NODE_IP=127.0.0.1 gesetzt sein, sonst nennt LiveKit eine Adresse aus dem Docker-Netz. |
| WebSocket-Verbindung schlägt fehl | Prüfe die Weiterleitung der Upgrades für /api/ws und /rtc. |
| Directory-Registrierung schlägt fehl | Der öffentliche Health-Endpunkt muss für das Directory über HTTPS erreichbar sein und den passenden Serverschlüssel und Hostnamen liefern. |
| Datenbankpasswort bleibt leer (Installation von Hand) | --env-file ../.env fehlt im Compose-Befehl. |
Windows findet den Befehl squorli nicht | Der Eintrag im PATH gilt erst in neu geöffneten Fenstern. Öffne ein neues Fenster als Administrator. |
| Unter Windows startet ein Dienst nicht | squorli status zeigt die Dienste, squorli logs server (oder postgres, livekit, caddy) die letzten Zeilen. Das Protokoll der Einrichtung liegt in C:\ProgramData\Squorli\logs. |
| Gast kann nicht schreiben oder Video teilen | Weise in der Verwaltung die Rolle Mitglied zu. Gastrechte sind bewusst eingeschränkt. |
| Beitritt aus einem restriktiven Netzwerk scheitert | TURN ist standardmäßig deaktiviert. Zum Aktivieren sind eigene Zertifikate, LiveKit-Konfiguration und 5349/tcp nötig. Die TURN-Abnahme steht noch aus. |
Entwicklungsstand: Video und Bildschirmfreigabe sind implementiert und mit echten Webcams und Bildschirmfreigaben getestet. Tests in restriktiven Netzwerken und mit TURN sind noch nicht abgeschlossen. Diese Anleitung ist keine Zuverlässigkeitsgarantie für den Produktivbetrieb.
Alternative: selbst aus dem Quellcode bauen
Nur wer eigene Änderungen kompilieren möchte oder einen ARM-Rechner verwendet, braucht Git und einen Quellcode-Checkout. Konfiguriere dessen .env vor dem Start, lass APP_IMAGE leer und verwende diesen Befehl. Für einen externen Proxy gelten wieder das passende Profil und deine Overlays.
# Optional source build in a separate checkout
git clone https://github.com/danielklessa/squorli.git squorli-source
cd squorli-source
cp .env.example .env
# Configure .env, set PROXY_MODE=bundled and leave APP_IMAGE unset
cd deploy
docker compose --env-file ../.env --profile bundled up -d --buildGrundlage ist die eingecheckte Serverkonfiguration vom 28. September 2026. Das Installationsskript für Linux wurde am 23. September 2026 in einer Testumgebung durchgespielt (Neuinstallation, Update, Wechsel der HTTPS-Variante), das Heim-Setup mit dem veröffentlichten Image geprüft; das Paket für Windows lief am 28. September 2026 auf Windows 11 von der Installation bis zum Entfernen. Maßgeblich sind das Server-README und die Umgebungsvorlage im Repository (Englisch).