Einen Host mit mehreren Palaver-Servern aktualisieren
- Voraussetzung: Host nach der Anleitung für mehrere Server eingerichtet
- ein
/opt/palaver/bin/palaverdfür alle Server; weitere Server: alte Version bis zum Neustart, gleich nach dem Hauptserver neu starten
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-hostund deminstall.shdes 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 indocs/server.mdvon 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
Updating a host with several Palaver servers
- prerequisite: host set up per the guide for several servers
- one
/opt/palaver/bin/palaverdfor all servers; further servers: old version until restarted, restart right after the main server
Placeholders in the commands:
| Placeholder | Replace with |
|---|---|
0.3.1 |
new Palaver release |
https://git.internal.incudex.de/lasse-tech/palaver/releases/download |
release download location; Palaver's internal Forgejo, reachable from your own machine only |
palaver.social |
the main server's domain; as palaver.social: the host for scp; in /etc/letsencrypt/live/palaver.social/: the certificate's name |
guild |
a further server's name; a - in the name becomes _ in the database name (e.g. palaver_my_guild); commands marked "for each further server": once for each |
guild.palaver.social |
that further server's domain |
8091 |
that further server's port |
2026-10-10 |
today's date (backup file names) |
1.13.7 |
LiveKit version from the release notes |
vi |
editor of your choice |
1. Release notes
- read: release notes of every version after the installed one
- apply: changes listed there (configuration files, units, nginx, LiveKit version)
Show the installed version.
/opt/palaver/bin/palaverd version
2. Download Palaver
On your own machine: download the server and the web client.
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
Copy both into your home directory on the host.
scp palaverd-0.3.1-linux-amd64 palaver-web-0.3.1.tar.gz palaver.social:
- from here on: on the host, in your home directory
3. Back up the main server
Dump the database.
sudo -u palaver pg_dump -Fc palaver > palaver-2026-10-10.dump
Save the configuration.
sudo tar -czf palaver-etc-2026-10-10.tar.gz -C /opt/palaver etc
Keep the current palaverd for the way back.
sudo cp /opt/palaver/bin/palaverd /opt/palaver/bin/palaverd.old
4. Back up the further servers
Show the further servers.
ls /opt/palaver/instances/
For each further server: dump its database.
sudo -u palaver-guild pg_dump -Fc palaver_guild > palaver-guild-2026-10-10.dump
Save their configuration.
sudo tar -czf palaver-instances-2026-10-10.tar.gz -C /opt/palaver instances
Check the dumps; expected: one per server, none empty.
ls -l palaver-*.dump
5. palaverd
Install the new palaverd.
sudo install -m 755 palaverd-0.3.1-linux-amd64 /opt/palaver/bin/palaverd
6. Web client
Unpack the new web client next to the old one.
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
Swap them.
sudo mv /opt/palaver/web /opt/palaver/web.old
sudo mv /opt/palaver/web.new /opt/palaver/web
7. nginx
Only if the release notes change the web snippet or the site. Open the main server's snippet in an editor.
sudo vi /etc/nginx/snippets/palaver-web.conf
Open the main server's site in an editor.
sudo vi /etc/nginx/sites-available/palaver
For each further server: open its snippet in an editor; keep wss://guild.palaver.social.
sudo vi /etc/nginx/snippets/palaver-web-guild.conf
For each further server: open its site in an editor; keep its port, logs and snippet.
sudo vi /etc/nginx/sites-available/palaver-guild
Change:
- what the release notes say, in every file above
Check and load them.
sudo nginx -t && sudo systemctl reload nginx
8. Restart
Restart the main server.
sudo systemctl restart palaverd
Restart every further server right after it.
sudo systemctl restart 'palaverd@*'
Show their state; expected: active each.
systemctl list-units --all 'palaverd*'
9. LiveKit
Only for a newer LiveKit in the release notes. Show the installed version.
/opt/palaver/bin/livekit-server --version
Download it from GitHub.
curl -fLO https://github.com/livekit/livekit/releases/download/v1.13.7/livekit_1.13.7_linux_amd64.tar.gz
Unpack and install the binary.
tar -xzf livekit_1.13.7_linux_amd64.tar.gz livekit-server
sudo install -m 755 livekit-server /opt/palaver/bin/livekit-server
Restart LiveKit; calls on every server drop.
sudo systemctl restart livekit
10. Check
Run doctor for the main server; expected: no findings.
sudo -u palaver /opt/palaver/bin/palaverd -env /opt/palaver/etc/palaverd.env doctor
For each further server: run doctor; expected: no findings.
sudo -u palaver-guild /opt/palaver/bin/palaverd -env /opt/palaver/instances/guild/palaverd.env doctor
Show the version every server runs.
/opt/palaver/bin/palaverd version
Open the main server's and one further server's web client and log in.
Destructive: remove the previous web client (/opt/palaver/web.old, release files only).
sudo rm -r /opt/palaver/web.old
Destructive: remove the previous palaverd (/opt/palaver/bin/palaverd.old).
sudo rm /opt/palaver/bin/palaverd.old
Remove the downloaded files.
rm palaverd-0.3.1-linux-amd64 palaver-web-0.3.1.tar.gz
Back to the previous version
- for: new version does not work
- database changes are not undone; if needed: Restore a dump
Put the previous palaverd back.
sudo cp /opt/palaver/bin/palaverd.old /opt/palaver/bin/palaverd
Put the previous web client back.
sudo mv /opt/palaver/web /opt/palaver/web.failed
sudo mv /opt/palaver/web.old /opt/palaver/web
Restart the main server.
sudo systemctl restart palaverd
Restart every further server on the previous palaverd.
sudo systemctl restart 'palaverd@*'
Restore a dump
Main server: stop it.
sudo systemctl stop palaverd
Destructive: delete the main server's database (palaver, all accounts and messages since the dump).
sudo -u postgres dropdb palaver
Create it again, load the dump from step 3 and start it.
sudo -u postgres createdb -O palaver palaver
sudo -u palaver pg_restore -d palaver palaver-2026-10-10.dump
sudo systemctl start palaverd
For each further server: stop it.
sudo systemctl stop palaverd@guild
Destructive: delete its database (palaver_guild, all accounts and messages since the dump).
sudo -u postgres dropdb palaver_guild
Create it again, load the dump from step 4 and start it.
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
Once: hosts set up with palaver-host
- for: hosts set up with
palaver-hostand the open bundle'sinstall.sh - once, after step 10
- leftovers: tools, saved templates, logs, nginx sites with the web client inline
Main server
- palaver.social: landing page at
/, snippet and site as in palaver-social'sdocs/server.md - Ubuntu 26.04: sudo-rs without
sudoedit, edit as root
Show the certificate names.
sudo ls /etc/letsencrypt/live/
Keep the old nginx site outside nginx's directories.
sudo cp /etc/nginx/sites-available/palaver /root/nginx-palaver-2026-10-10.conf
Open /etc/nginx/snippets/palaver-web.conf in an editor.
sudo vi /etc/nginx/snippets/palaver-web.conf
Content:
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;
}
Open /etc/nginx/sites-available/palaver in an editor.
sudo vi /etc/nginx/sites-available/palaver
Content; certificate name from above in both ssl_certificate lines:
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;
}
Check and load it.
sudo nginx -t && sudo systemctl reload nginx
Destructive: remove the helper script (/usr/local/sbin/palaverctl).
sudo rm /usr/local/sbin/palaverctl
Destructive: remove the install log (/var/log/palaver-install.log).
sudo rm /var/log/palaver-install.log
Destructive: remove install.sh's certificate note (/opt/palaver/etc/cert, one line).
sudo cat /opt/palaver/etc/cert
sudo rm /opt/palaver/etc/cert
Every further server
For each further server: show its domain, port and certificate name.
sudo grep -E '^PALAVER_(PUBLIC_URL|LISTEN)=' /opt/palaver/instances/guild/palaverd.env
sudo cat /opt/palaver/instances/guild/cert
Keep the old nginx site outside nginx's directories.
sudo cp /etc/nginx/sites-available/palaver-guild /root/nginx-palaver-guild-2026-10-10.conf
Open /etc/nginx/snippets/palaver-web-guild.conf in an editor.
sudo vi /etc/nginx/snippets/palaver-web-guild.conf
Content:
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;
}
Open /etc/nginx/sites-available/palaver-guild in an editor.
sudo vi /etc/nginx/sites-available/palaver-guild
Content; its port in every proxy_pass to palaverd, its certificate name in both ssl_certificate lines:
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;
}
Check and load them.
sudo nginx -t && sudo systemctl reload nginx
Open /opt/palaver/instances/guild/palaverd.env in an editor.
sudo vi /opt/palaver/instances/guild/palaverd.env
Change:
- remove palaver-host's comment lines (
#) - add at the end, for doctor's hints:
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
Check it.
sudo -u palaver-guild /opt/palaver/bin/palaverd -env /opt/palaver/instances/guild/palaverd.env doctor
Destructive: remove palaver-host's certificate note (/opt/palaver/instances/guild/cert, one line).
sudo rm /opt/palaver/instances/guild/cert
The host
Unit template stays. Show it; expected: 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
Show the enabled sites.
ls /etc/nginx/sites-enabled/
With palaver-catch-all: open it in an editor.
sudo vi /etc/nginx/sites-available/palaver-catch-all
Content:
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/;
}
Check and load it.
sudo nginx -t && sudo systemctl reload nginx
Destructive: remove the tool (/usr/local/sbin/palaver-host).
sudo rm /usr/local/sbin/palaver-host
Destructive: remove the saved nginx templates (/opt/palaver/hosting/templates/, two files).
sudo rm -r /opt/palaver/hosting
Destructive: remove palaver-host's log (/var/log/palaver-hosting.log).
sudo rm /var/log/palaver-hosting.log
Destructive: remove unpacked bundles and tarballs in your home directory (palaver-server-*,
palaver-hosting-*); list, then remove with confirmation.
ls -d ~/palaver-server-* ~/palaver-hosting-*
rm -ri ~/palaver-server-* ~/palaver-hosting-*
Once: the machine palaver-ops ran on
Destructive: remove palaver-ops (~/.local/bin/palaver-ops).
rm ~/.local/bin/palaver-ops
Destructive: remove its list of servers (~/.config/palaver-ops/servers.json).
cat ~/.config/palaver-ops/servers.json
rm -r ~/.config/palaver-ops