// palaver · server installieren

Einen Palaver-Server installieren

Bestandteil Zweck Pfad unter chat.example.org
palaverd Konten, Kanäle, Text /api/
LiveKit Sprache, Bildschirmfreigabe /livekit/
Web-Client App im Browser /
nginx TLS (Let's Encrypt), Reverse-Proxy Ports 80, 443
PostgreSQL Daten –

Updates: Update-Anleitung

Platzhalter in den Befehlen:

Platzhalter Ersetzen durch
chat.example.org deinen Domainnamen
you@example.org E-Mail-Adresse für Let's Encrypt
0.3.0 Palaver-Version
https://<release host>/lasse-tech/palaver/releases/download Download-Adresse der Versionen; bis 1.0.0 nur im internen Forgejo des Projekts
<livekit-key>, <livekit-secret> Ausgabe aus Schritt 6, „Erzeuge … für die LiveKit-API“
<cert-name> nur vorhandenes Zertifikat: sein Name
vi Editor deiner Wahl

1. Voraussetzungen

  • System: Debian 13 oder ein Derivat auf Basis von Debian 13 oder Ubuntu 24.04+ (z. B. Ubuntu, Linux Mint 22)
  • Architektur: amd64 (x86_64)
  • öffentliche IPv4-Adresse
  • Domainname mit A-Eintrag auf die öffentliche IPv4-Adresse des Servers, z. B. chat.example.org
  • E-Mail-Adresse für Let's Encrypt
  • Shell-Zugang mit sudo
  • Grundkenntnisse in der Linux-Administration
Gruppe CPU RAM Platte
ein paar Freunde 1 Kern 2 GB 20 GB
20–30 Leute mit Bildschirmfreigabe 2 Kerne 4 GB 40 GB
  • Bandbreite: ~1 Mbit/s pro Person im Sprachkanal, +3–4 Mbit/s pro Zuschauer einer 1080p-Bildschirmfreigabe
  • Anhänge: je bis 25 MiB, in der Datenbank

Offene Ports zum Server:

Port Protokoll Wofür
80 TCP Let's Encrypt, Umleitung auf https
443 TCP App, Web-Client, Verbindungsaufbau für Sprache
7881 TCP Sprache, wenn UDP beim Nutzer gesperrt ist
3478 UDP STUN/TURN
30000–30100 UDP TURN-Relay
50000–60000 UDP Sprache und Bildschirmfreigabe

Prüfe das System.

. /etc/os-release; echo "$PRETTY_NAME | ${ID_LIKE:-$ID} | ${UBUNTU_CODENAME:-$VERSION_CODENAME} | $(uname -m)"

2. Pakete

Paket Anforderung
PostgreSQL 16 oder neuer, beliebige Quelle
nginx beliebige Quelle
certbot beliebige Quelle (apt, snap)
curl, ca-certificates, openssl beliebige Quelle

Fehlende installieren:

sudo apt-get update
sudo apt-get install postgresql nginx certbot curl ca-certificates openssl

3. Benutzer und Verzeichnisse

Lege den Systembenutzer palaver an.

sudo useradd --system --home-dir /opt/palaver --no-create-home --shell /usr/sbin/nologin palaver

Lege die Verzeichnisse an; etc nur für palaver lesbar.

sudo install -d -o root -g root -m 755 /opt/palaver /opt/palaver/bin /opt/palaver/web
sudo install -d -o palaver -g palaver -m 700 /opt/palaver/etc

4. PostgreSQL

Starte PostgreSQL.

sudo systemctl enable --now postgresql

Lege die Datenbankrolle und die Datenbank palaver an; Unix-Socket, Peer-Authentifizierung, kein Passwort.

sudo -u postgres createuser palaver
sudo -u postgres createdb -O palaver palaver

5. Palaver herunterladen

Lade Server, Web-Client und Prüfsummen herunter.

curl -fLO "https://<release host>/lasse-tech/palaver/releases/download/v0.3.0/palaverd-0.3.0-linux-amd64"
curl -fLO "https://<release host>/lasse-tech/palaver/releases/download/v0.3.0/palaver-web-0.3.0.tar.gz"
curl -fLO "https://<release host>/lasse-tech/palaver/releases/download/v0.3.0/SHA256SUMS"

Prüfe beide Dateien; jede Zeile muss auf OK enden.

sha256sum -c --ignore-missing SHA256SUMS

6. palaverd

Installiere das Programm.

sudo install -m 755 palaverd-0.3.0-linux-amd64 /opt/palaver/bin/palaverd

Erzeuge den Schlüssel für die LiveKit-API (<livekit-key>).

echo "API$(openssl rand -hex 8)"

Erzeuge das Geheimnis für die LiveKit-API (<livekit-secret>).

openssl rand -base64 36 | tr -d '/+='

Öffne /opt/palaver/etc/palaverd.env in einem Editor.

sudo vi /opt/palaver/etc/palaverd.env

Inhalt (Referenz):

PALAVER_DATABASE_URL=postgres:///palaver?host=/var/run/postgresql
PALAVER_LISTEN=127.0.0.1:8090
PALAVER_PUBLIC_URL=https://chat.example.org
PALAVER_LIVEKIT_URL=wss://chat.example.org/livekit
PALAVER_LIVEKIT_API_URL=http://127.0.0.1:7880
PALAVER_LIVEKIT_API_KEY=<livekit-key>
PALAVER_LIVEKIT_API_SECRET=<livekit-secret>
PALAVER_OPEN_REGISTRATION=false

Mache sie nur für palaver lesbar.

sudo chown palaver:palaver /opt/palaver/etc/palaverd.env
sudo chmod 600 /opt/palaver/etc/palaverd.env

Öffne /etc/systemd/system/palaverd.service in einem Editor.

sudo vi /etc/systemd/system/palaverd.service

Inhalt:

[Unit]
Description=Palaver app server
After=network-online.target postgresql.service
Wants=network-online.target

[Service]
User=palaver
Group=palaver
EnvironmentFile=/opt/palaver/etc/palaverd.env
ExecStart=/opt/palaver/bin/palaverd serve
Restart=on-failure
RestartSec=2
LogNamespace=palaver

NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
PrivateDevices=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
LockPersonality=yes
MemoryDenyWriteExecute=yes

[Install]
WantedBy=multi-user.target

7. LiveKit

Lade LiveKit 1.13.7 (getestet) von GitHub herunter und prüfe es; die Zeile muss auf OK enden.

curl -fLO https://github.com/livekit/livekit/releases/download/v1.13.7/livekit_1.13.7_linux_amd64.tar.gz
echo "6634aeeb2fb1366b6723708ae4320b9d5408106a4c63457c5e845ae3979c90e2  livekit_1.13.7_linux_amd64.tar.gz" | sha256sum -c

Entpacke und installiere das Programm.

tar -xzf livekit_1.13.7_linux_amd64.tar.gz livekit-server
sudo install -m 755 livekit-server /opt/palaver/bin/livekit-server

Öffne /opt/palaver/etc/livekit.yaml in einem Editor.

sudo vi /opt/palaver/etc/livekit.yaml

Inhalt; nur localhost, eingebautes TURN/STUN:

port: 7880
bind_addresses: ["127.0.0.1"]
rtc:
  tcp_port: 7881
  port_range_start: 50000
  port_range_end: 60000
  use_external_ip: false
  # node_ip: 203.0.113.10   # behind NAT only: the public IPv4
turn:
  enabled: true
  domain: chat.example.org
  udp_port: 3478
  relay_range_start: 30000
  relay_range_end: 30100
room:
  empty_timeout: 300
keys:
  <livekit-key>: <livekit-secret>
logging:
  level: info

Mache sie nur für palaver lesbar.

sudo chown palaver:palaver /opt/palaver/etc/livekit.yaml
sudo chmod 600 /opt/palaver/etc/livekit.yaml

Öffne /etc/systemd/system/livekit.service in einem Editor.

sudo vi /etc/systemd/system/livekit.service

Inhalt:

[Unit]
Description=LiveKit media server for Palaver
After=network-online.target
Wants=network-online.target

[Service]
User=palaver
Group=palaver
ExecStart=/opt/palaver/bin/livekit-server --config /opt/palaver/etc/livekit.yaml
Restart=on-failure
RestartSec=2
LogNamespace=palaver
LimitNOFILE=65536

NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
PrivateDevices=yes

[Install]
WantedBy=multi-user.target

8. Logs

Öffne /etc/systemd/journald@palaver.conf in einem Editor.

sudo vi /etc/systemd/journald@palaver.conf

Inhalt; bewahrt das Journal von palaverd und LiveKit (Namespace palaver) 14 Tage auf:

[Journal]
MaxRetentionSec=14day

Lege das Verzeichnis für die nginx-Logs der Site an.

sudo install -d -o www-data -g adm -m 750 /var/log/nginx/palaver

Öffne /etc/logrotate.d/palaver in einem Editor.

sudo vi /etc/logrotate.d/palaver

Inhalt; rotiert die Logs von nginx täglich, bewahrt 14 Tage auf:

/var/log/nginx/palaver/*.log {
	daily
	rotate 13
	missingok
	notifempty
	compress
	delaycompress
	create 0640 www-data adm
	sharedscripts
	postrotate
		invoke-rc.d nginx rotate >/dev/null 2>&1
	endscript
}

9. Web-Client

Entpacke den Web-Client.

sudo tar -xzf palaver-web-0.3.0.tar.gz --no-same-owner -C /opt/palaver/web
sudo chmod -R u=rwX,go=rX /opt/palaver/web

Öffne /etc/nginx/snippets/palaver-web.conf in einem Editor.

sudo vi /etc/nginx/snippets/palaver-web.conf

Inhalt:

root /opt/palaver/web;
index index.html;

location / {
    try_files $uri /index.html;
    add_header Cache-Control "no-cache" always;
    add_header Content-Security-Policy "default-src 'self'; script-src 'self'; worker-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; media-src 'self' blob: mediastream:; font-src 'self'; connect-src 'self' wss://chat.example.org; object-src 'none'; base-uri 'none'; form-action 'self'; frame-ancestors 'none'" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "no-referrer" always;
    add_header Permissions-Policy "camera=(), geolocation=(), payment=()" always;
    add_header Strict-Transport-Security "max-age=31536000" always;
}

location /assets/ {
    try_files $uri =404;
    add_header Cache-Control "public, max-age=31536000, immutable" always;
    add_header Content-Security-Policy "default-src 'self'; script-src 'self'; worker-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; media-src 'self' blob: mediastream:; font-src 'self'; connect-src 'self' wss://chat.example.org; object-src 'none'; base-uri 'none'; form-action 'self'; frame-ancestors 'none'" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Strict-Transport-Security "max-age=31536000" always;
}

10. nginx und Zertifikat

Starte nginx.

sudo systemctl enable --now nginx

Öffne /etc/nginx/sites-available/palaver in einem Editor.

sudo vi /etc/nginx/sites-available/palaver

Inhalt; vorläufige Port-80-Site für die Let's-Encrypt-Prüfung:

server {
    listen 80;
    listen [::]:80;
    server_name chat.example.org;
    location /.well-known/acme-challenge/ { root /var/www/html; }
    location / { return 404; }
}

Aktiviere die Site, prüfe und lade sie.

sudo ln -sf /etc/nginx/sites-available/palaver /etc/nginx/sites-enabled/palaver
sudo nginx -t && sudo systemctl reload nginx

Hole das Zertifikat; automatische Erneuerung, lädt nginx neu.

sudo certbot certonly --webroot -w /var/www/html -d chat.example.org -m you@example.org \
    --agree-tos --no-eff-email --non-interactive \
    --deploy-hook "systemctl reload nginx"

Öffne /etc/nginx/sites-available/palaver in einem Editor.

sudo vi /etc/nginx/sites-available/palaver

Inhalt; vollständige Site:

server {
    listen 80;
    listen [::]:80;
    server_name chat.example.org;

    access_log /var/log/nginx/palaver/access.log;
    error_log /var/log/nginx/palaver/error.log;

    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }
    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name chat.example.org;

    ssl_certificate /etc/letsencrypt/live/chat.example.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/chat.example.org/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

    access_log /var/log/nginx/palaver/access.log;
    error_log /var/log/nginx/palaver/error.log;

    client_max_body_size 64k;

    # server push, one WebSocket per client
    location = /api/events {
        proxy_pass http://127.0.0.1:8090;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 1h;
        proxy_send_timeout 1h;
    }

    # profile pictures, server icon: 5 MiB
    location ~ ^/api/(me/avatar|server/icon)$ {
        client_max_body_size 5m;
        proxy_pass http://127.0.0.1:8090;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # attachments: 25 MiB
    location ~ ^/api/channels/[0-9]+/attachments$ {
        client_max_body_size 25m;
        proxy_pass http://127.0.0.1:8090;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /api/ {
        proxy_pass http://127.0.0.1:8090;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # LiveKit signalling; the trailing slash strips /livekit
    location /livekit/ {
        proxy_pass http://127.0.0.1:7880/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_read_timeout 1h;
        proxy_send_timeout 1h;
    }

    include snippets/palaver-web.conf;
}

Prüfe und lade sie.

sudo nginx -t && sudo systemctl reload nginx

11. Starten

Lade die Units, starte LiveKit und palaverd; der erste Start legt die Datenbanktabellen an.

sudo systemctl daemon-reload
sudo systemctl enable --now livekit palaverd

Prüfe, ob palaverd antwortet; erwartet: JSON.

curl -fsS http://127.0.0.1:8090/api/registration

12. Erster Admin

Erzeuge einen Einladungscode für den ersten Admin; einmal nutzbar, 7 Tage gültig.

sudo -u palaver /opt/palaver/bin/palaverd -env /opt/palaver/etc/palaverd.env invite -role Admin -valid 168h
  • Registrieren: Palaver-App oder https://chat.example.org im Browser → Server https://chat.example.org → Registrieren → Code
  • erster Admin = Eigentümer des Servers
  • nach der ersten Anmeldung: Zustimmungsfrage für anonyme Zahlen an Dogan (Überwachung von Palaver-Servern); später unter Einstellungen › Server › Mitwirken
  • andere einladen: Verwaltungsmodus an (Einstellungen › Allgemein › Verwaltung, pro Gerät) → Leute einladen in der Kanalliste

13. Prüfen

Führe doctor aus (Konfiguration, Datenbank, palaverd, LiveKit, öffentliche Adresse, Zertifikat); erwartet: ok in jeder Zeile.

sudo -u palaver /opt/palaver/bin/palaverd -env /opt/palaver/etc/palaverd.env doctor
  • nicht geprüft: UDP-Ports; Sprache verbindet sich, bleibt aber stumm: Ports

Sicherung

  • Datenbank: alle Daten; Nachrichten Ende-zu-Ende-verschlüsselt
  • /opt/palaver/etc: Konfiguration, LiveKit-Schlüssel

Sichere die Datenbank.

sudo -u palaver pg_dump -Fc palaver > "palaver-$(date +%F).dump"

Sichere die Konfiguration.

sudo tar -czf "palaver-etc-$(date +%F).tar.gz" -C /opt/palaver etc

Wiederherstellen

Voraussetzung: neuer Server, dieselbe Domain, Schritte 1–11.

Stelle die Konfiguration wieder her.

sudo tar -xzf palaver-etc-<date>.tar.gz -C /opt/palaver
sudo chown -R palaver:palaver /opt/palaver/etc

Halte palaverd an.

sudo systemctl stop palaverd

Destruktiv: Lösche die Datenbank des neuen Servers (alle seine Konten und Nachrichten).

sudo -u postgres dropdb palaver

Lege sie neu an und spiele die Sicherung ein.

sudo -u postgres createdb -O palaver palaver
sudo -u palaver pg_restore -d palaver palaver-<date>.dump

Starte alles.

sudo systemctl restart livekit palaverd

Deinstallieren

Halte die Dienste an und deaktiviere sie.

sudo systemctl disable --now palaverd livekit

Entferne die Units.

sudo rm /etc/systemd/system/palaverd.service /etc/systemd/system/livekit.service
sudo systemctl daemon-reload

Entferne die nginx-Site und lade nginx neu.

sudo rm /etc/nginx/sites-enabled/palaver /etc/nginx/sites-available/palaver /etc/nginx/snippets/palaver-web.conf
sudo nginx -t && sudo systemctl reload nginx

Entferne die Einstellungen für Journal und Logrotation.

sudo rm /etc/systemd/journald@palaver.conf /etc/logrotate.d/palaver

Entferne Programme und Web-Client.

sudo rm -r /opt/palaver/bin /opt/palaver/web

Destruktiv: Lösche die Datenbank und ihre Rolle (alle Konten, Nachrichten, Anhänge); nicht rückgängig zu machen.

sudo -u postgres dropdb palaver
sudo -u postgres dropuser palaver

Destruktiv: Lösche die Konfiguration (LiveKit-Schlüssel und -Geheimnis) und den Benutzer palaver.

sudo rm -r /opt/palaver/etc
sudo rmdir /opt/palaver
sudo userdel palaver

Destruktiv: Lösche das Zertifikat.

sudo certbot delete --cert-name chat.example.org

Destruktiv: Lösche die nginx-Logs der Site (/var/log/nginx/palaver); Journal-Namespace palaver läuft nach 14 Tagen aus.

sudo rm -r /var/log/nginx/palaver

Schließe die Ports in ufw; behalte 80 und 443, wenn andere Sites sie nutzen.

sudo ufw delete allow 80,443,7881/tcp
sudo ufw delete allow 3478,30000:30100,50000:60000/udp

Bleiben: Pakete postgresql, nginx, certbot.

Optional: vorhandenes Zertifikat

Für: Zertifikat, das schon in /etc/letsencrypt/live/<name>/ liegt (z. B. Wildcard über DNS-Prüfung), statt dem aus Schritt 10.

Zeige die Namen der Zertifikate an.

sudo certbot certificates

Schritt 10: Port-80-Site und certbot certonly überspringen.

Nach der vollständigen Site aus Schritt 10: öffne /etc/nginx/sites-available/palaver in einem Editor.

sudo vi /etc/nginx/sites-available/palaver

Ändere:

  • ssl_certificate, ssl_certificate_key: /etc/letsencrypt/live/chat.example.org/ → /etc/letsencrypt/live/<cert-name>/

Hinter einem Heimrouter

  • Router: öffentliche IPv4-Adresse, fest oder über dynamisches DNS; kein DS-Lite oder anderes Carrier-Grade-NAT
  • alle Ports an den Server weiterleiten
  • /opt/palaver/etc/livekit.yaml: Zeile # node_ip: durch node_ip: <public IPv4> ersetzen; bei jeder Adressänderung erneut

Starte LiveKit neu.

sudo systemctl restart livekit
  • Prüfungen der öffentlichen Adresse in doctor schlagen ohne NAT-Loopback womöglich fehl; von einem anderen Gerät testen

Konfigurationsreferenz

  • Datei: /opt/palaver/etc/palaverd.env (KEY=VALUE, systemd-EnvironmentFile)
  • nach einer Änderung: sudo systemctl restart palaverd
Variable Standard Bedeutung
PALAVER_DATABASE_URL – (Pflicht) Verbindungszeichenfolge für PostgreSQL
PALAVER_LISTEN 127.0.0.1:8080 Adresse, auf der palaverd lauscht; diese Anleitung verwendet 127.0.0.1:8090
PALAVER_PUBLIC_URL Adresse, die der Client des Eigentümers verwendet hat öffentliche Adresse (https://chat.example.org); doctor prüft sie
PALAVER_LIVEKIT_URL – LiveKit-Adresse für Clients (wss://chat.example.org/livekit)
PALAVER_LIVEKIT_API_URL PALAVER_LIVEKIT_URL als http(s) LiveKit-API für palaverd
PALAVER_LIVEKIT_API_KEY – Schlüssel aus livekit.yaml
PALAVER_LIVEKIT_API_SECRET – Geheimnis aus livekit.yaml
PALAVER_LIVEKIT_ROOM_PREFIX leer Präfix der Raumnamen (a-z, 0-9, -)
PALAVER_OPEN_REGISTRATION false true: Registrierung ohne Einladung; ein Admin lässt jedes Konto herein, bis dahin sieht es nur den Landekanal
PALAVER_TRUSTED_PROXIES localhost Adressen oder CIDR-Präfixe von Reverse-Proxys für X-Forwarded-For, durch Kommas getrennt
PALAVER_AUDIT_DAYS 14 Aufbewahrung des Audit-Logs (mit IP-Adressen) in Tagen
PALAVER_WEB_URL – Adresse des Web-Clients, wenn nicht / (derselbe Host wie PALAVER_PUBLIC_URL)
PALAVER_DOGAN_URL https://www.lasse-tech.de/dogan Meldungen an Dogan; off: nie melden, der Eigentümer wird nicht gefragt
PALAVER_DOGAN_ENROLL – einmaliger Anmeldecode für Dogan; gilt als Zustimmung des Eigentümers
PALAVER_CTL, PALAVER_UNIT, PALAVER_ENV_FILE der Befehl dieser Anleitung, palaverd, /opt/palaver/etc/palaverd.env was doctor in seinen Hinweisen nennt
  • palaverd -env FILE <command>: lädt die Datei; schon in der Umgebung gesetzte Variablen haben Vorrang
  • /opt/palaver/etc/livekit.yaml: Einstellungen von LiveKit (Dokumentation von LiveKit, config-sample.yaml in dessen Repository); nach einer Änderung: sudo systemctl restart livekit

Dateien

Pfad Inhalt
/opt/palaver/bin/ palaverd, livekit-server
/opt/palaver/web/ Web-Client
/opt/palaver/etc/ palaverd.env, livekit.yaml (nur Benutzer palaver)
/etc/systemd/system/palaverd.service, livekit.service Dienste
/etc/systemd/journald@palaver.conf Aufbewahrung des Journals
/etc/nginx/sites-available/palaver, /etc/nginx/snippets/palaver-web.conf nginx-Site
/etc/logrotate.d/palaver, /var/log/nginx/palaver/ nginx-Logs

Fehlersuche

doctor: welcher Teil fehlschlägt.

sudo -u palaver /opt/palaver/bin/palaverd -env /opt/palaver/etc/palaverd.env doctor

Was palaverd und LiveKit melden.

sudo journalctl --namespace=palaver -u palaverd -u livekit -n 100

Was nginx meldet.

sudo tail -n 50 /var/log/nginx/palaver/error.log
Symptom Ursache
certbot schlägt fehl Port 80/TCP nicht erreichbar (Firewall des Hosters, Router) oder ein AAAA-Record, der woanders hinzeigt
Sprache verbindet sich, kein Ton UDP-Ports (Voraussetzungen)
could not change directory to "/home/…" von sudo -u postgres/sudo -u palaver harmlos (kein Zugriff auf dein Home-Verzeichnis)
palaverd failed err="… PALAVER_DATABASE_URL is not set" -env /opt/palaver/etc/palaverd.env fehlt
Web-Client im Browser ohne Sprache CSP: wss://chat.example.org fehlt im Snippet (doctor meldet es)

Anfragen um Hilfe: Ausgabe aller drei anhängen.