> Полный список статей есть в [llms.txt](https://docs.f3cloud.com/llms.txt). Markdown-версия есть у каждой страницы, достаточно добавить .md к её адресу. Эта страница в Markdown: [https://docs.f3cloud.com/ru/games/teamspeak-server.md](https://docs.f3cloud.com/ru/games/teamspeak-server.md).

# Сервер TeamSpeak на VPS – установка, ключ администратора, порты и резервные копии

Как создать голосовой сервер TeamSpeak на VPS. Установка TeamSpeak 3 Server на Debian из официального архива, отдельный пользователь и служба systemd, принятие лицензии, ключ привилегий и пароль ServerQuery, открытие портов 9987, 30033 и 10011 в UFW, проверка портов снаружи, подключение клиентом, обновление и резервные копии. Отдельный раздел про бета-версию TeamSpeak 6 Server в Docker. Проверено на Debian 12 с TeamSpeak 3 Server 3.13.8.

Свой голосовой сервер TeamSpeak на VPS работает круглосуточно, и друзья или команда могут заходить в нужный канал в любое время, даже когда ваш компьютер выключен. Вы сами решаете, сколько будет каналов, кто в них может говорить и кому дать права администратора. В этой статье мы установим сервер из официального архива, запустим его отдельным пользователем под управлением systemd, найдём ключ администратора и пароль ServerQuery, откроем порты, проверим их снаружи, подключимся клиентом и настроим резервные копии. В конце есть раздел про бета-версию TeamSpeak 6 Server. Все шаги мы повторили на тестовом сервере с Debian 12, версия сервера на момент проверки **TeamSpeak 3 Server 3.13.8**.

***

## Как устроен сервер TeamSpeak

Сервер TeamSpeak – это программа, которая принимает голос от говорящего и пересылает его тем, кто сидит в том же канале. Потоки голоса сервер не смешивает, поэтому, когда говорят сразу несколько человек, он получает несколько потоков и каждому слушателю отправляет их все. Отсюда простое следствие для сети. Входящий трафик на сервере небольшой, а исходящий растёт вместе с числом слушателей и числом одновременно говорящих, и именно исходящий канал определяет, сколько людей потянет ваш сервер. Голос идёт по протоколу UDP на порт **9987**. UDP не ждёт подтверждения каждого пакета, а в живом разговоре опоздавший пакет всё равно уже не нужен, поэтому задержка получается меньше, чем при TCP. Помимо голоса сервер слушает ещё несколько портов. По **30033/tcp** клиенты передают файлы, аватары и иконки каналов. По **10011/tcp** работает ServerQuery, текстовая консоль управления, через которую общаются боты, панели и сам администратор. Официальная справка TeamSpeak считает обязательными только 9987/udp и 30033/tcp, а порты ServerQuery необязательными, и в брандмауэре мы поступим так же.

В TeamSpeak нет учётных записей с логином и паролем. Когда клиент запускается впервые, он создаёт пару ключей, а сервер узнаёт человека по уникальному идентификатору, выведенному из открытого ключа. Права привязаны к этому идентификатору, а ник служит только подписью на экране. У такой схемы есть неудобство. Пока на новом сервере нет ни одного человека с правами, назначить первого администратора некому. Эту задачу решает **ключ привилегий** (privilege key, раньше он назывался token). Сервер создаёт его при самом первом запуске и показывает один раз. Кто введёт ключ в клиенте, попадает в группу Server Admin, а сам ключ после этого перестаёт работать. Второй секрет – это **пароль ServerQuery** для учётной записи `serveradmin`. Он тоже выдаётся один раз и открывает управление всеми виртуальными серверами. Поэтому поиск этих двух значений в шаге 4 важнее, чем может показаться.

У TeamSpeak сейчас два поколения сервера. На странице загрузок стабильным релизом остаётся **TeamSpeak 3 Server 3.13.8**, а **TeamSpeak 6 Server** выложен как бета для желающих попробовать, и README самого сервера прямо называет его неполным. Для сервера, который должен просто работать, ограничения беты существенны. Встроенная лицензия рассчитана на 32 места и продлевается раз в два месяца с выходом новых сборок, в проверенной нами сборке она действует до 1 декабря 2026 года. Лицензии TeamSpeak 3 к шестой версии не подходят, а переноса данных между версиями пока нет. Поэтому основную часть статьи мы посвятили стабильному TeamSpeak 3, а бете отвели отдельный раздел в конце. Сервер 3.13.8 при запуске сам пишет в журнал, что его встроенная лицензия действует до 1 июля 2027 года, так что к лету 2027 года стоит заглянуть на страницу загрузок за свежей версией.

> **Для компании нужна другая лицензия.**
>
> Сервер без лицензионного ключа бесплатен и без ограничения по времени, но допускает один виртуальный сервер и до 32 слотов. Текст лицензии отдаёт такой режим только частным лицам и некоммерческим сообществам. Если сервер нужен компании, TeamSpeak предлагает отдельную коммерческую лицензию, условия узнают у самой TeamSpeak.

***

## Что понадобится

* **Сервер** с Debian 12 и **не меньше 1 ГБ памяти**, как рекомендует справка TeamSpeak, например тариф **DE-RZ9-1**. Сам сервер TeamSpeak в простое занял у нас около 17 МБ. Если сервера ещё нет, закажите его по [инструкции](https://docs.f3cloud.com/ru/client-area/order-vps.md).
* **Подключение по SSH**, например через [Termius](https://docs.f3cloud.com/ru/vps/termius-connection.md). Команды выполняются от имени `root`.
* **Клиент TeamSpeak** у вас и у тех, кто будет заходить. Его скачивают на [странице загрузок TeamSpeak](https://teamspeak.com/en/downloads/) на вкладке **TeamSpeak 3**, на момент проверки там была версия 3.6.2.
* **Второй компьютер** с Linux или macOS для проверки портов в шаге 6. Подойдёт и второй VPS.

***

## Шаг 1. Создайте пользователя и скачайте сервер

Запускать сервер от имени `root` небезопасно, поэтому создадим для него отдельного пользователя `teamspeak` с домашней папкой `/opt/teamspeak`. Вход под этим пользователем отключён, сервером будет управлять systemd. Подробнее о пользователях рассказано в статье про [пользователей Linux](https://docs.f3cloud.com/ru/linux/linux-users.md).

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

Для скачивания и распаковки архива нужны пакеты `wget` и `bzip2`. В нашем образе они уже стояли, а команда ниже на случай, если у вас их нет.

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

Скачайте архив сервера. Адрес взят со страницы загрузок TeamSpeak, а если там уже вышла новая версия, замените 3.13.8 на неё в обоих местах.

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

Архив весит около 10 МБ. Распакуйте его в `/opt/teamspeak` и передайте файлы пользователю `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
```

Параметр `--strip-components=1` убирает из путей внешнюю папку архива, поэтому файл `ts3server` оказывается прямо в `/opt/teamspeak`. После распаковки там около 22 МБ.

***

## Шаг 2. Прочитайте лицензию и примите её

Сервер не запустится, пока вы явно не согласитесь с лицензией. Убедитесь в этом сами и запустите его вручную от имени `teamspeak`.

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

Сервер сразу завершится и объяснит, как принять лицензию.

<figure><img src="https://docs.f3cloud.com/img/teamspeak-license-error.png" alt="Сервер TeamSpeak отказывается запускаться и просит принять лицензию"><figcaption><p>Без согласия с лицензией сервер не стартует</p></figcaption></figure>

Прочитать лицензию можно прямо в терминале. Она длинная, листайте клавишей <kbd>Пробел</kbd>, а выйти можно клавишей <kbd>Q</kbd>.

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

Согласие с лицензией записывается пустым файлом `.ts3server_license_accepted` в рабочей папке сервера. TeamSpeak описывает ещё два способа, параметр `license_accepted=1` в командной строке и переменную `TS3SERVER_LICENSE=accept`, но файл удобнее, потому что остаётся на месте после обновлений.

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

***

## Шаг 3. Настройте автозапуск

Чтобы сервер работал в фоне, запускался вместе с VPS и поднимался после сбоя, оформим его как службу systemd. Как устроены службы, подробно рассказано в статье про [systemd](https://docs.f3cloud.com/ru/linux/systemd-services.md).

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

Вставьте в файл текст ниже, сохраните сочетанием <kbd>Ctrl</kbd> + <kbd>O</kbd>, затем <kbd>Enter</kbd>, а выйдите из редактора сочетанием <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
```

Параметр `WorkingDirectory` важен, ведь именно в рабочей папке сервер ищет файл с согласием на лицензию и хранит базу, файлы и журналы. Сервер работает в обычном режиме, а не в фоновом, поэтому всё, что он пишет на экран, systemd складывает в журнал. Включите автозапуск и запустите службу.

```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, служба active (running), процесс ts3server"><figcaption><p>Служба работает и включена в автозапуск</p></figcaption></figure>

На нашем сервере первый запуск вместе с созданием базы занял около секунды, а в простое служба заняла 16,9 МБ памяти по данным systemd. Мы проверили, что служба переживает сбой. Когда мы принудительно завершили процесс командой `kill -9`, systemd запустил сервер заново через 10 секунд.

Управлять сервером теперь нужно через systemd.

* `systemctl stop teamspeak` выключает сервер.
* `systemctl start teamspeak` включает его.
* `systemctl restart teamspeak` перезапускает.
* `journalctl -u teamspeak -f` показывает журнал в реальном времени, выйти можно сочетанием <kbd>Ctrl</kbd> + <kbd>C</kbd>. Подробнее о журналах рассказано в статье про [логи Linux](https://docs.f3cloud.com/ru/linux/linux-logs.md).

***

## Шаг 4. Найдите ключ привилегий и пароль ServerQuery

При первом запуске сервер напечатал два секрета. Поскольку сервер работает под systemd, они лежат в журнале службы. Выведем из него только нужные строки.

```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="Строки журнала с паролем ServerQuery, ключом API и ключом привилегий, значения скрыты"><figcaption><p>Пароль, ключ API и ключ привилегий (на снимке значения скрыты)</p></figcaption></figure>

В ответе четыре строки.

* В первой строке имя учётной записи `serveradmin` и её **пароль ServerQuery**.
* Во второй строке **ключ API** для управления сервером по HTTP, он пригодится только тем, кто пишет ботов и панели.
* В третьей и четвёртой строках один и тот же **ключ привилегий**, который понадобится в шаге 7. Сервер печатает его дважды, первый раз в строке журнала, второй раз в рамке.

Скопируйте эти значения в менеджер паролей. Ключ привилегий дополнительно записан в папке `logs` в файле журнала виртуального сервера, а вот пароль ServerQuery и ключ API в файлах журналов не попадают, их можно найти только в журнале systemd. Если журнал со временем очистится или вы потеряете значения раньше, ничего страшного, в разделе «Частые вопросы» ниже есть способ создать новый ключ и сбросить пароль.

> **Не отправляйте ключ и пароль никому.**
>
> Ключ привилегий даёт права администратора на сервере, а пароль ServerQuery даёт полное управление всеми серверами. Не показывайте их на скриншотах и не пересылайте в мессенджерах. Если ключ попал не в те руки до того, как вы им воспользовались, создайте новый, как описано в разделе «Частые вопросы».

***

## Шаг 5. Откройте порты в UFW

Если на VPS включён брандмауэр UFW, откройте порт голоса и порт передачи файлов. Эти два порта нужны всем, кто будет заходить на сервер. Подробнее о брандмауэре рассказано в статье про [UFW](https://docs.f3cloud.com/ru/vps/security/firewall.md).

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

Порт ServerQuery 10011 открывать всему интернету не стоит. Пароль в нём передаётся открытым текстом, а официальное руководство сервера называет этот вариант прежним по умолчанию и настоятельно советует более защищённые протоколы. Если вам нужен доступ к ServerQuery с домашнего компьютера, откройте порт только для своего адреса. Для проверки в шаге 6 мы сделали именно так, вместо `IP-вашего-компьютера` подставьте свой внешний адрес.

```bash
ufw allow from IP-вашего-компьютера to any port 10011 proto tcp
ufw status
```

<figure><img src="https://docs.f3cloud.com/img/teamspeak-ufw.png" alt="Команды ufw allow для портов 9987/udp, 30033/tcp и 10011/tcp только для одного адреса, затем ufw status"><figcaption><p>Голос и файлы открыты всем, ServerQuery только одному адресу</p></figcaption></figure>

Сам сервер слушает больше портов, чем мы открыли. Кроме голоса и передачи файлов он принимает подключения ServerQuery по трём вариантам, обычному на 10011, по SSH на 10022 и по HTTP на 10080, причём на всех адресах сразу. Проверить это можно командой `ss`.

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

<figure><img src="https://docs.f3cloud.com/img/teamspeak-ports.png" alt="Вывод ss, сервер слушает udp 9987 и tcp 30033, 10022, 10011, 10080"><figcaption><p>Порты, которые слушает сервер TeamSpeak</p></figcaption></figure>

Порты 10022 и 10080 в брандмауэре мы не открывали, и с другого компьютера они не отвечают. Так лучше всего и оставить.

***

## Шаг 6. Проверьте порты снаружи

Проверять порты нужно с другого компьютера. Если запустить проверку на самом сервере, она пройдёт даже при закрытом брандмауэре, потому что трафик идёт через внутренний интерфейс, который брандмауэр не ограничивает. Мы проверяли с компьютера под macOS, на Linux команды те же.

Сначала проверим порт передачи файлов. Он работает по TCP, поэтому достаточно утилиты `nc`.

```bash
nc -vz IP-адрес-сервера 30033
```

Ответ **succeeded** означает, что порт открыт и сервер отвечает.

С голосовым портом сложнее, потому что UDP не отвечает на простую проверку соединения. Мы написали короткий скрипт на Python, который отправляет первый пакет рукопожатия, с которого клиент начинает подключение, и ждёт ответа три секунды. Это не официальная утилита, мы сделали её сами, чтобы проверять порт без графического клиента. Создайте файл.

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

# Первый пакет рукопожатия TeamSpeak, как его отправляет клиент
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('Сервер ответил, порт доступен')
except socket.timeout:
    print('Ответа нет, порт закрыт или сервер не запущен')
```

Запустите его, указав адрес сервера и порт.

```bash
python3 ts3-udp-check.py IP-адрес-сервера 9987
```

Наконец, проверим ServerQuery. Подключитесь к порту 10011, сервер приветствует вас строкой `TS3`. Затем введите команды по одной. Вместо `ПАРОЛЬ` подставьте пароль ServerQuery из шага 4.

```bash
nc IP-адрес-сервера 10011
```

```text
login serveradmin ПАРОЛЬ
version
quit
```

<figure><img src="https://docs.f3cloud.com/img/teamspeak-check-outside.png" alt="Проверка снаружи, nc к порту 30033, ответ скрипта для порта 9987 и вход в ServerQuery с командой version"><figcaption><p>Все три порта отвечают, сервер сообщает версию 3.13.8</p></figcaption></figure>

Ответ `error id=0 msg=ok` на команду `login` означает, что пароль принят, а в ответ на `version` сервер называет свою версию и платформу. На нашем сервере до команд `ufw allow` скрипт молчал и сообщал об отсутствии ответа, а после них ответ приходил примерно за 60 миллисекунд.

После проверки уберите правило для ServerQuery, если оно вам больше не нужно.

```bash
ufw delete allow from IP-вашего-компьютера to any port 10011 proto tcp
```

***

## Шаг 7. Подключитесь клиентом и станьте администратором

Дальше шаги описаны по официальной справке TeamSpeak 3, потому что графический клиент мы на тестовом сервере не запускали. Названия пунктов меню взяты оттуда.

1. Установите клиент TeamSpeak 3 и запустите его.
2. В меню **Connections** выберите **Connect**.
3. В поле адреса введите IP-адрес сервера. Если сервер работает на порту 9987, порт указывать не нужно, а для другого порта используйте запись `IP:ПОРТ`.
4. Введите ник, под которым вас будут видеть другие. Поле пароля сервера оставьте пустым, пока вы его не задали.
5. Нажмите кнопку подключения.

Вы попадёте на сервер как обычный пользователь без прав администратора. Чтобы получить их, в меню **Permissions** выберите **Use Token** и вставьте ключ привилегий из шага 4. Если всё получилось, рядом с вашим ником появится значок **SA**. Ключ одноразовый, поэтому после успешного ввода он перестанет работать. Чтобы выдать права ещё кому-нибудь, откройте в меню **Permissions** пункт **Token Manager**, нажмите **Add Token**, выберите тип **Server Group** и группу **Server Admin**, а затем нажмите **Create**. В приложении для iOS пункт для ввода ключа называется **Use Privilege Key**.

Теперь можно настроить сервер. Щёлкните правой кнопкой мыши по имени сервера над верхним каналом и выберите **Edit Virtual Server**. Среди прочего там задаётся общий пароль сервера. Он нужен, если вы не хотите, чтобы на сервер заходил любой, кто узнает адрес. Ссылку для друзей можно оформить в виде `ts3server://IP-адрес-сервера?port=9987`, по клику на неё клиент сам подключится к серверу. Вместо IP-адреса удобно использовать домен, как это сделать, описано в статье про [привязку домена](https://docs.f3cloud.com/ru/vps/domain-to-vps.md).

> **Клиент TeamSpeak 6 тоже подойдёт.**
>
> По справке TeamSpeak, клиент шестой версии может подключаться к серверу TeamSpeak 3, но получит только возможности третьей версии. Клиент TeamSpeak 6 на странице загрузок тоже пока бета, и при первом запуске он просит создать аккаунт myTeamSpeak.

***

## Резервные копии

Всё, что TeamSpeak хранит, лежит внутри `/opt/teamspeak`. По официальной справке для переноса сервера на другую машину нужны следующие файлы.

* `ts3server.sqlitedb` содержит базу со всеми каналами, группами, правами и пользователями, и это самый важный файл.
* Папка `files` хранит загруженные файлы, иконки и аватары.
* `query_ip_allowlist.txt` и `query_ip_denylist.txt` содержат списки адресов для ServerQuery. В справке они названы `whitelist` и `blacklist`, в версии 3.13.8 файлы называются именно так, как мы написали.
* `licensekey.dat` есть только у тех, кто купил лицензию.
* `ssh_host_rsa_key` хранит ключ SSH-варианта ServerQuery, его мы добавили сами, чтобы после восстановления ключ сервера не менялся.

Простое копирование `ts3server.sqlitedb` на работающем сервере ненадёжно. SQLite пишет изменения сначала в соседний журнальный файл и переносит их в основной файл не сразу. Мы проверили это на нашем сервере. После создания двух каналов копия одного основного файла содержала только один канал вместо трёх, а копия средствами самой SQLite сохранила все три. Поэтому используем утилиту `sqlite3` с командой `.backup`, которая делает согласованную копию без остановки сервера.

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

Скрипт сохраняет базу и файлы в архив в папке `/opt/teamspeak/backups` и хранит 7 последних архивов.

```bash
#!/bin/sh
# Копия базы и файлов TeamSpeak без остановки сервера, хранит 7 последних архивов
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 --
```

Сделайте скрипт исполняемым, запустите его вручную и добавьте в расписание пользователя `teamspeak`, например каждую ночь в 4:00.

```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="Запуск backup.sh, список архивов в папке backups и содержимое последнего архива"><figcaption><p>В архиве база, список адресов и ключ SSH, а также папка files</p></figcaption></figure>

Мы проверили скрипт и вручную, и по расписанию, оба раза архив появился. Подробнее о расписании рассказано в статье про [cron](https://docs.f3cloud.com/ru/linux/cron-linux.md). Копии на этом же сервере не спасут, если пропадёт сам сервер, поэтому время от времени скачивайте архивы к себе или отправляйте их на другой сервер, например командой [rsync](https://docs.f3cloud.com/ru/linux/rsync-linux.md).

Чтобы восстановить сервер из копии, остановите службу, удалите текущие базу и файлы, распакуйте нужный архив и запустите службу снова. Вместо имени архива в примере подставьте своё.

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

Мы проверили восстановление на нашем сервере. После него вернулись название сервера, оба канала, прежний пароль ServerQuery и прежний ключ привилегий. Команда `rm` заодно удаляет временные файлы базы с окончаниями `-wal` и `-shm`, чтобы сервер начал работу с чистого состояния.

> **Сервер без базы стартует как новый.**
>
> Если запустить сервер без файла `ts3server.sqlitedb`, он создаст пустую базу и выдаст новые пароль ServerQuery и ключ привилегий. Мы убедились в этом, временно убрав базу, и затем вернули данные из копии. Поэтому не удаляйте базу, не имея свежего архива.

***

## Обновление сервера

Сервер обновляется заменой файлов. В документации к серверу TeamSpeak сказано просто скопировать новые файлы поверх старых. База и настройки при этом не затрагиваются, потому что в архиве их нет. Мы повторили этот порядок на нашем сервере. Новее версии 3.13.8 на тот момент не было, поэтому мы распаковали ту же версию поверх установленной. Каналы, ключи и настройки остались на месте, а в журнале после запуска снова появилась строка с версией. Перед обновлением сервер останавливается и делается резервная копия скриптом из предыдущего раздела.

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

cd /root
wget https://files.teamspeak-services.com/releases/server/НОВАЯ-ВЕРСИЯ/teamspeak3-server_linux_amd64-НОВАЯ-ВЕРСИЯ.tar.bz2
tar -xjf teamspeak3-server_linux_amd64-НОВАЯ-ВЕРСИЯ.tar.bz2 -C /opt/teamspeak --strip-components=1
chown -R teamspeak:teamspeak /opt/teamspeak

systemctl start teamspeak
```

Последняя команда `chown` обязательна. Мы распаковывали архив от имени `root`, и после распаковки файл `ts3server` принадлежал `root`. Проверить версию после запуска можно по журналу.

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

Список изменений каждой версии лежит в файле `/opt/teamspeak/CHANGELOG`.

***

## TeamSpeak 6 как бета-версия сервера в Docker

Если вы хотите попробовать новое поколение, TeamSpeak рекомендует для TeamSpeak 6 Server установку через Docker. Как поставить сам Docker, рассказано в статье про [установку Docker](https://docs.f3cloud.com/ru/docker/docker-installation.md). Мы проверили сборку **6.0.0-beta13.1**. Образ занимает около 60 МБ, а контейнер в простое занял около 20 МБ памяти. Набор портов у шестой версии почти прежний. Голос идёт на **9987/udp**, передача файлов на **30033/tcp**, а ServerQuery по умолчанию не включён. Мы проверили это снаружи, на порт 10011 приходит отказ в соединении. Включить его можно параметрами сервера, по документации ему отведены порты 10022 для SSH и 10080 для HTTP.

Запустите команду из официального README сервера. Мы добавили к ней `--restart unless-stopped`, чтобы контейнер поднимался после перезагрузки VPS. Согласие с лицензией здесь задаётся переменной `TSSERVER_LICENSE_ACCEPTED=accept`, а данные хранятся в томе `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="Запуск контейнера teamspeak-server с образом teamspeaksystems/teamspeak6-server"><figcaption><p>Контейнер TeamSpeak 6 запущен</p></figcaption></figure>

Ключ привилегий и пароль ServerQuery сервер печатает при первом запуске так же, как и третья версия, только искать их нужно в журнале контейнера.

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

<figure><img src="https://docs.f3cloud.com/img/teamspeak6-credentials.png" alt="Строки журнала контейнера с паролем ServerQuery, ключом API и ключом привилегий, значения скрыты"><figcaption><p>Ключ и пароль в журнале контейнера (на снимке значения скрыты)</p></figcaption></figure>

Обновляется контейнер заменой образа. Мы проверили порядок, после него данные остались в томе, а новый ключ и пароль не создавались.

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

После этого повторите команду `docker run` из этого раздела. Если вы меняете порт передачи файлов, добавьте переменную `TSSERVER_FILE_TRANSFER_PORT` с тем же номером и опубликуйте тот же номер порта на хосте, потому что клиенты подключаются к этому порту напрямую. Мы проверили это на порту 30034.

> **Docker открывает порты в обход UFW.**
>
> Порты, опубликованные через `-p`, Docker открывает сам, и правила UFW на них не действуют. Мы запустили контейнер на портах 9988 и 30034 без единого правила в UFW, и с другого компьютера оба порта ответили. Публикуйте только те порты, которые должны быть открыты всем.

> **Что нужно знать о бете.**
>
> В README сервера сказано, что это бета и некоторые функции ещё не готовы. Встроенная лицензия на 32 места продлевается новыми сборками, в нашей сборке она действует до 1 декабря 2026 года, так что сервер придётся обновлять. Лицензии TeamSpeak 3 к нему не подходят, а переноса данных между версиями нет. Если третья и шестая версии стоят на одном сервере, им нужны разные порты.

***

## Частые вопросы

<details>

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

Сервер не нашёл согласия с лицензией и завершился. Мы получили это сообщение при первом ручном запуске. Создайте пустой файл `.ts3server_license_accepted` в рабочей папке сервера, как показано в шаге 2, и убедитесь, что в службе systemd указан `WorkingDirectory=/opt/teamspeak`, ведь файл ищется именно в рабочей папке.

</details>

<details>

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

Без лицензионного ключа TeamSpeak разрешает запустить на одной машине только один сервер. Мы получили эту строку, когда запустили вторую копию, пока работала служба, и вторая копия сразу остановилась. Чаще всего это значит, что вы запускаете сервер вручную, а служба systemd уже работает. Остановите лишнюю копию или управляйте сервером только через `systemctl`.

</details>

<details>

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

Пароль ServerQuery не подошёл. Символы `\s` в ответе означают пробел, так ServerQuery записывает пробелы. Возьмите пароль из журнала, как в шаге 4. Если пароль потерян, его можно сбросить. Остановите службу и один раз запустите сервер вручную с параметром `serveradmin_password`, а когда он выведет строки о запуске, остановите его сочетанием <kbd>Ctrl</kbd> + <kbd>C</kbd> и снова запустите службу.

```bash
systemctl stop teamspeak
cd /opt/teamspeak
runuser -u teamspeak -- ./ts3server serveradmin_password=НОВЫЙ-ПАРОЛЬ
systemctl start teamspeak
```

Мы проверили этот способ, после него прежний пароль перестал подходить, а новый заработал. Учтите, что пароль останется в истории команд, поэтому справка TeamSpeak советует после входа выполнить команду `clientsetserverquerylogin client_login_name=serveradmin`. Сервер выведет новый пароль, и его уже не будет в истории.

</details>

<details>

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

Сработала защита ServerQuery от подбора пароля. Мы получили этот ответ после трёх неверных паролей подряд, адрес был заблокирован на 600 секунд. Подождите это время или перезапустите службу командой `systemctl restart teamspeak`, мы проверили, что перезапуск снимает блокировку. Адреса из файла `query_ip_allowlist.txt` защита не трогает, в нём по умолчанию записаны `127.0.0.1` и `::1`. Добавление адреса в этот файл действует сразу, но уже наложенную блокировку не снимает, для этого нужен перезапуск.

</details>

<details>

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

Клиент не получил ответа от сервера. Справка TeamSpeak называет частые причины, это неверный адрес или порт, незапущенный сервер и брандмауэр, который режет трафик. Проверьте по порядку.

1. Служба работает, `systemctl status teamspeak` показывает active (running).
2. Порт **9987/udp** открыт, `ufw status` содержит правило для него.
3. Проверка из шага 6 отвечает. Когда мы нарочно убрали правило для 9987/udp, скрипт сообщил, что ответа нет, а после команды `ufw allow 9987/udp` ответ вернулся.
4. Если сервер работает не на порту 9987, адрес в клиенте нужно писать в виде `IP:ПОРТ`.

</details>

<details>

<summary>Потерян ключ привилегий или он уже использован</summary>

Новый ключ создаётся командой ServerQuery. Зайдите в консоль прямо на сервере, адрес `127.0.0.1` защита от подбора пароля не блокирует, и порт в брандмауэре открывать не нужно.

```bash
nc 127.0.0.1 10011
```

Введите по очереди три команды, вместо `ПАРОЛЬ` подставьте пароль ServerQuery.

```text
login serveradmin ПАРОЛЬ
use 1
servergrouplist
```

В списке групп найдите строку `name=Server\sAdmin` с признаком `type=1`. У строки с `type=0` другое назначение, это шаблон для будущих серверов. На нашем сервере нужная группа имела номер 6. Подставьте свой номер в следующую команду.

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

Сервер ответит строкой `token=…`, это и есть новый ключ. Мы проверили команду, ключ создался и появился в списке команды `privilegekeylist`. Выйти из консоли можно командой `quit`.

</details>

<details>

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

Это не ошибка, а предупреждение о том, что сервер работает без купленной лицензии. В журнале рядом видно, что лицензия называется **No License**, допускает один виртуальный сервер и 32 слота. Для личного сервера этого достаточно.

</details>

<details>

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

Так ведёт себя контейнер TeamSpeak 6, если запустить его без переменной с согласием на лицензию, мы получили это сообщение именно так. Добавьте в команду `docker run` параметр `-e TSSERVER_LICENSE_ACCEPTED=accept`.

</details>

***

## Наши ресурсы

**Telegram-канал:** [https://t.me/f3cloud_news](https://t.me/f3cloud_news)\
**Официальный сайт:** [https://f3cloud.com](https://f3cloud.com/ru)
