Slyber TURN Server - автономный сервер ретрансляции медиатрафика (STUN/TURN) для WebRTC приложений, построенный на базе pion/turn/v4. Поставляется в виде единого статически скомпилированного бинарного файла для linux/amd64 и linux/arm64 без внешних системных зависимостей.
- Автоматичесая конфигурация: Автоматическое определение внешнего IPv4 через STUN при старте.
- Встроенный HTTP API: Готовый эндпоинт
/api/turn-credentialsс CORS и Rate Limiting, плюс локальная генерация HMAC-SHA1 токенов за 0 мс. - Масштабирование по ядрам: Масштабирование UDP слушателей по ядрам CPU через
SO_REUSEPORTи автотюнинг буферов сокетов до 8 МБ. - Безопасность из коробки: Встроенный SSRF фильтр (блокировка Cloud Metadata
169.254.169.254, loopback и приватных подсетей) с поддержкой TURN Hairpinning. - Встроенная диагностика и нагрузочное тестирование: Инструменты
slyber_turn doctorиslyber_turn benchвстроены прямо в бинарный файл для проверки сетевой связности, задержек (RTT), потерь пакетов и джиттера по RFC 3550.
Установка в одну команду
Установочный скрипт автоматически определяет архитектуру процессора (amd64 / arm64), сверяет контрольную сумму SHA256SUMS, настраивает сетевые буферы ядра Linux (sysctl), открывает порты в ufw или firewalld, генерирует конфигурацию в /opt/slyber_turn/.env, регистрирует systemd-сервис и запускает самодиагностику.
1. Стандартная установка с автоматической настройкой сервера
curl -fsSL https://raw.githubusercontent.com/slyber-app/slyber-turn-server/main/install.sh | sudo bash
2. Кастомная установка с пользовательскими параметрами
Вы можете передать нужный REALM, собственный TURN_SECRET, порты или лимит полосы пропускания на сессию прямо в команду установки:
curl -fsSL https://raw.githubusercontent.com/slyber-app/slyber-turn-server/main/install.sh | \
sudo REALM="turn.example.com" \
PUBLIC_IP="auto" \
HTTP_PORT=":8080" \
MAX_KBPS_PER_SESSION="2000" \
bash
По завершении скрипт выведет статус сервиса, сгенерированный TURN_SECRET и результат проверки slyber_turn doctor
[INFO] Detected platform: linux/amd64
[INFO] Downloading slyber_turn-linux-amd64...
[INFO] Verifying SHA256 checksum...
[OK] Checksum verified
[OK] Installed binary to /opt/slyber_turn/slyber_turn (symlinked to /usr/local/bin/slyber_turn)
[OK] Created initial configuration in /opt/slyber_turn/.env
[INFO] Applying UFW firewall rules...
[INFO] Running self-diagnostics...
--------------------------------------------------
[OK] Configuration valid (realm: turn.example.com, relay port pool: 49152-65535, capacity: 16384 sessions)
[OK] HTTP API protection active (origins: 1, require_secret: false)
[OK] STUN check passed in 12ms: PUBLIC_IP (203.0.113.50) matches external IP
[INFO] UDP port 3478 is already in use - switching to running server verification (Live Probe)...
[OK] HTTP API (:8080/healthz) responded normally (200 OK)
[OK] TURN Allocate succeeded in 390µs (allocated relay address: 203.0.113.50:50124)
--------------------------------------------------
[OK] Slyber Turn Server is installed and running.
Service : systemctl status slyber_turn
Config file : /opt/slyber_turn/.env
TURN Secret : 8f9d2a7b4c1e6f3a9b0c8d7e6f5a4b3c
Diagnostics : sudo slyber_turn doctor
Benchmark : sudo slyber_turn bench -clients 20 -duration 5s
Управление сервисом и удаление
После установки управление сервером осуществляется стандартными командами systemd и CLI утилитой
# Проверка статуса и логов
sudo systemctl status slyber_turn
sudo journalctl -u slyber_turn -f
# Запуск диагностики или нагрузочного теста
sudo slyber_turn doctor
sudo slyber_turn bench -clients 20 -duration 5s
Удаление с сохранением конфигурации и телеметрии
По умолчанию скрипт деинсталляции останавливает сервис, удаляет systemd юнит и бинарные файлы, но сохраняет директорию /opt/slyber_turn (файл .env, историю статистики stats.json и журнал событий events.jsonl):
curl -fsSL https://raw.githubusercontent.com/slyber-app/slyber-turn-server/main/uninstall.sh | sudo bash
Полное удаление (включая конфигурацию и данные)
Если необходимо полностью очистить сервер вместе с директорией /opt/slyber_turn, передайте переменную PURGE_DATA=true
curl -fsSL https://raw.githubusercontent.com/slyber-app/slyber-turn-server/main/uninstall.sh | sudo PURGE_DATA=true bash
Ключевые технические характеристики
| Компонент | Реализация в Slyber TURN Server |
| Сетевой стек (Linux) | Множественные UDP сокеты с SO_REUSEPORT (TURN_THREADS=NumCPU), автонастройка net.core.rmem_max / wmem_max до 8 МБ для исключения потерь пакетов на пиках. |
| Выдача WebRTC кредов | Встроенный HTTP API (/api/turn-credentials) с проверкой Origin (включая поддомены), IP/CIDR allowlist, Rate Limiter и строгим режимом REQUIRE_SECRET=true. |
| Работа с TLS | генерация Self-Signed ECDSA P-256 в памяти. |
| Защита от SSRF | Блокировка обращений к Cloud Metadata (169.254.0.0/16, fd00:ec2::254/128), loopback и приватным сетям с поддержкой TURN Hairpinning и фильтрацией браузерного LAN шума. |
| Трекинг сессий и мобильных сетей | Группировка сессий по user_id с автоматическим скрытием старых сокетов через 5 секунд при переключении клиента между Wi-Fi и 4G/LTE. |
| Шейпинг трафика | Неблокирующий Token Bucket лимитер на атомиках (MAX_KBPS_PER_SESSION) для ограничения полосы пропускания отдельной сессии. |
| Мониторинг и телеметрия | Эндпоинт /metrics в формате Prometheus, /api/node-stats (24-часовая история, пул портов, Top Offenders) и персистентный журнал /events (events.jsonl). |
Подключение к WebRTC приложению
1. Получение учетных данных (кредов) из браузера
const res = await fetch("http://YOUR_SERVER_IP:8080/api/turn-credentials?user_id=user_42");
const turn = await res.json();
const pc = new RTCPeerConnection({
iceServers: [{
urls: turn.uris,
username: turn.username,
credential: turn.password
}]
});