Эта инструкция проведёт от пустого VDS до работающего голосового сервера, который переживает перезагрузки, закрыт фаерволом, регулярно бэкапится и доступен по доменному имени, а не по IP. Команды ниже проверены на Ubuntu 24.04; для нового VDS уже можно выбрать Ubuntu 26.04. Разбор того, нужно ли обновляться с Ubuntu 24.04 на 26.04 и как безопаснее перенести рабочий TeamSpeak, вынесен в отдельную статью. Если пока выбираете способ запуска, начните с обзора вариантов создания сервера TeamSpeak. Предпочитаете контейнеры — есть та же установка через Docker.
Что понадобится:
- VDS с Ubuntu 24.04 и публичным IPv4-адресом. Root-доступ по SSH.
- 15–30 минут времени.
- Для последнего шага — домен (любой, хоть за 200 рублей в зоне
.ru).
Требования к железу. Официальных цифр «столько-то слотов — столько-то ядер» TeamSpeak не публикует, поэтому ниже — ориентиры из практики, помеченные как оценка. Сервер TeamSpeak 3 — один из самых лёгких серверных процессов вообще: он не микширует звук (каждый клиент получает потоки говорящих как есть), поэтому нагрузка на CPU минимальна.
| Слотов | vCPU | RAM | Канал | Комментарий |
|---|---|---|---|---|
| до 32 (бесплатная лицензия) | 1 | 1 ГБ | 10 Мбит/с | Самый дешёвый тариф любого хостера. Оценка |
| до 128 | 1 | 1–2 ГБ | 50 Мбит/с | Узкое место — канал, не CPU. Оценка |
| 256+ | 2 | 2 ГБ | 100 Мбит/с | Оценка |
Сам процесс ts3server в простое занимает несколько десятков мегабайт памяти; 1 ГБ RAM нужен скорее операционной системе, чем TeamSpeak. Трафик считается так: поток одного говорящего — примерно 30–70 Кбит/с в зависимости от настроек кодека Opus, и сервер отправляет его каждому слушателю в канале отдельно. Даже канал на 30 человек, где говорят двое, — это порядка 4 Мбит/с исходящего. Единственный параметр VDS, который реально влияет на качество связи, — задержка до участников: выбирайте дата-центр в том регионе, где живёт большинство.
Ставить будем TeamSpeak 3 Server 3.13.8 — актуальную стабильную версию. TeamSpeak 6 Server существует, но на данный момент имеет статус beta, и для боевого сервера сообщество он пока не рекомендуется — вернётесь к нему, когда выйдет стабильный релиз.
Подключаемся к серверу и обновляем систему
Подключитесь к VDS по SSH (адрес и пароль root выдаёт хостер после создания сервера):
ssh root@203.0.113.10
Первым делом обновите систему — свежесозданный VDS почти всегда отстаёт от репозиториев:
apt update && apt upgrade -y
Если ядро обновилось, перезагрузитесь (reboot) и подключитесь заново. Больше из пакетов ничего не нужно: сервер TeamSpeak — статически собранный бинарник, он не тянет зависимостей. Единственное, что пригодится дальше, — bzip2 для распаковки архива (в Ubuntu 24.04 он обычно уже есть):
apt install -y bzip2
Создаём отдельного пользователя для TeamSpeak
Запускать голосовой сервер от root нельзя: любая уязвимость в сервисе, торчащем в интернет, при работе от root означает полный захват машины. Создаём системного пользователя без пароля и без права логина по SSH — под ним будет жить только TeamSpeak:
adduser --system --group --home /opt/teamspeak --shell /usr/sbin/nologin teamspeak
Разбор флагов: --system — служебный аккаунт с UID из системного диапазона; --group — одноимённая группа; --home /opt/teamspeak — каталог, где будет лежать сервер; --shell /usr/sbin/nologin — интерактивный вход под этим пользователем невозможен в принципе, даже если кто-то узнает пароль (которого нет).
Когда дальше понадобится выполнить команду от имени этого пользователя, используем sudo -u teamspeak.
Скачиваем сервер и проверяем контрольную сумму
Скачиваем официальный архив в домашний каталог пользователя:
cd /opt/teamspeak
wget https://files.teamspeak-services.com/releases/server/3.13.8/teamspeak3-server_linux_amd64-3.13.8.tar.bz2
Теперь — шаг, который обычно пропускают в интернете: проверка контрольной суммы. Она гарантирует, что архив скачался целиком и что это именно тот файл, который опубликовал TeamSpeak, а не подменённый по дороге или битый. Вы собираетесь запустить этот код на своём сервере с доступом в интернет — минута на проверку того стоит.
Эталонную сумму TeamSpeak публикует машиночитаемо в файле https://teamspeak.com/versions/server.json — там же видно, не вышла ли версия новее. Для 3.13.8 (сверено 07.08.2026) сумма такая:
echo "a3c4658e09892d3dbd8ea752d0de42dc7d111bf44d09721927f0f4782496eb2d teamspeak3-server_linux_amd64-3.13.8.tar.bz2" | sha256sum -c
Ожидаемый вывод:
teamspeak3-server_linux_amd64-3.13.8.tar.bz2: OK
Если вместо OK вы видите FAILED — не распаковывайте архив. Удалите его и скачайте заново; если не помогло — сверьтесь с актуальным server.json: возможно, вышла новая версия и вы смотрите на устаревшую сумму. Проверить текущую версию и сумму прямо с сервера можно так:
curl -s https://teamspeak.com/versions/server.json | python3 -m json.tool
Если там указана версия новее 3.13.8 — просто подставьте её номер в ссылку и в команду проверки, схема ссылок у TeamSpeak стабильная.
Распаковываем и наводим порядок с правами:
tar xjf teamspeak3-server_linux_amd64-3.13.8.tar.bz2
chown -R teamspeak:teamspeak /opt/teamspeak
Сервер окажется в /opt/teamspeak/teamspeak3-server_linux_amd64/. Архив после распаковки можно удалить.
Принимаем лицензию и запускаем сервер в первый раз
Начиная с версии 3.1.0 сервер не стартует, пока вы явно не примете лицензионное соглашение. Прочитать его можно в файле LICENSE в каталоге сервера. Принять — создав файл-маркер:
sudo -u teamspeak touch /opt/teamspeak/teamspeak3-server_linux_amd64/.ts3server_license_accepted
(Альтернативы — переменная окружения TS3SERVER_LICENSE=accept или параметр запуска license_accepted=1; результат одинаковый.)
Первый запуск делаем вручную, потому что именно при нём сервер создаёт базу данных и один-единственный раз печатает учётные данные администратора:
cd /opt/teamspeak/teamspeak3-server_linux_amd64
sudo -u teamspeak ./ts3server_startscript.sh start createinifile=1
Параметр createinifile=1 заодно создаст файл конфигурации ts3server.ini — он понадобится на шаге с фаерволом.
Через пару секунд в консоли появится блок такого вида:
------------------------------------------------------------------
I M P O R T A N T
------------------------------------------------------------------
Server Query Admin Account created
loginname= "serveradmin", password= "xXxXxXxX"
apikey= "BAA..."
------------------------------------------------------------------
------------------------------------------------------------------
I M P O R T A N T
------------------------------------------------------------------
ServerAdmin privilege key created, please use it to gain
serveradmin rights for your virtualserver. please
also check the doc/privilegekey_guide.txt for details.
token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
------------------------------------------------------------------
Сохраните обе строки в надёжное место — пароль serveradmin и token (privilege key). Пароль даёт полный административный доступ к серверу через ServerQuery, ключ — права администратора первому, кто введёт его в клиенте. Повторно сервер их не покажет.
Если консоль уже закрыли — не страшно: и токен, и запись о создании аккаунта serveradmin попадают в лог первого запуска. Найти токен можно так:
grep -r "token=" /opt/teamspeak/teamspeak3-server_linux_amd64/logs/
А если и лог утерян, и ключ использован — в конце статьи есть отдельный раздел о восстановлении доступа.
Теперь остановим сервер — дальше он будет запускаться правильно, через systemd:
sudo -u teamspeak ./ts3server_startscript.sh stop
Настраиваем автозапуск через systemd
Запуск через стартовый скрипт руками — временное решение: после перезагрузки VDS сервер сам не поднимется, а после падения процесса никто его не перезапустит. Постоянное решение — юнит systemd.
Создайте файл /etc/systemd/system/ts3server.service:
[Unit]
Description=TeamSpeak 3 Server
After=network-online.target
Wants=network-online.target
[Service]
Type=forking
User=teamspeak
Group=teamspeak
WorkingDirectory=/opt/teamspeak/teamspeak3-server_linux_amd64
ExecStart=/opt/teamspeak/teamspeak3-server_linux_amd64/ts3server_startscript.sh start
ExecStop=/opt/teamspeak/teamspeak3-server_linux_amd64/ts3server_startscript.sh stop
PIDFile=/opt/teamspeak/teamspeak3-server_linux_amd64/ts3server.pid
Restart=on-failure
RestartSec=15
[Install]
WantedBy=multi-user.target
Почему юнит устроен именно так:
Type=forking— стартовый скрипт TeamSpeak не остаётся на переднем плане: он запускает бинарникts3serverв фоне (демоном) и завершается. Systemd должен знать, что «главный» процесс — не скрипт, а его потомок, иначе он решит, что сервис умер сразу после старта.PIDFile=— приType=forkingsystemd нужно знать PID настоящего серверного процесса, чтобы следить за ним и корректно останавливать. Стартовый скрипт записывает его вts3server.pidв рабочем каталоге — указываем этот файл.User=иGroup=— сервер работает от бесправного пользователяteamspeak, а не от root; это весь смысл второго шага.WorkingDirectory=— скрипт ищет бинарник, базу и логи относительно текущего каталога, поэтому каталог задаём явно.Restart=on-failureиRestartSec=15— если процесс упал, systemd подождёт 15 секунд и поднимет его снова. Пауза нужна, чтобы при систематической ошибке (например, битой базе) сервис не молотил рестартами по кругу без передышки.After=network-online.target— при загрузке VDS сервер стартует после того, как поднялась сеть: ему нужно сразу привязаться к внешнему адресу и достучаться до сервера учёта лицензий.
Включаем и запускаем:
systemctl daemon-reload
systemctl enable --now ts3server
Проверяем:
systemctl status ts3server
В выводе должно быть Active: active (running), а в строке Main PID — процесс ts3server. Свежие сообщения сервиса смотрят так:
journalctl -u ts3server -n 50 --no-pager
Учтите, что содержательные логи TeamSpeak пишет не в journal, а в свои файлы в каталоге logs/ — туда стоит заглядывать при разборе проблем самого сервера, а journalctl покажет проблемы запуска и остановки сервиса.
Финальная проверка автозапуска — честная, перезагрузкой:
reboot
После перезагрузки подключитесь по SSH и убедитесь, что systemctl status ts3server снова показывает active (running).
Открываем нужные порты и закрываем лишние
Сервер использует три порта, и относиться к ним нужно по-разному:
| Порт | Протокол | Назначение | Наружу |
|---|---|---|---|
| 9987 | UDP | Голос, весь клиентский трафик | Открыть |
| 30033 | TCP | Передача файлов, аватарки, иконки | Открыть |
| 10011 | TCP | ServerQuery — административный интерфейс | Не открывать |
Про 10011 — подробнее, потому что это самая опасная ошибка в настройке TeamSpeak. ServerQuery — это полный административный доступ: залогинившись на этот порт, можно раздавать права, банить, удалять каналы и создавать виртуальные серверы. Протокол при этом текстовый и нешифрованный — логин и пароль летят по сети открытым текстом. Открытый в интернет 10011 круглосуточно сканируют боты и подбирают к нему пароли. Наружу он не нужен никогда: администрировать сервер можно с самой машины или через SSH-туннель (покажу ниже).
Настраиваем ufw. Внимательно с первой командой: сначала разрешаем SSH, иначе включение фаервола оборвёт вашу собственную сессию и вы потеряете доступ к серверу:
ufw allow OpenSSH
ufw allow 9987/udp comment 'TeamSpeak voice'
ufw allow 30033/tcp comment 'TeamSpeak file transfer'
ufw enable
На вопрос про disruption отвечайте y. Проверяем:
ufw status verbose
Политика по умолчанию у ufw — deny (incoming), поэтому 10011 и всё остальное, что мы явно не разрешили, снаружи уже закрыто. Для надёжности дополнительно привяжем ServerQuery к localhost на уровне самого TeamSpeak — тогда он не будет слушать внешний адрес, даже если фаервол однажды переконфигурируют. В файле /opt/teamspeak/teamspeak3-server_linux_amd64/ts3server.ini задайте:
query_ip=127.0.0.1
И перезапустите сервис: systemctl restart ts3server.
Как теперь попасть в ServerQuery со своего компьютера, если порт закрыт? Через SSH-туннель — штатный и безопасный способ:
ssh -L 10011:127.0.0.1:10011 root@203.0.113.10
Пока эта SSH-сессия открыта, порт 10011 вашего собственного компьютера проброшен на localhost сервера. Подключайтесь любым telnet-клиентом к 127.0.0.1:10011 — как будто сидите на самом сервере, но весь трафик идёт внутри шифрованного SSH-канала.
Ещё две вещи, которые стоит знать.
Первая: сервер сам устанавливает исходящее соединение к инфраструктуре TeamSpeak, чтобы проверить лицензию, и блокировать его нельзя. Здесь легко ошибиться, потому что старые инструкции называют порт 2008/TCP — он относился к ветке сервера 3.0. Начиная с 3.1 сервер ходит на accounting2.teamspeak.com по обычному 443/TCP, а мы ставим 3.13. На практике делать ничего не нужно: ufw исходящие соединения по умолчанию не трогает. Но если на сервере своя политика исходящего трафика, разрешать надо 443, а не 2008. Подробнее — в справочнике по портам.
Вторая: файл query_ip_allowlist.txt в каталоге сервера должен содержать только 127.0.0.1 и действительно доверенные адреса — попавшие в него IP не ограничиваются защитой от флуда.
Подключаемся клиентом и активируем права администратора
Сервер работает — пора зайти. В клиенте TeamSpeak: Connections → Connect, в поле адреса — IP вашего VDS (203.0.113.10), никнейм — любой, пароль сервера пустой (мы его не ставили). Нажимайте Connect — вы должны оказаться в лобби своего сервера.
Сейчас вы обычный гость. Чтобы стать администратором, введите privilege key, сохранённый при первом запуске: меню Permissions → Use Privilege Key, вставьте токен, OK. Клиент подтвердит активацию, и рядом с вашим ником появится иконка группы Server Admin. Ключ одноразовый: он выдал права вашей идентификации (криптографической паре ключей в клиенте) и больше не сработает.
Дальше всё администрирование — правым кликом по серверу/каналам или через Permissions → Server Groups: назовите сервер, задайте пароль на вход, если он не публичный, создайте каналы, раздайте группы соратникам. Новые privilege key для других админов создаются в меню Permissions → Privilege Keys — токены больше не придётся добывать из консоли.
Берегите свою идентификацию: в клиенте это Tools → Identities, оттуда её можно экспортировать в файл. Переустановите систему, не сохранив идентификацию, — и админом на сервере станет некому быть. На этот случай — следующий раздел.
Восстанавливаем доступ администратора, если ключ потерян
Privilege key использован или утерян, идентификация с правами админа пропала вместе с переустановленной системой. Сервер работает, но управлять им некому — развёрнутый разбор всех путей в отдельной статье, здесь короткий.
Решение — сгенерировать новый privilege key через ServerQuery. Понадобится пароль serveradmin из первого запуска.
Подключаемся к серверу по SSH с туннелем (см. предыдущий шаг) и открываем сессию ServerQuery. Прямо на VDS это делается так:
telnet 127.0.0.1 10011
(Если telnet не установлен: apt install telnet. Подойдёт и nc 127.0.0.1 10011.)
Сервер поздоровается строкой TS3. Дальше — команды по одной, каждая завершается Enter; на успех сервер отвечает error id=0 msg=ok:
login serveradmin ВАШ_ПАРОЛЬ
use port=9987
servergrouplist
Команда use port=9987 выбирает виртуальный сервер, который слушает голосовой порт 9987 (у вас он один). servergrouplist выведет список групп — найдите в нём группу Server Admin и запомните её sgid (в свежей установке это обычно 6, но проверьте по факту). Теперь создаём ключ:
privilegekeyadd tokentype=0 tokenid1=6 tokenid2=0
Здесь tokentype=0 означает ключ для серверной группы, tokenid1 — номер группы Server Admin из предыдущего шага, tokenid2=0 для серверных групп обязателен. В ответ придёт строка вида:
token=AbCdEfGh1jKlMnOpQrStUvWxYz+123456789ABCDEF
error id=0 msg=ok
Это и есть новый privilege key. Завершите сессию командой quit, откройте клиент TeamSpeak и активируйте ключ через Permissions → Use Privilege Key — права администратора вернулись.
Если утерян и сам пароль serveradmin — он сбрасывается параметром запуска. Остановите сервис, запустите сервер один раз вручную с новым паролем, затем верните всё как было:
systemctl stop ts3server
cd /opt/teamspeak/teamspeak3-server_linux_amd64
sudo -u teamspeak ./ts3server_startscript.sh start serveradmin_password=НовыйНадёжныйПароль
sudo -u teamspeak ./ts3server_startscript.sh stop
systemctl start ts3server
Настраиваем регулярный бэкап
VDS — не вечное хранилище: диск может отказать, хостер — заблокировать аккаунт, а рука — дрогнуть на команде rm. Вся жизнь вашего сервера лежит в нескольких файлах, и копировать нужно именно их:
| Что | Зачем |
|---|---|
ts3server.sqlitedb | Главный файл: серверы, каналы, группы, права, идентификации, баны |
files/ (каталог целиком) | Загруженные файлы, аватарки, иконки |
ts3server.ini | Параметры запуска и конфигурация |
query_ip_allowlist.txt, query_ip_denylist.txt | Списки доступа к ServerQuery |
licensekey.dat | Только если у вас платная лицензия; при бесплатной этого файла нет |
Важная деталь, которую пропускают: базу SQLite нельзя просто копировать на работающем сервере — в момент записи вы рискуете получить в бэкапе несогласованный файл, который потом не откроется. Правильный порядок: остановить сервис, скопировать, запустить. Простой сервера — секунды, ночью его никто не заметит.
Создайте скрипт /opt/teamspeak/backup.sh:
#!/bin/bash
set -euo pipefail
TS_DIR=/opt/teamspeak/teamspeak3-server_linux_amd64
BACKUP_DIR=/var/backups/teamspeak
KEEP_DAYS=14
STAMP=$(date +%F_%H-%M)
mkdir -p "$BACKUP_DIR"
systemctl stop ts3server
tar czf "$BACKUP_DIR/ts3-$STAMP.tar.gz" \
-C "$TS_DIR" \
--ignore-failed-read \
ts3server.sqlitedb files ts3server.ini \
query_ip_allowlist.txt query_ip_denylist.txt licensekey.dat
systemctl start ts3server
# удалить архивы старше KEEP_DAYS дней
find "$BACKUP_DIR" -name 'ts3-*.tar.gz' -mtime +"$KEEP_DAYS" -delete
echo "OK: $BACKUP_DIR/ts3-$STAMP.tar.gz"
Флаг --ignore-failed-read нужен, чтобы отсутствие необязательных файлов (например, licensekey.dat на бесплатной лицензии) не срывало бэкап. Делаем скрипт исполняемым и прогоняем вручную:
chmod +x /opt/teamspeak/backup.sh
/opt/teamspeak/backup.sh
Ставим в cron — каждую ночь в 04:30, когда на сервере пусто:
crontab -e
30 4 * * * /opt/teamspeak/backup.sh >> /var/log/ts3-backup.log 2>&1
Бэкап на том же диске, что и сервер, защищает от кривой команды, но не от смерти VDS. Раз в неделю забирайте архив на другую машину — хотя бы вручную со своего компьютера:
scp root@203.0.113.10:/var/backups/teamspeak/ts3-*.tar.gz ~/backups/
И главное правило: бэкап, который ни разу не восстанавливали, — это не бэкап, а лотерейный билет. Проверка восстановления занимает пять минут и делается прямо на этом же VDS: распакуйте свежий архив в отдельный каталог, запустите из него второй экземпляр сервера на других портах и убедитесь, что он поднимается с вашими каналами и правами:
mkdir /tmp/ts3-restore-test && cd /tmp/ts3-restore-test
cp -r /opt/teamspeak/teamspeak3-server_linux_amd64/. .
rm -f ts3server.sqlitedb && rm -rf files
tar xzf "$(ls -t /var/backups/teamspeak/ts3-*.tar.gz | head -1)"
TS3SERVER_LICENSE=accept ./ts3server_minimal_runscript.sh \
default_voice_port=9999 filetransfer_port=30034 query_port=10012
Если в консоли пошли обычные стартовые сообщения без ошибок про базу — бэкап рабочий. Остановите тестовый экземпляр (Ctrl+C) и удалите каталог /tmp/ts3-restore-test. Реальное восстановление на новом VDS делается так же: установить сервер той же или более новой версии по этой инструкции до шага с systemd, распаковать архив бэкапа поверх, запустить. Это одновременно и процедура переезда на другой хостинг.
Привязываем домен вместо IP-адреса
«Заходите на 203.0.113.10» звучит несолидно, не запоминается и намертво привязывает вас к текущему хостеру: переедете — придётся оповещать каждого участника. Домен решает всё это раз и навсегда: адрес сервера становится ts.example.com, а куда он указывает — ваше внутреннее дело.
Понадобятся две DNS-записи в панели управления доменом.
Первая — A-запись, связывающая имя с IP сервера:
ts.example.com. 3600 IN A 203.0.113.10
В панели хостера это обычно выглядит как: тип A, имя (или «хост») — ts, значение — 203.0.113.10. Уже этого достаточно, чтобы подключаться по ts.example.com, — пока сервер работает на стандартном порту 9987.
Вторая — SRV-запись. Она сообщает клиенту и адрес, и порт. С ней сервер может жить на любом порту, а участники по-прежнему вводят просто ts.example.com — без всяких :9988. Клиент TeamSpeak сам запрашивает SRV-запись при подключении. Официальный формат для TeamSpeak 3 — сервис _ts3, протокол _udp:
_ts3._udp.ts.example.com. 86400 IN SRV 0 5 9987 ts.example.com.
Разбор полей: 0 — приоритет (меньше — важнее, актуально при нескольких записях), 5 — вес для балансировки между записями с равным приоритетом, 9987 — порт вашего сервера, последнее поле — имя из A-записи, на конце обязательна точка. В панели хостера поля обычно разнесены: сервис _ts3, протокол _udp, имя ts (или _ts3._udp.ts — зависит от панели), приоритет 0, вес 5, порт 9987, цель ts.example.com.
Проверяем обе записи утилитой dig (входит в пакет dnsutils; учтите, что DNS-изменения расходятся не мгновенно — от минут до нескольких часов):
dig +short A ts.example.com
dig +short SRV _ts3._udp.ts.example.com
Ожидаемый вывод — IP сервера для первой команды и строка 0 5 9987 ts.example.com. для второй. Если обе на месте — подключайтесь в клиенте по адресу ts.example.com и раздавайте участникам именно его. IP-адрес с этого момента — деталь реализации: при переезде на другой VDS вы восстановите бэкап, поменяете одну A-запись, и для участников ничего не изменится.
Дальше сервер живёт сам. Из ухода ему нужно два дела: следить за server.json и раз в квартал проверять, что бэкап действительно восстанавливается.