> Die vollständige Liste der Artikel steht in [llms.txt](https://docs.f3cloud.com/llms.txt). Jede Seite gibt es auch als Markdown, dazu einfach .md an die Adresse anhängen. Diese Seite als Markdown: [https://docs.f3cloud.com/de/games/teamspeak-server.md](https://docs.f3cloud.com/de/games/teamspeak-server.md).

# TeamSpeak-Server auf einem VPS – Installation, Admin-Schlüssel, Ports und Backups

So erstellen Sie einen TeamSpeak-Sprachserver auf einem VPS. Installation von TeamSpeak 3 Server unter Debian aus dem offiziellen Archiv, eigener Benutzer und systemd-Dienst, Annahme der Lizenz, Privilegschlüssel und ServerQuery-Passwort, Öffnen der Ports 9987, 30033 und 10011 in UFW, Prüfung der Ports von außen, Verbindung mit dem Client, Aktualisierung und Backups. Ein eigener Abschnitt zur Beta-Version von TeamSpeak 6 Server in Docker. Getestet unter Debian 12 mit TeamSpeak 3 Server 3.13.8.

Ein eigener TeamSpeak-Sprachserver auf einem VPS läuft rund um die Uhr, und Freunde oder Ihr Team können jederzeit in den gewünschten Kanal kommen, auch wenn Ihr Computer ausgeschaltet ist. Sie entscheiden selbst, wie viele Kanäle es gibt, wer in ihnen sprechen darf und wem Sie Administratorrechte geben. In diesem Artikel installieren wir den Server aus dem offiziellen Archiv, starten ihn unter einem eigenen Benutzer mit systemd, finden den Administratorschlüssel und das ServerQuery-Passwort, öffnen die Ports, prüfen sie von außen, verbinden uns mit dem Client und richten Backups ein. Am Ende folgt ein Abschnitt zur Beta-Version von TeamSpeak 6 Server. Alle Schritte haben wir auf einem Testserver mit Debian 12 nachvollzogen, die Version des Servers war zum Zeitpunkt des Tests **TeamSpeak 3 Server 3.13.8**.

***

## Wie der TeamSpeak-Server funktioniert

Der TeamSpeak-Server ist ein Programm, das die Stimme des Sprechenden entgegennimmt und an alle weiterleitet, die im selben Kanal sitzen. Die Sprachströme mischt der Server nicht. Sprechen mehrere Personen gleichzeitig, empfängt er also mehrere Ströme und schickt jedem Zuhörer alle davon. Daraus folgt für das Netzwerk etwas Einfaches. Der eingehende Datenverkehr des Servers ist gering, der ausgehende wächst dagegen mit der Zahl der Zuhörer und der gleichzeitig Sprechenden, und genau der ausgehende Kanal bestimmt, wie viele Personen Ihr Server bewältigt. Die Sprache läuft über das Protokoll UDP auf Port **9987**. UDP wartet nicht auf die Bestätigung jedes Pakets, und in einem Live-Gespräch wird ein verspätetes Paket ohnehin nicht mehr gebraucht, deshalb ist die Verzögerung geringer als bei TCP. Neben der Sprache lauscht der Server auf einigen weiteren Ports. Über **30033/tcp** übertragen Clients Dateien, Avatare und Kanalsymbole. Über **10011/tcp** läuft ServerQuery, eine textbasierte Verwaltungskonsole, über die Bots, Panels und der Administrator selbst kommunizieren. Die offizielle TeamSpeak-Dokumentation hält nur 9987/udp und 30033/tcp für erforderlich und die ServerQuery-Ports für optional, und in der Firewall halten wir es genauso.

TeamSpeak kennt keine Konten mit Login und Passwort. Beim ersten Start erzeugt der Client ein Schlüsselpaar, und der Server erkennt eine Person an einer eindeutigen Kennung, die aus dem öffentlichen Schlüssel abgeleitet wird. Die Rechte sind an diese Kennung gebunden, der Nickname dient nur als Beschriftung auf dem Bildschirm. Dieses Schema hat einen Nachteil. Solange es auf einem neuen Server keine einzige Person mit Rechten gibt, kann niemand zum ersten Administrator ernannt werden. Diese Aufgabe löst der **Privilegschlüssel** (Privilege Key, früher hieß er Token). Der Server erzeugt ihn beim allerersten Start und zeigt ihn nur einmal an. Wer den Schlüssel im Client eingibt, landet in der Gruppe Server Admin, und der Schlüssel selbst funktioniert danach nicht mehr. Das zweite Geheimnis ist das **ServerQuery-Passwort** für das Konto `serveradmin`. Auch dieses wird nur einmal ausgegeben und öffnet die Verwaltung aller virtuellen Server. Deshalb ist die Suche nach diesen beiden Werten in Schritt 4 wichtiger, als es scheint.

Von TeamSpeak gibt es derzeit zwei Server-Generationen. Auf der Download-Seite ist **TeamSpeak 3 Server 3.13.8** weiterhin das stabile Release, während **TeamSpeak 6 Server** als Beta für Neugierige bereitsteht, und die README des Servers nennt ihn ausdrücklich unvollständig. Für einen Server, der einfach nur laufen soll, sind die Einschränkungen der Beta erheblich. Die integrierte Lizenz ist für 32 Plätze ausgelegt und wird alle zwei Monate mit neuen Builds verlängert, im von uns geprüften Build gilt sie bis zum 1. Dezember 2026. Lizenzen von TeamSpeak 3 passen nicht zur sechsten Version, und eine Datenübernahme zwischen den Versionen gibt es bisher nicht. Deshalb haben wir den Hauptteil des Artikels dem stabilen TeamSpeak 3 gewidmet und der Beta einen eigenen Abschnitt am Ende eingeräumt. Der Server 3.13.8 schreibt beim Start selbst ins Protokoll, dass seine integrierte Lizenz bis zum 1. Juli 2027 gilt, bis zum Sommer 2027 lohnt sich also ein Blick auf die Download-Seite nach einer neueren Version.

> **Für ein Unternehmen wird eine andere Lizenz benötigt.**
>
> Der Server ohne Lizenzschlüssel ist kostenlos und zeitlich unbegrenzt, erlaubt aber einen virtuellen Server und bis zu 32 Slots. Der Lizenztext gibt diesen Modus nur Privatpersonen und nichtkommerziellen Gemeinschaften frei. Wenn der Server für ein Unternehmen gedacht ist, bietet TeamSpeak eine eigene kommerzielle Lizenz an, die Bedingungen erfahren Sie direkt bei TeamSpeak.

***

## Was Sie brauchen

* **Einen Server** mit Debian 12 und **mindestens 1 GB Arbeitsspeicher**, wie es die TeamSpeak-Dokumentation empfiehlt, zum Beispiel den Tarif **DE-RZ9-1**. Der TeamSpeak-Server selbst belegte bei uns im Leerlauf etwa 17 MB. Wenn Sie noch keinen Server haben, bestellen Sie ihn nach der [Anleitung](https://docs.f3cloud.com/de/client-area/order-vps.md).
* **Eine SSH-Verbindung**, zum Beispiel über [Termius](https://docs.f3cloud.com/de/vps/termius-connection.md). Die Befehle werden als `root` ausgeführt.
* **Den TeamSpeak-Client** bei Ihnen und bei allen, die den Server betreten. Sie laden ihn auf der [Download-Seite von TeamSpeak](https://teamspeak.com/en/downloads/) im Reiter **TeamSpeak 3** herunter, zum Zeitpunkt des Tests war dort die Version 3.6.2 zu finden.
* **Einen zweiten Computer** mit Linux oder macOS, um die Ports in Schritt 6 zu prüfen. Ein zweiter VPS tut es auch.

***

## Schritt 1. Legen Sie einen Benutzer an und laden Sie den Server herunter

Den Server als `root` zu starten ist nicht sicher, deshalb legen wir für ihn einen eigenen Benutzer `teamspeak` mit dem Home-Verzeichnis `/opt/teamspeak` an. Die Anmeldung unter diesem Benutzer ist deaktiviert, den Server verwaltet systemd. Mehr über Benutzer steht im Artikel über [Linux-Benutzer](https://docs.f3cloud.com/de/linux/linux-users.md).

```bash
useradd -r -m -d /opt/teamspeak -s /usr/sbin/nologin teamspeak
```

Zum Herunterladen und Entpacken des Archivs werden die Pakete `wget` und `bzip2` benötigt. In unserem Image waren sie bereits installiert, der folgende Befehl ist für den Fall gedacht, dass sie bei Ihnen fehlen.

```bash
apt install -y wget bzip2
```

Laden Sie das Archiv des Servers herunter. Die Adresse stammt von der Download-Seite von TeamSpeak, und wenn dort inzwischen eine neuere Version erschienen ist, ersetzen Sie 3.13.8 an beiden Stellen durch diese.

```bash
cd /root
wget https://files.teamspeak-services.com/releases/server/3.13.8/teamspeak3-server_linux_amd64-3.13.8.tar.bz2
```

Das Archiv ist etwa 10 MB groß. Entpacken Sie es nach `/opt/teamspeak` und übergeben Sie die Dateien an den Benutzer `teamspeak`.

```bash
tar -xjf teamspeak3-server_linux_amd64-3.13.8.tar.bz2 -C /opt/teamspeak --strip-components=1
chown -R teamspeak:teamspeak /opt/teamspeak
```

Der Parameter `--strip-components=1` entfernt aus den Pfaden den äußeren Ordner des Archivs, deshalb liegt die Datei `ts3server` direkt in `/opt/teamspeak`. Nach dem Entpacken belegt dort alles etwa 22 MB.

***

## Schritt 2. Lesen Sie die Lizenz und nehmen Sie sie an

Der Server startet nicht, solange Sie der Lizenz nicht ausdrücklich zustimmen. Überzeugen Sie sich selbst davon und starten Sie ihn von Hand als Benutzer `teamspeak`.

```bash
cd /opt/teamspeak
runuser -u teamspeak -- ./ts3server
```

Der Server beendet sich sofort und erklärt, wie die Lizenz angenommen wird.

<figure><img src="https://docs.f3cloud.com/img/teamspeak-license-error.png" alt="Der TeamSpeak-Server weigert sich zu starten und verlangt die Annahme der Lizenz"><figcaption><p>Ohne Zustimmung zur Lizenz startet der Server nicht</p></figcaption></figure>

Die Lizenz können Sie direkt im Terminal lesen. Sie ist lang, blättern Sie mit der <kbd>Leertaste</kbd>, beenden können Sie mit der Taste <kbd>Q</kbd>.

```bash
runuser -u teamspeak -- env TS3SERVER_LICENSE=view ./ts3server | less
```

Die Zustimmung zur Lizenz wird durch eine leere Datei `.ts3server_license_accepted` im Arbeitsverzeichnis des Servers festgehalten. TeamSpeak beschreibt noch zwei weitere Wege, den Parameter `license_accepted=1` in der Befehlszeile und die Variable `TS3SERVER_LICENSE=accept`, aber die Datei ist bequemer, weil sie auch nach Updates erhalten bleibt.

```bash
runuser -u teamspeak -- touch /opt/teamspeak/.ts3server_license_accepted
```

***

## Schritt 3. Richten Sie den Autostart ein

Damit der Server im Hintergrund läuft, zusammen mit dem VPS startet und nach einem Absturz wieder hochfährt, richten wir ihn als systemd-Dienst ein. Wie Dienste aufgebaut sind, steht ausführlich im Artikel über [systemd](https://docs.f3cloud.com/de/linux/systemd-services.md).

```bash
nano /etc/systemd/system/teamspeak.service
```

Fügen Sie den folgenden Text in die Datei ein, speichern Sie mit <kbd>Ctrl</kbd> + <kbd>O</kbd>, danach <kbd>Enter</kbd>, und verlassen Sie den Editor mit <kbd>Ctrl</kbd> + <kbd>X</kbd>.

```ini
[Unit]
Description=TeamSpeak 3 server
After=network-online.target
Wants=network-online.target

[Service]
User=teamspeak
WorkingDirectory=/opt/teamspeak
ExecStart=/opt/teamspeak/ts3server
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
```

Der Parameter `WorkingDirectory` ist wichtig, denn genau im Arbeitsverzeichnis sucht der Server die Datei mit der Lizenzzustimmung und speichert Datenbank, Dateien und Protokolle. Der Server läuft im normalen Modus und nicht im Hintergrundmodus, deshalb legt systemd alles, was er auf den Bildschirm schreibt, im Journal ab. Aktivieren Sie den Autostart und starten Sie den Dienst.

```bash
systemctl daemon-reload
systemctl enable --now teamspeak
systemctl status teamspeak
```

<figure><img src="https://docs.f3cloud.com/img/teamspeak-systemd-status.png" alt="systemctl status teamspeak, Dienst active (running), Prozess ts3server"><figcaption><p>Der Dienst läuft und ist für den Autostart aktiviert</p></figcaption></figure>

Auf unserem Server dauerte der erste Start samt Anlegen der Datenbank etwa eine Sekunde, und im Leerlauf belegte der Dienst laut systemd 16,9 MB Arbeitsspeicher. Wir haben geprüft, dass der Dienst einen Absturz übersteht. Als wir den Prozess mit dem Befehl `kill -9` zwangsweise beendeten, startete systemd den Server nach 10 Sekunden neu.

Den Server verwalten Sie jetzt über systemd.

* `systemctl stop teamspeak` schaltet den Server aus.
* `systemctl start teamspeak` schaltet ihn ein.
* `systemctl restart teamspeak` startet ihn neu.
* `journalctl -u teamspeak -f` zeigt das Journal in Echtzeit, beenden können Sie mit <kbd>Ctrl</kbd> + <kbd>C</kbd>. Mehr über Protokolle steht im Artikel über [Linux-Logs](https://docs.f3cloud.com/de/linux/linux-logs.md).

***

## Schritt 4. Finden Sie den Privilegschlüssel und das ServerQuery-Passwort

Beim ersten Start hat der Server zwei Geheimnisse ausgegeben. Da der Server unter systemd läuft, liegen sie im Journal des Dienstes. Wir lassen uns daraus nur die benötigten Zeilen anzeigen.

```bash
journalctl -u teamspeak --no-pager -o cat | grep -E "loginname|apikey|token="
```

<figure><img src="https://docs.f3cloud.com/img/teamspeak-credentials.png" alt="Journalzeilen mit dem ServerQuery-Passwort, dem API-Schlüssel und dem Privilegschlüssel, die Werte sind verdeckt"><figcaption><p>Passwort, API-Schlüssel und Privilegschlüssel (auf dem Bild sind die Werte verdeckt)</p></figcaption></figure>

Die Ausgabe besteht aus vier Zeilen.

* In der ersten Zeile stehen der Kontoname `serveradmin` und sein **ServerQuery-Passwort**.
* In der zweiten Zeile steht der **API-Schlüssel** zur Verwaltung des Servers über HTTP, er ist nur für diejenigen nützlich, die Bots und Panels schreiben.
* In der dritten und vierten Zeile steht derselbe **Privilegschlüssel**, den Sie in Schritt 7 brauchen. Der Server gibt ihn zweimal aus, das erste Mal in einer Journalzeile, das zweite Mal in einem Rahmen.

Kopieren Sie diese Werte in einen Passwortmanager. Der Privilegschlüssel ist zusätzlich im Ordner `logs` in der Protokolldatei des virtuellen Servers festgehalten, das ServerQuery-Passwort und der API-Schlüssel gelangen dagegen nicht in die Protokolldateien, sie sind nur im systemd-Journal zu finden. Falls das Journal mit der Zeit geleert wird oder Sie die Werte früher verlieren, ist das nicht schlimm, im Abschnitt „Häufige Fragen“ unten gibt es einen Weg, einen neuen Schlüssel zu erzeugen und das Passwort zurückzusetzen.

> **Senden Sie Schlüssel und Passwort niemandem.**
>
> Der Privilegschlüssel gibt Administratorrechte auf dem Server, und das ServerQuery-Passwort gibt die volle Kontrolle über alle Server. Zeigen Sie sie nicht auf Screenshots und schicken Sie sie nicht per Messenger. Wenn der Schlüssel in falsche Hände geraten ist, bevor Sie ihn benutzt haben, erzeugen Sie einen neuen, wie im Abschnitt „Häufige Fragen“ beschrieben.

***

## Schritt 5. Öffnen Sie die Ports in UFW

Wenn auf dem VPS die Firewall UFW aktiviert ist, öffnen Sie den Sprachport und den Port für die Dateiübertragung. Diese beiden Ports brauchen alle, die den Server betreten. Mehr über die Firewall steht im Artikel über [UFW](https://docs.f3cloud.com/de/vps/security/firewall.md).

```bash
ufw allow 9987/udp
ufw allow 30033/tcp
```

Den ServerQuery-Port 10011 sollten Sie nicht für das ganze Internet öffnen. Das Passwort wird dort im Klartext übertragen, und das offizielle Handbuch des Servers nennt diese Variante die frühere Standardeinstellung und rät dringend zu sichereren Protokollen. Wenn Sie ServerQuery von Ihrem Heimcomputer aus benötigen, öffnen Sie den Port nur für Ihre eigene Adresse. Für die Prüfung in Schritt 6 haben wir es genau so gemacht, setzen Sie anstelle von `IP-Ihres-Computers` Ihre externe Adresse ein.

```bash
ufw allow from IP-Ihres-Computers to any port 10011 proto tcp
ufw status
```

<figure><img src="https://docs.f3cloud.com/img/teamspeak-ufw.png" alt="Die Befehle ufw allow für die Ports 9987/udp, 30033/tcp und 10011/tcp nur für eine Adresse, danach ufw status"><figcaption><p>Sprache und Dateien sind für alle offen, ServerQuery nur für eine Adresse</p></figcaption></figure>

Der Server lauscht auf mehr Ports, als wir geöffnet haben. Außer Sprache und Dateiübertragung nimmt er ServerQuery-Verbindungen in drei Varianten an, die normale auf 10011, per SSH auf 10022 und per HTTP auf 10080, und zwar auf allen Adressen gleichzeitig. Das lässt sich mit dem Befehl `ss` prüfen.

```bash
ss -tuln | grep -E "Netid|:(9987|10011|10022|10080|30033) "
```

<figure><img src="https://docs.f3cloud.com/img/teamspeak-ports.png" alt="Ausgabe von ss, der Server lauscht auf udp 9987 und tcp 30033, 10022, 10011, 10080"><figcaption><p>Ports, auf denen der TeamSpeak-Server lauscht</p></figcaption></figure>

Die Ports 10022 und 10080 haben wir in der Firewall nicht geöffnet, und von einem anderen Computer aus antworten sie nicht. So lassen Sie es am besten.

***

## Schritt 6. Prüfen Sie die Ports von außen

Die Ports müssen von einem anderen Computer aus geprüft werden. Wenn Sie die Prüfung auf dem Server selbst ausführen, gelingt sie auch bei geschlossener Firewall, weil der Datenverkehr über die interne Schnittstelle läuft, die die Firewall nicht einschränkt. Wir haben von einem Computer unter macOS aus geprüft, unter Linux sind die Befehle dieselben.

Zuerst prüfen wir den Port für die Dateiübertragung. Er arbeitet über TCP, deshalb genügt das Programm `nc`.

```bash
nc -vz IP-des-Servers 30033
```

Die Antwort **succeeded** bedeutet, dass der Port offen ist und der Server antwortet.

Mit dem Sprachport ist es schwieriger, weil UDP auf eine einfache Verbindungsprüfung nicht antwortet. Wir haben ein kurzes Python-Skript geschrieben, das das erste Handshake-Paket sendet, mit dem der Client den Verbindungsaufbau beginnt, und drei Sekunden auf die Antwort wartet. Das ist kein offizielles Werkzeug, wir haben es selbst gemacht, um den Port ohne grafischen Client prüfen zu können. Erstellen Sie die Datei.

```bash
nano ts3-udp-check.py
```

```python
import os, socket, struct, sys, time

host = sys.argv[1]
port = int(sys.argv[2]) if len(sys.argv) > 2 else 9987

# Erstes Handshake-Paket von TeamSpeak, so wie es der Client sendet
data = struct.pack('>IBI', 1566914096, 0, int(time.time())) + os.urandom(4) + bytes(8)
packet = b'TS3INIT1' + struct.pack('>HH', 101, 0) + b'\x88' + data

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.settimeout(3)
s.sendto(packet, (host, port))
try:
    reply, addr = s.recvfrom(2048)
    print('Der Server hat geantwortet, der Port ist erreichbar')
except socket.timeout:
    print('Keine Antwort, der Port ist geschlossen oder der Server läuft nicht')
```

Starten Sie es und geben Sie dabei die Adresse des Servers und den Port an.

```bash
python3 ts3-udp-check.py IP-des-Servers 9987
```

Zum Schluss prüfen wir ServerQuery. Verbinden Sie sich mit Port 10011, der Server begrüßt Sie mit der Zeile `TS3`. Geben Sie danach die Befehle einzeln ein. Setzen Sie anstelle von `PASSWORT` das ServerQuery-Passwort aus Schritt 4 ein.

```bash
nc IP-des-Servers 10011
```

```text
login serveradmin PASSWORT
version
quit
```

<figure><img src="https://docs.f3cloud.com/img/teamspeak-check-outside.png" alt="Prüfung von außen, nc an Port 30033, Antwort des Skripts für Port 9987 und Anmeldung bei ServerQuery mit dem Befehl version"><figcaption><p>Alle drei Ports antworten, der Server meldet die Version 3.13.8</p></figcaption></figure>

Die Antwort `error id=0 msg=ok` auf den Befehl `login` bedeutet, dass das Passwort akzeptiert wurde, und als Antwort auf `version` nennt der Server seine Version und Plattform. Auf unserem Server schwieg das Skript vor den `ufw allow`-Befehlen und meldete, dass keine Antwort kam, danach kam die Antwort nach etwa 60 Millisekunden.

Nach der Prüfung entfernen Sie die Regel für ServerQuery, wenn Sie sie nicht mehr brauchen.

```bash
ufw delete allow from IP-Ihres-Computers to any port 10011 proto tcp
```

***

## Schritt 7. Verbinden Sie sich mit dem Client und werden Sie Administrator

Die weiteren Schritte sind nach der offiziellen Dokumentation von TeamSpeak 3 beschrieben, weil wir den grafischen Client auf dem Testserver nicht gestartet haben. Die Namen der Menüpunkte stammen von dort.

1. Installieren Sie den TeamSpeak-3-Client und starten Sie ihn.
2. Wählen Sie im Menü **Connections** den Punkt **Connect**.
3. Geben Sie in das Adressfeld die IP-Adresse des Servers ein. Läuft der Server auf Port 9987, muss der Port nicht angegeben werden, für einen anderen Port verwenden Sie die Schreibweise `IP:PORT`.
4. Geben Sie den Nickname ein, unter dem andere Sie sehen. Das Feld für das Serverpasswort lassen Sie leer, solange Sie keines festgelegt haben.
5. Klicken Sie auf die Schaltfläche zum Verbinden.

Sie gelangen als gewöhnlicher Benutzer ohne Administratorrechte auf den Server. Um sie zu erhalten, wählen Sie im Menü **Permissions** den Punkt **Use Token** und fügen den Privilegschlüssel aus Schritt 4 ein. Wenn alles geklappt hat, erscheint neben Ihrem Nickname das Symbol **SA**. Der Schlüssel ist einmalig, deshalb funktioniert er nach erfolgreicher Eingabe nicht mehr. Um noch jemandem Rechte zu geben, öffnen Sie im Menü **Permissions** den Punkt **Token Manager**, klicken Sie auf **Add Token**, wählen Sie den Typ **Server Group** und die Gruppe **Server Admin** und klicken Sie danach auf **Create**. In der App für iOS heißt der Punkt zur Eingabe des Schlüssels **Use Privilege Key**.

Jetzt können Sie den Server einrichten. Klicken Sie mit der rechten Maustaste auf den Namen des Servers über dem obersten Kanal und wählen Sie **Edit Virtual Server**. Dort legen Sie unter anderem das allgemeine Serverpasswort fest. Es wird gebraucht, wenn nicht jeder, der die Adresse erfährt, auf den Server kommen soll. Einen Link für Freunde können Sie in der Form `ts3server://IP-des-Servers?port=9987` gestalten, per Klick darauf verbindet sich der Client selbst mit dem Server. Statt der IP-Adresse ist eine Domain praktisch, wie das geht, steht im Artikel über die [Verknüpfung einer Domain](https://docs.f3cloud.com/de/vps/domain-to-vps.md).

> **Der TeamSpeak-6-Client passt auch.**
>
> Laut der Dokumentation von TeamSpeak kann sich der Client der sechsten Version mit einem TeamSpeak-3-Server verbinden, erhält aber nur die Funktionen der dritten Version. Der TeamSpeak-6-Client ist auf der Download-Seite ebenfalls noch eine Beta und verlangt beim ersten Start, ein myTeamSpeak-Konto zu erstellen.

***

## Backups

Alles, was TeamSpeak speichert, liegt in `/opt/teamspeak`. Laut der offiziellen Dokumentation werden für den Umzug des Servers auf einen anderen Rechner die folgenden Dateien benötigt.

* `ts3server.sqlitedb` enthält die Datenbank mit allen Kanälen, Gruppen, Rechten und Benutzern und ist die wichtigste Datei.
* Der Ordner `files` enthält hochgeladene Dateien, Symbole und Avatare.
* `query_ip_allowlist.txt` und `query_ip_denylist.txt` enthalten die Adresslisten für ServerQuery. In der Dokumentation heißen sie `whitelist` und `blacklist`, in der Version 3.13.8 heißen die Dateien genau so, wie wir es geschrieben haben.
* `licensekey.dat` gibt es nur bei denen, die eine Lizenz gekauft haben.
* `ssh_host_rsa_key` enthält den Schlüssel der SSH-Variante von ServerQuery, ihn haben wir selbst hinzugefügt, damit sich der Schlüssel des Servers nach der Wiederherstellung nicht ändert.

Einfaches Kopieren von `ts3server.sqlitedb` auf einem laufenden Server ist unzuverlässig. SQLite schreibt Änderungen zuerst in eine benachbarte Journaldatei und überträgt sie nicht sofort in die Hauptdatei. Wir haben das auf unserem Server geprüft. Nach dem Anlegen von zwei Kanälen enthielt eine Kopie nur der Hauptdatei lediglich einen Kanal statt drei, die Kopie mit den Mitteln von SQLite selbst hat dagegen alle drei gesichert. Deshalb verwenden wir das Programm `sqlite3` mit dem Befehl `.backup`, der eine konsistente Kopie ohne Anhalten des Servers erstellt.

```bash
apt install -y sqlite3
nano /opt/teamspeak/backup.sh
```

Das Skript sichert die Datenbank und die Dateien in einem Archiv im Ordner `/opt/teamspeak/backups` und behält die 7 neuesten Archive.

```bash
#!/bin/sh
# Kopie der Datenbank und der Dateien von TeamSpeak ohne Anhalten des Servers, behält die 7 neuesten Archive
set -e
cd /opt/teamspeak
mkdir -p backups
tmp=$(mktemp -d)
sqlite3 ts3server.sqlitedb ".backup '$tmp/ts3server.sqlitedb'"
cp -a files query_ip_allowlist.txt query_ip_denylist.txt ssh_host_rsa_key "$tmp"/
[ -f licensekey.dat ] && cp -a licensekey.dat "$tmp"/
tar -czf "backups/teamspeak-$(date +%F-%H%M).tar.gz" -C "$tmp" .
rm -rf "$tmp"
ls -1t backups/teamspeak-*.tar.gz | tail -n +8 | xargs -r rm --
```

Machen Sie das Skript ausführbar, starten Sie es von Hand und tragen Sie es in den Zeitplan des Benutzers `teamspeak` ein, zum Beispiel jede Nacht um 4:00 Uhr.

```bash
chmod +x /opt/teamspeak/backup.sh
chown teamspeak:teamspeak /opt/teamspeak/backup.sh
runuser -u teamspeak -- /opt/teamspeak/backup.sh
echo "0 4 * * * /opt/teamspeak/backup.sh" | crontab -u teamspeak -
```

<figure><img src="https://docs.f3cloud.com/img/teamspeak-backup.png" alt="Start von backup.sh, Liste der Archive im Ordner backups und Inhalt des letzten Archivs"><figcaption><p>Im Archiv liegen die Datenbank, die Adresslisten und der SSH-Schlüssel sowie der Ordner files</p></figcaption></figure>

Wir haben das Skript sowohl von Hand als auch nach Zeitplan geprüft, beide Male ist ein Archiv entstanden. Mehr über den Zeitplan steht im Artikel über [cron](https://docs.f3cloud.com/de/linux/cron-linux.md). Kopien auf demselben Server helfen nicht, wenn der Server selbst verloren geht, laden Sie die Archive deshalb von Zeit zu Zeit auf Ihren Computer herunter oder schicken Sie sie auf einen anderen Server, zum Beispiel mit dem Befehl [rsync](https://docs.f3cloud.com/de/linux/rsync-linux.md).

Um den Server aus einer Kopie wiederherzustellen, stoppen Sie den Dienst, löschen Sie die aktuelle Datenbank und die Dateien, entpacken Sie das gewünschte Archiv und starten Sie den Dienst erneut. Setzen Sie anstelle des Archivnamens im Beispiel Ihren eigenen ein.

```bash
systemctl stop teamspeak
rm -rf /opt/teamspeak/ts3server.sqlitedb* /opt/teamspeak/files
tar -xzf /opt/teamspeak/backups/teamspeak-2026-10-21-1503.tar.gz -C /opt/teamspeak
chown -R teamspeak:teamspeak /opt/teamspeak
systemctl start teamspeak
```

Wir haben die Wiederherstellung auf unserem Server geprüft. Danach waren der Servername, beide Kanäle, das bisherige ServerQuery-Passwort und der bisherige Privilegschlüssel wieder da. Der Befehl `rm` löscht nebenbei die temporären Datenbankdateien mit den Endungen `-wal` und `-shm`, damit der Server mit einem sauberen Zustand startet.

> **Ein Server ohne Datenbank startet wie ein neuer.**
>
> Wenn Sie den Server ohne die Datei `ts3server.sqlitedb` starten, legt er eine leere Datenbank an und gibt ein neues ServerQuery-Passwort und einen neuen Privilegschlüssel aus. Davon haben wir uns überzeugt, indem wir die Datenbank vorübergehend entfernten und danach die Daten aus der Kopie zurückspielten. Löschen Sie deshalb die Datenbank nicht, ohne ein aktuelles Archiv zu haben.

***

## Server aktualisieren

Der Server wird durch den Austausch der Dateien aktualisiert. In der Dokumentation zum TeamSpeak-Server steht einfach, dass die neuen Dateien über die alten kopiert werden sollen. Datenbank und Einstellungen bleiben dabei unberührt, weil sie nicht im Archiv enthalten sind. Wir haben diese Reihenfolge auf unserem Server wiederholt. Eine neuere Version als 3.13.8 gab es zu dem Zeitpunkt nicht, deshalb haben wir dieselbe Version über die installierte entpackt. Kanäle, Schlüssel und Einstellungen blieben erhalten, und im Journal erschien nach dem Start wieder die Zeile mit der Version. Vor dem Update wird der Server gestoppt und mit dem Skript aus dem vorigen Abschnitt ein Backup erstellt.

```bash
systemctl stop teamspeak
runuser -u teamspeak -- /opt/teamspeak/backup.sh

cd /root
wget https://files.teamspeak-services.com/releases/server/NEUE-VERSION/teamspeak3-server_linux_amd64-NEUE-VERSION.tar.bz2
tar -xjf teamspeak3-server_linux_amd64-NEUE-VERSION.tar.bz2 -C /opt/teamspeak --strip-components=1
chown -R teamspeak:teamspeak /opt/teamspeak

systemctl start teamspeak
```

Der letzte Befehl `chown` ist Pflicht. Wir haben das Archiv als `root` entpackt, und nach dem Entpacken gehörte die Datei `ts3server` dem Benutzer `root`. Die Version nach dem Start können Sie im Journal prüfen.

```bash
journalctl -u teamspeak -n 80 --no-pager -o cat | grep "TeamSpeak 3 Server"
```

Die Liste der Änderungen jeder Version liegt in der Datei `/opt/teamspeak/CHANGELOG`.

***

## TeamSpeak 6 als Beta-Version des Servers in Docker

Wenn Sie die neue Generation ausprobieren möchten, empfiehlt TeamSpeak für TeamSpeak 6 Server die Installation über Docker. Wie Sie Docker selbst installieren, steht im Artikel über die [Installation von Docker](https://docs.f3cloud.com/de/docker/docker-installation.md). Wir haben den Build **6.0.0-beta13.1** geprüft. Das Image ist etwa 60 MB groß, und der Container belegte im Leerlauf etwa 20 MB Arbeitsspeicher. Die Ports der sechsten Version sind fast dieselben geblieben. Die Sprache läuft auf **9987/udp**, die Dateiübertragung auf **30033/tcp**, und ServerQuery ist standardmäßig nicht aktiviert. Wir haben das von außen geprüft, auf Port 10011 kommt eine Verbindungsverweigerung. Aktivieren lässt es sich über die Parameter des Servers, laut Dokumentation sind dafür die Ports 10022 für SSH und 10080 für HTTP vorgesehen.

Führen Sie den Befehl aus der offiziellen README des Servers aus. Wir haben `--restart unless-stopped` hinzugefügt, damit der Container nach einem Neustart des VPS wieder hochfährt. Die Zustimmung zur Lizenz wird hier über die Variable `TSSERVER_LICENSE_ACCEPTED=accept` festgelegt, und die Daten liegen im Volume `teamspeak-data`.

```bash
docker run -d --name teamspeak-server --restart unless-stopped \
  -p 9987:9987/udp -p 30033:30033 \
  -e TSSERVER_LICENSE_ACCEPTED=accept \
  -v teamspeak-data:/var/tsserver \
  teamspeaksystems/teamspeak6-server:latest
```

<figure><img src="https://docs.f3cloud.com/img/teamspeak6-docker-run.png" alt="Start des Containers teamspeak-server mit dem Image teamspeaksystems/teamspeak6-server"><figcaption><p>Der TeamSpeak-6-Container läuft</p></figcaption></figure>

Den Privilegschlüssel und das ServerQuery-Passwort gibt der Server beim ersten Start genauso aus wie die dritte Version, nur müssen Sie sie im Protokoll des Containers suchen.

```bash
docker logs teamspeak-server 2>&1 | grep -E "loginname|apikey|token="
```

<figure><img src="https://docs.f3cloud.com/img/teamspeak6-credentials.png" alt="Zeilen aus dem Protokoll des Containers mit ServerQuery-Passwort, API-Schlüssel und Privilegschlüssel, die Werte sind verdeckt"><figcaption><p>Schlüssel und Passwort im Protokoll des Containers (auf dem Bild sind die Werte verdeckt)</p></figcaption></figure>

Der Container wird durch den Austausch des Images aktualisiert. Wir haben die Reihenfolge geprüft, danach blieben die Daten im Volume erhalten, und ein neuer Schlüssel und ein neues Passwort wurden nicht erzeugt.

```bash
docker pull teamspeaksystems/teamspeak6-server:latest
docker stop teamspeak-server
docker rm teamspeak-server
```

Wiederholen Sie danach den Befehl `docker run` aus diesem Abschnitt. Wenn Sie den Port für die Dateiübertragung ändern, fügen Sie die Variable `TSSERVER_FILE_TRANSFER_PORT` mit derselben Nummer hinzu und veröffentlichen Sie dieselbe Portnummer auf dem Host, weil sich die Clients direkt mit diesem Port verbinden. Wir haben das mit Port 30034 geprüft.

> **Docker öffnet Ports an UFW vorbei.**
>
> Ports, die über `-p` veröffentlicht werden, öffnet Docker selbst, und die UFW-Regeln gelten dafür nicht. Wir haben den Container auf den Ports 9988 und 30034 ohne eine einzige Regel in UFW gestartet, und von einem anderen Computer aus antworteten beide Ports. Veröffentlichen Sie nur die Ports, die für alle offen sein sollen.

> **Was Sie über die Beta wissen sollten.**
>
> In der README des Servers steht, dass es sich um eine Beta handelt und einige Funktionen noch nicht fertig sind. Die integrierte Lizenz für 32 Plätze wird durch neue Builds verlängert, in unserem Build gilt sie bis zum 1. Dezember 2026, den Server müssen Sie also aktualisieren. Lizenzen von TeamSpeak 3 passen nicht dazu, und eine Datenübernahme zwischen den Versionen gibt es nicht. Wenn die dritte und die sechste Version auf demselben Server installiert sind, brauchen sie unterschiedliche Ports.

***

## Häufige Fragen

<details>

<summary>Please set the environment variable TS3SERVER_LICENSE to "accept" in order to accept the license agreement</summary>

Der Server hat keine Zustimmung zur Lizenz gefunden und sich beendet. Diese Meldung haben wir beim ersten manuellen Start erhalten. Erstellen Sie die leere Datei `.ts3server_license_accepted` im Arbeitsverzeichnis des Servers, wie in Schritt 2 gezeigt, und stellen Sie sicher, dass im systemd-Dienst `WorkingDirectory=/opt/teamspeak` angegeben ist, denn die Datei wird genau im Arbeitsverzeichnis gesucht.

</details>

<details>

<summary>local accounting reports an already running instance, instance will shutdown</summary>

Ohne Lizenzschlüssel erlaubt TeamSpeak, auf einem Rechner nur einen Server zu starten. Diese Zeile haben wir erhalten, als wir eine zweite Instanz starteten, während der Dienst lief, und die zweite Instanz hielt sofort an. Meistens bedeutet das, dass Sie den Server von Hand starten, während der systemd-Dienst bereits läuft. Stoppen Sie die überzählige Instanz oder verwalten Sie den Server nur über `systemctl`.

</details>

<details>

<summary>error id=520 msg=invalid\sloginname\sor\spassword</summary>

Das ServerQuery-Passwort wurde nicht akzeptiert. Die Zeichen `\s` in der Antwort bedeuten ein Leerzeichen, so schreibt ServerQuery Leerzeichen. Nehmen Sie das Passwort aus dem Journal, wie in Schritt 4. Wenn das Passwort verloren ist, lässt es sich zurücksetzen. Stoppen Sie den Dienst und starten Sie den Server einmal von Hand mit dem Parameter `serveradmin_password`, und wenn er die Zeilen zum Start ausgegeben hat, beenden Sie ihn mit <kbd>Ctrl</kbd> + <kbd>C</kbd> und starten Sie den Dienst wieder.

```bash
systemctl stop teamspeak
cd /opt/teamspeak
runuser -u teamspeak -- ./ts3server serveradmin_password=NEUES-PASSWORT
systemctl start teamspeak
```

Wir haben diesen Weg geprüft, danach passte das bisherige Passwort nicht mehr, und das neue funktionierte. Beachten Sie, dass das Passwort im Verlauf der Befehle bleibt, deshalb rät die Dokumentation von TeamSpeak, nach der Anmeldung den Befehl `clientsetserverquerylogin client_login_name=serveradmin` auszuführen. Der Server gibt ein neues Passwort aus, und es steht nicht mehr im Verlauf.

</details>

<details>

<summary>error id=3329 msg=connection\sfailed,\syou\sare\sbanned extra_msg=you\smay\sretry\sin\s600\sseconds</summary>

Der Schutz von ServerQuery vor dem Erraten von Passwörtern hat ausgelöst. Diese Antwort haben wir nach drei falschen Passwörtern hintereinander erhalten, die Adresse war für 600 Sekunden gesperrt. Warten Sie diese Zeit ab oder starten Sie den Dienst mit `systemctl restart teamspeak` neu, wir haben geprüft, dass ein Neustart die Sperre aufhebt. Adressen aus der Datei `query_ip_allowlist.txt` lässt der Schutz in Ruhe, dort stehen standardmäßig `127.0.0.1` und `::1`. Das Hinzufügen einer Adresse zu dieser Datei wirkt sofort, hebt aber eine bereits verhängte Sperre nicht auf, dafür ist ein Neustart nötig.

</details>

<details>

<summary>No reply from server oder Connection Error [0x705]</summary>

Der Client hat vom Server keine Antwort erhalten. Die Dokumentation von TeamSpeak nennt als häufige Ursachen eine falsche Adresse oder einen falschen Port, einen nicht gestarteten Server und eine Firewall, die den Datenverkehr blockiert. Prüfen Sie der Reihe nach.

1. Der Dienst läuft, `systemctl status teamspeak` zeigt active (running).
2. Der Port **9987/udp** ist offen, `ufw status` enthält eine Regel dafür.
3. Die Prüfung aus Schritt 6 antwortet. Als wir die Regel für 9987/udp absichtlich entfernten, meldete das Skript, dass keine Antwort kommt, und nach dem Befehl `ufw allow 9987/udp` kam die Antwort zurück.
4. Wenn der Server nicht auf Port 9987 läuft, muss die Adresse im Client in der Form `IP:PORT` geschrieben werden.

</details>

<details>

<summary>Privilegschlüssel verloren oder bereits verwendet</summary>

Ein neuer Schlüssel wird mit einem ServerQuery-Befehl erzeugt. Öffnen Sie die Konsole direkt auf dem Server, die Adresse `127.0.0.1` blockiert der Schutz vor dem Erraten von Passwörtern nicht, und in der Firewall muss kein Port geöffnet werden.

```bash
nc 127.0.0.1 10011
```

Geben Sie nacheinander drei Befehle ein, setzen Sie anstelle von `PASSWORT` das ServerQuery-Passwort ein.

```text
login serveradmin PASSWORT
use 1
servergrouplist
```

Suchen Sie in der Gruppenliste die Zeile `name=Server\sAdmin` mit dem Merkmal `type=1`. Die Zeile mit `type=0` hat einen anderen Zweck, sie ist eine Vorlage für künftige Server. Auf unserem Server hatte die gesuchte Gruppe die Nummer 6. Setzen Sie Ihre Nummer in den nächsten Befehl ein.

```text
privilegekeyadd tokentype=0 tokenid1=6 tokenid2=0 tokendescription=new\sadmin
```

Der Server antwortet mit einer Zeile `token=…`, das ist der neue Schlüssel. Wir haben den Befehl geprüft, der Schlüssel wurde erstellt und erschien in der Liste des Befehls `privilegekeylist`. Die Konsole verlassen Sie mit dem Befehl `quit`.

</details>

<details>

<summary>Unable to open licensekey.dat, falling back to limited functionality</summary>

Das ist kein Fehler, sondern eine Warnung, dass der Server ohne gekaufte Lizenz läuft. Im Journal daneben sehen Sie, dass die Lizenz **No License** heißt und einen virtuellen Server und 32 Slots erlaubt. Für einen privaten Server reicht das.

</details>

<details>

<summary>Please set the environment variable TSSERVER_LICENSE_ACCEPTED to "accept" in order to accept the license agreement</summary>

So verhält sich der TeamSpeak-6-Container, wenn Sie ihn ohne die Variable mit der Lizenzzustimmung starten, genau so haben wir diese Meldung erhalten. Fügen Sie dem Befehl `docker run` den Parameter `-e TSSERVER_LICENSE_ACCEPTED=accept` hinzu.

</details>

***

## Unsere Ressourcen

**Telegram-Kanal:** [https://t.me/f3cloud_news](https://t.me/f3cloud_news)\
**Hosting-Website:** [https://f3cloud.com](https://f3cloud.com/de)
