# 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](UPDATE.md)

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 |

## Inhalt

1. [Voraussetzungen](#1-requirements)
2. [Pakete](#2-packages)
3. [Benutzer und Verzeichnisse](#3-user-and-directories)
4. [PostgreSQL](#4-postgresql)
5. [Palaver herunterladen](#5-download-palaver)
6. [palaverd](#6-palaverd)
7. [LiveKit](#7-livekit)
8. [Logs](#8-logs)
9. [Web-Client](#9-web-client)
10. [nginx und Zertifikat](#10-nginx-and-certificate)
11. [Starten](#11-start)
12. [Erster Admin](#12-first-admin)
13. [Prüfen](#13-check)
- [Sicherung](#backup)
- [Deinstallieren](#uninstall)
- [Optional: vorhandenes Zertifikat](#optional-existing-certificate)
- [Hinter einem Heimrouter](#behind-a-home-router)
- [Konfigurationsreferenz](#configuration-reference)
- [Dateien](#files)
- [Fehlersuche](#troubleshooting)

## 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.

```sh
. /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:

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

## 3. Benutzer und Verzeichnisse

Lege den Systembenutzer `palaver` an.

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

Lege die Verzeichnisse an.

```sh
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.

```sh
sudo systemctl enable --now postgresql
```

Lege die Datenbankrolle und die Datenbank `palaver` an.

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

## 5. Palaver herunterladen

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

```sh
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.

```sh
sha256sum -c --ignore-missing SHA256SUMS
```

## 6. palaverd

Installiere das Programm.

```sh
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>`).

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

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

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

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

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

Inhalt ([Referenz](#configuration-reference)):

```ini
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.

```sh
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.

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

Inhalt:

```ini
[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 von GitHub herunter und prüfe es; die Zeile muss auf `OK` enden.

```sh
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.

```sh
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.

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

Inhalt:

```yaml
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.

```sh
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.

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

Inhalt:

```ini
[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.

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

Inhalt:

```ini
[Journal]
MaxRetentionSec=14day
```

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

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

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

```sh
sudo vi /etc/logrotate.d/palaver
```

Inhalt:

```text
/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.

```sh
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.

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

Inhalt:

```nginx
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.

```sh
sudo systemctl enable --now nginx
```

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

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

Inhalt:

```nginx
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.

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

Hole das Zertifikat.

```sh
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.

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

Inhalt:

```nginx
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.

```sh
sudo nginx -t && sudo systemctl reload nginx
```

## 11. Starten

Lade die Units, starte LiveKit und palaverd.

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

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

```sh
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.

```sh
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
- Konto ohne Admin registriert (Code ohne `-role Admin`): Rolle nachträglich vergeben

```sh
sudo -u palaver /opt/palaver/bin/palaverd -env /opt/palaver/etc/palaverd.env grant <username> Admin
```

- 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; erwartet: `ok` in jeder Zeile.

```sh
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](#1-requirements)

## Sicherung

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

Sichere die Datenbank.

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

Sichere die Konfiguration.

```sh
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.

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

Halte palaverd an.

```sh
sudo systemctl stop palaverd
```

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

```sh
sudo -u postgres dropdb palaver
```

Lege sie neu an und spiele die Sicherung ein.

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

Starte alles.

```sh
sudo systemctl restart livekit palaverd
```

## Deinstallieren

Halte die Dienste an und deaktiviere sie.

```sh
sudo systemctl disable --now palaverd livekit
```

Entferne die Units.

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

Entferne die nginx-Site und lade nginx neu.

```sh
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.

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

Entferne Programme und Web-Client.

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

**Destruktiv:** Lösche die Datenbank und ihre Rolle (alle Konten, Nachrichten, Anhänge).

```sh
sudo -u postgres dropdb palaver
sudo -u postgres dropuser palaver
```

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

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

**Destruktiv:** Lösche das Zertifikat.

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

**Destruktiv:** Lösche die nginx-Logs der Site (`/var/log/nginx/palaver`).

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

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

```sh
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.

```sh
sudo certbot certificates
```

[Schritt 10](#10-nginx-and-certificate): Port-80-Site und `certbot certonly` überspringen.

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

```sh
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](#1-requirements) 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.

```sh
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.

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

Was palaverd und LiveKit melden.

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

Was nginx meldet.

```sh
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](#1-requirements)) |
| `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.
