// palaver · doku · mehrere server aktualisieren

Einen Host mit mehreren Palaver-Servern aktualisieren

Platzhalter in den Befehlen:

Platzhalter Ersetzen durch
0.3.1 neue Palaver-Version
https://git.internal.incudex.de/lasse-tech/palaver/releases/download Download-Adresse der Versionen; Palavers internes Forgejo, nur vom eigenen Rechner aus erreichbar
palaver.social die Domain des Hauptservers; als palaver.social: der Host für scp; in /etc/letsencrypt/live/palaver.social/: den Namen des Zertifikats
guild den Namen eines weiteren Servers; ein - im Namen wird im Datenbanknamen zu _ (z. B. palaver_my_guild); Befehle mit „für jeden weiteren Server“: einmal für jeden
guild.palaver.social die Domain dieses weiteren Servers
8091 den Port dieses weiteren Servers
2026-10-10 das heutige Datum (Namen der Sicherungsdateien)
1.13.7 LiveKit-Version aus den Versionshinweisen
vi Editor deiner Wahl

1. Versionshinweise

  • lesen: Versionshinweise jeder Version nach der installierten
  • umsetzen: die dort genannten Änderungen (Konfigurationsdateien, Units, nginx, LiveKit-Version)

Zeige die installierte Version an.

/opt/palaver/bin/palaverd version

2. Palaver herunterladen

Auf deinem eigenen Rechner: Lade den Server und den Web-Client herunter.

curl -fLO -H "Authorization: token $FORGEJO_TOKEN" https://git.internal.incudex.de/lasse-tech/palaver/releases/download/v0.3.1/palaverd-0.3.1-linux-amd64
curl -fLO -H "Authorization: token $FORGEJO_TOKEN" https://git.internal.incudex.de/lasse-tech/palaver/releases/download/v0.3.1/palaver-web-0.3.1.tar.gz

Kopiere beide in dein Home-Verzeichnis auf dem Host.

scp palaverd-0.3.1-linux-amd64 palaver-web-0.3.1.tar.gz palaver.social:
  • ab hier: auf dem Host, in deinem Home-Verzeichnis

3. Hauptserver sichern

Sichere die Datenbank.

sudo -u palaver pg_dump -Fc palaver > palaver-2026-10-10.dump

Sichere die Konfiguration.

sudo tar -czf palaver-etc-2026-10-10.tar.gz -C /opt/palaver etc

Behalte das bisherige palaverd für den Rückweg.

sudo cp /opt/palaver/bin/palaverd /opt/palaver/bin/palaverd.old

4. Weitere Server sichern

Zeige die weiteren Server an.

ls /opt/palaver/instances/

Für jeden weiteren Server: Sichere seine Datenbank.

sudo -u palaver-guild pg_dump -Fc palaver_guild > palaver-guild-2026-10-10.dump

Sichere ihre Konfiguration.

sudo tar -czf palaver-instances-2026-10-10.tar.gz -C /opt/palaver instances

Prüfe die Sicherungen; erwartet: eine je Server, keine leer.

ls -l palaver-*.dump

5. palaverd

Installiere das neue palaverd.

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

6. Web-Client

Entpacke den neuen Web-Client neben den alten.

sudo install -d -m 755 /opt/palaver/web.new
sudo tar -xzf palaver-web-0.3.1.tar.gz --no-same-owner -C /opt/palaver/web.new
sudo chmod -R u=rwX,go=rX /opt/palaver/web.new

Tausche sie.

sudo mv /opt/palaver/web /opt/palaver/web.old
sudo mv /opt/palaver/web.new /opt/palaver/web

7. nginx

Nur, wenn die Versionshinweise das Web-Snippet oder die Site ändern. Öffne das Snippet des Hauptservers in einem Editor.

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

Öffne die Site des Hauptservers in einem Editor.

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

Für jeden weiteren Server: Öffne sein Snippet in einem Editor; wss://guild.palaver.social bleibt.

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

Für jeden weiteren Server: Öffne seine Site in einem Editor; Port, Logs und Snippet bleiben.

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

Ändere:

  • was die Versionshinweise sagen, in jeder Datei oben

Prüfe und lade sie.

sudo nginx -t && sudo systemctl reload nginx

8. Neu starten

Starte den Hauptserver neu.

sudo systemctl restart palaverd

Starte gleich danach jeden weiteren Server neu.

sudo systemctl restart 'palaverd@*'

Zeige ihren Zustand an; erwartet: jeweils active.

systemctl list-units --all 'palaverd*'

9. LiveKit

Nur bei einer neueren LiveKit-Version in den Versionshinweisen. Zeige die installierte Version an.

/opt/palaver/bin/livekit-server --version

Lade sie von GitHub herunter.

curl -fLO https://github.com/livekit/livekit/releases/download/v1.13.7/livekit_1.13.7_linux_amd64.tar.gz

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

Starte LiveKit neu; Gespräche auf allen Servern brechen ab.

sudo systemctl restart livekit

10. Prüfen

Führe doctor für den Hauptserver aus; erwartet: keine Befunde.

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

Für jeden weiteren Server: Führe doctor aus; erwartet: keine Befunde.

sudo -u palaver-guild /opt/palaver/bin/palaverd -env /opt/palaver/instances/guild/palaverd.env doctor

Zeige die Version an, die alle Server ausführen.

/opt/palaver/bin/palaverd version

Öffne den Web-Client des Hauptservers und eines weiteren Servers und melde dich an.

Destruktiv: Entferne den vorigen Web-Client (/opt/palaver/web.old, nur Dateien der Version).

sudo rm -r /opt/palaver/web.old

Destruktiv: Entferne das vorige palaverd (/opt/palaver/bin/palaverd.old).

sudo rm /opt/palaver/bin/palaverd.old

Entferne die heruntergeladenen Dateien.

rm palaverd-0.3.1-linux-amd64 palaver-web-0.3.1.tar.gz

Zurück zur vorigen Version

  • für: neue Version funktioniert nicht
  • Datenbankänderungen werden nicht zurückgenommen; falls nötig: Sicherung zurückspielen

Setze das vorige palaverd wieder ein.

sudo cp /opt/palaver/bin/palaverd.old /opt/palaver/bin/palaverd

Setze den vorigen Web-Client wieder ein.

sudo mv /opt/palaver/web /opt/palaver/web.failed
sudo mv /opt/palaver/web.old /opt/palaver/web

Starte den Hauptserver neu.

sudo systemctl restart palaverd

Starte jeden weiteren Server mit dem vorigen palaverd neu.

sudo systemctl restart 'palaverd@*'

Sicherung zurückspielen

Hauptserver: Halte ihn an.

sudo systemctl stop palaverd

Destruktiv: Lösche die Datenbank des Hauptservers (palaver, alle Konten und Nachrichten seit der Sicherung).

sudo -u postgres dropdb palaver

Lege sie neu an, lade die Sicherung aus Schritt 3 und starte ihn.

sudo -u postgres createdb -O palaver palaver
sudo -u palaver pg_restore -d palaver palaver-2026-10-10.dump
sudo systemctl start palaverd

Für jeden weiteren Server: Halte ihn an.

sudo systemctl stop palaverd@guild

Destruktiv: Lösche seine Datenbank (palaver_guild, alle Konten und Nachrichten seit der Sicherung).

sudo -u postgres dropdb palaver_guild

Lege sie neu an, lade die Sicherung aus Schritt 4 und starte ihn.

sudo -u postgres createdb -O palaver-guild palaver_guild
sudo -u palaver-guild pg_restore -d palaver_guild palaver-guild-2026-10-10.dump
sudo systemctl start palaverd@guild

Einmalig: mit palaver-host eingerichtete Hosts

  • für: Hosts, die mit palaver-host und dem install.sh des offenen Bundles eingerichtet wurden
  • einmalig, nach Schritt 10
  • Reste: Werkzeuge, gespeicherte Vorlagen, Logs, nginx-Sites mit eingebettetem Web-Client

Hauptserver

  • palaver.social: Landingpage unter /, Snippet und Site wie in docs/server.md von palaver-social
  • Ubuntu 26.04: sudo-rs ohne sudoedit, als root bearbeiten

Zeige die Zertifikatsnamen an.

sudo ls /etc/letsencrypt/live/

Bewahre die alte nginx-Site außerhalb der Verzeichnisse von nginx auf.

sudo cp /etc/nginx/sites-available/palaver /root/nginx-palaver-2026-10-10.conf

Ö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://palaver.social; 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://palaver.social; 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;
}

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

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

Inhalt; Zertifikatsname von oben in beiden ssl_certificate-Zeilen:

server {
    listen 80;
    listen [::]:80;
    server_name palaver.social;

    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 palaver.social;

    ssl_certificate /etc/letsencrypt/live/palaver.social/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/palaver.social/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

Destruktiv: Entferne das Hilfsskript (/usr/local/sbin/palaverctl).

sudo rm /usr/local/sbin/palaverctl

Destruktiv: Entferne das Installationslog (/var/log/palaver-install.log).

sudo rm /var/log/palaver-install.log

Destruktiv: Entferne den Zertifikatsvermerk von install.sh (/opt/palaver/etc/cert, eine Zeile).

sudo cat /opt/palaver/etc/cert
sudo rm /opt/palaver/etc/cert

Jeder weitere Server

Für jeden weiteren Server: Zeige Domain, Port und Zertifikatsnamen an.

sudo grep -E '^PALAVER_(PUBLIC_URL|LISTEN)=' /opt/palaver/instances/guild/palaverd.env
sudo cat /opt/palaver/instances/guild/cert

Bewahre die alte nginx-Site außerhalb der Verzeichnisse von nginx auf.

sudo cp /etc/nginx/sites-available/palaver-guild /root/nginx-palaver-guild-2026-10-10.conf

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

sudo vi /etc/nginx/snippets/palaver-web-guild.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://guild.palaver.social; 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://guild.palaver.social; 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;
}

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

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

Inhalt; sein Port in jedem proxy_pass zu palaverd, sein Zertifikatsname in beiden ssl_certificate-Zeilen:

server {
    listen 80;
    listen [::]:80;
    server_name guild.palaver.social;

    access_log /var/log/nginx/palaver/guild.access.log;
    error_log /var/log/nginx/palaver/guild.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 guild.palaver.social;

    ssl_certificate /etc/letsencrypt/live/palaver.social/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/palaver.social/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

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

    client_max_body_size 64k;

    # server push, one WebSocket per client
    location = /api/events {
        proxy_pass http://127.0.0.1:8091;
        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:8091;
        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:8091;
        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:8091;
        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, shared; 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-guild.conf;
}

Prüfe und lade sie.

sudo nginx -t && sudo systemctl reload nginx

Öffne /opt/palaver/instances/guild/palaverd.env in einem Editor.

sudo vi /opt/palaver/instances/guild/palaverd.env

Ändere:

  • die Kommentarzeilen von palaver-host (#) entfernen
  • am Ende hinzufügen, für die Hinweise von doctor:
PALAVER_CTL="sudo -u palaver-guild /opt/palaver/bin/palaverd -env /opt/palaver/instances/guild/palaverd.env"
PALAVER_UNIT=palaverd@guild
PALAVER_ENV_FILE=/opt/palaver/instances/guild/palaverd.env

Prüfe sie.

sudo -u palaver-guild /opt/palaver/bin/palaverd -env /opt/palaver/instances/guild/palaverd.env doctor

Destruktiv: Entferne den Zertifikatsvermerk von palaver-host (/opt/palaver/instances/guild/cert, eine Zeile).

sudo rm /opt/palaver/instances/guild/cert

Der Host

Die Unit-Vorlage bleibt. Zeige sie an; erwartet: User=palaver-%i, EnvironmentFile=/opt/palaver/instances/%i/palaverd.env, ExecStart=/opt/palaver/bin/palaverd serve, LogNamespace=palaver.

grep -v '^#' /etc/systemd/system/palaverd@.service

Zeige die aktivierten Sites an.

ls /etc/nginx/sites-enabled/

Mit palaver-catch-all: Öffne sie in einem Editor.

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

Inhalt:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    location /.well-known/acme-challenge/ { root /var/www/html; }
    location / { return 301 https://palaver.social/; }
}

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    server_name _;
    ssl_certificate /etc/letsencrypt/live/palaver.social/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/palaver.social/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    return 301 https://palaver.social/;
}

Prüfe und lade sie.

sudo nginx -t && sudo systemctl reload nginx

Destruktiv: Entferne das Werkzeug (/usr/local/sbin/palaver-host).

sudo rm /usr/local/sbin/palaver-host

Destruktiv: Entferne die gespeicherten nginx-Vorlagen (/opt/palaver/hosting/templates/, zwei Dateien).

sudo rm -r /opt/palaver/hosting

Destruktiv: Entferne das Log von palaver-host (/var/log/palaver-hosting.log).

sudo rm /var/log/palaver-hosting.log

Destruktiv: Entferne entpackte Bundles und Tarballs in deinem Home-Verzeichnis (palaver-server-*, palaver-hosting-*); erst auflisten, dann mit Rückfrage entfernen.

ls -d ~/palaver-server-* ~/palaver-hosting-*
rm -ri ~/palaver-server-* ~/palaver-hosting-*

Einmalig: der Rechner, auf dem palaver-ops lief

Destruktiv: Entferne palaver-ops (~/.local/bin/palaver-ops).

rm ~/.local/bin/palaver-ops

Destruktiv: Entferne seine Serverliste (~/.config/palaver-ops/servers.json).

cat ~/.config/palaver-ops/servers.json
rm -r ~/.config/palaver-ops