Как я приручал TeamSpeak 6 и поддомен

Привет! 👋

Иногда сервер начинает напоминать старый шкаф — вроде всё работает, но внутри бардак: где-то валяются старые контейнеры, где-то временные сервисы, которые «ну потом разберу».
Вот я и решил устроить генеральную уборку на своём VPS. Там уже крутятся AFFiNE и Passbolt, и я подумал: почему бы не заодно переселить туда и TeamSpeak?

Тем более повод подходящий — вышел сервер TeamSpeak 6 (в бете!). Любопытство победило: поднял тестовый инстанс, настроил, и вроде всё работает.
Для порядка завёл поддомен ts6.ezzzzko.tech, чтобы не путаться с другими сервисами.

И вот тут вылезла одна мелкая, но раздражающая деталь.
TeamSpeak, как известно, живёт на своём UDP-порту (9987), но если кто-то откроет ts6.ezzzzko.tech в браузере, он просто увидит ошибку — никакой страницы, ничего.

А хочется ведь красиво, чтобы при открытии поддомена браузер сам перебрасывал человека на мой основной сайт — ezzzzko.tech.

Мелочь, но именно такие мелочи делают инфраструктуру аккуратной.
Вот и решил оформить красивый редирект. через nginx, с SSL, как положено.


🧩 Шаг 1. DNS-запись

Для начала — самое базовое: DNS.
Нужна обычная A-запись для поддомена, чтобы он смотрел на тот же IP, где стоит сервер:

ts6  A  <IP_твоего_сервера>

TeamSpeak будет использовать свой порт (по умолчанию 9987 UDP), а nginx — 80/443.
Так что если всё на одном IP — этого достаточно.


🔒 Шаг 2. SSL-сертификат

Технически TeamSpeak не нуждается в HTTPS, но браузеру всё равно нужно что-то валидное, иначе при редиректе он начнёт ругаться.

Так что ставим сертификат для поддомена.
Самый простой способ — через Certbot:

sudo certbot certonly --nginx -d ts6.ezzzzko.tech

Если ты уже выпускаешь сертификаты для нескольких поддоменов — просто добавь его в общий список:

sudo certbot certonly --nginx -d ezzzzko.tech -d ts6.ezzzzko.tech

Теперь у нас есть HTTPS, и можно смело редиректить, не ловя желтые замочки и “небезопасные соединения”.


⚙️ Шаг 3. Редирект в nginx

Создаём новый конфиг, например:

/etc/nginx/sites-available/ts6.ezzzzko.tech

В нём — два блока: один для HTTP, другой для HTTPS.

server {
    listen 80;
    listen [::]:80;
    server_name ts6.ezzzzko.tech;

    return 301 https://ezzzzko.tech$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name ts6.ezzzzko.tech;

    ssl_certificate /etc/letsencrypt/live/ts6.ezzzzko.tech/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ts6.ezzzzko.tech/privkey.pem;

    return 301 https://ezzzzko.tech$request_uri;
}

Активируем сайт симлинком:

ln -s /etc/nginx/sites-available/ts6.ezzzzko.tech /etc/nginx/sites-enabled/

Проверяем и перезапускаем nginx:

sudo nginx -t
sudo systemctl reload nginx

🧠 Результат

СитуацияЧто происходит
Подключение к ts6.ezzzzko.tech:9987Работает TeamSpeak, всё как надо
Открытие http://ts6.ezzzzko.technginx редиректит на https://ezzzzko.tech
Открытие https://ts6.ezzzzko.techТо же самое, только по HTTPS
Есть SSLВсё красиво, без ошибок
Нет SSLБраузер ругается, но редирект всё равно работает

⚡ Минимальный набор

  • DNS: ts6 A <IP_сервера>
  • SSL через certbot
  • Редирект в nginx

Так что теперь мой ts6.ezzzzko.tech спокойно обслуживает TeamSpeak 6, а любой, кто случайно заходит туда через браузер, оказывается на главной ezzzzko.tech — аккуратно, чисто и без “Your connection is not private”.