Slyber SFU Server - WebRTC медиароутер

Slyber SFU Server - WebRTC медиароутер

Slyber SFU Server - это высокопроизводительный сервер селективной пересылки (SFU) без внешних зависимостей для маршрутизации аудио, видео и данных WebRTC в реальном времени, разработанный на языке Go поверх стека Pion WebRTC v4. Поставляется в виде единого статически скомпилированного бинарного файла для linux/amd64 и linux/arm64 (а также минималистичного Docker-образа на базе Alpine), обеспечивая работу групповых видеоконференций, видеорулеток один на один с задержкой переключения менее миллисекунды, вещания WHIP/WHEP с низкой задержкой и полнодуплексных конвейеров для голосовых ИИ-агентов - с бесшовной интеграцией в связке со Slyber TURN Server.

  • Мультиплексирование на одном порту: все медиасессии ICE-Lite, DTLS-SRTP и RFC 4571 ICE-TCP работают через единый порт 4443 (UDP и TCP) с помощью ICEUDPMux и ICETCPMux, избавляя от необходимости открывать диапазоны из более чем 10 000 эфемерных портов в файрволе.
  • Адаптивный Simulcast и VP9 SVC: индивидуальная оценка пропускной способности для каждого зрителя (SubscriberBWE на базе TWCC, REMB и отчетов RTCP Receiver Reports) с послойным восстановлением пакетов по NACK через PacketRingBuffer и независимыми фильтрами PLICoalescer с интервалом 500 мс.
  • Маршрутизация без аллокаций и свап в рулетке <1 мс: пересылка пакетов на базе буферов sync.Pool с атомарным подсчетом ссылок и модулем SeqTimestampRewriter для мгновенного переключения собеседников без ренегоциации SDP.
  • Полнодуплексный голосовой ИИ-шлюз (/ai/ws): нативный аудиоконвейер поверх WebSocket со встроенным 20-миллисекундным RTP-пейсером, мультиплексированием до 6 ботов (mode=mux) и детектором перебивания VAD Barge-In по заголовкам RFC 6464.
  • Безопасность Zero-Trust и шлюзы: принудительное сквозное шифрование RFC 9605 SFrame E2EE с ротацией ключей MLS, маршрутизация слоев по заголовкам RFC 9626 Frame Marking, стриминг WHIP/WHEP за 1 RTT, упаковка в формат MoQ Draft-22 и межсерверное каскадирование с подписью HMAC-SHA256 и фильтрацией SSRF.

Установка в продакшен одной командой

Установочный скрипт автоматически определяет архитектуру процессора (amd64 / arm64), сверяет контрольную сумму SHA256SUMS, настраивает сетевые буферы сокетов ядра Linux (net.core.rmem_max / wmem_max до 8 МБ), добавляет правила файрвола, генерирует криптографические секреты в /opt/slyber_sfu/.env, регистрирует службу systemd и запускает самодиагностику.

Bash
curl -fsSL https://raw.githubusercontent.com/slyber-app/slyber-sfu-server/main/install.sh | sudo bash
Bash
docker pull ghcr.io/slyber-app/slyber-sfu-server:latest
docker rm -f slyber-sfu-server 2>/dev/null || true

PUBLIC_IP=$(curl -fsSL4 --max-time 2 api.ipify.org 2>/dev/null || echo 127.0.0.1)
TURN_SECRET=$(head -c 24 /dev/urandom | od -An -tx1 | tr -d ' \n' | head -c 32)
JWT_SECRET=$(head -c 24 /dev/urandom | od -An -tx1 | tr -d ' \n' | head -c 32)
NODE_SECRET=$(head -c 24 /dev/urandom | od -An -tx1 | tr -d ' \n' | head -c 32)

docker run -d \
  --name slyber-sfu-server \
  --restart unless-stopped \
  -p 4443:4443/udp \
  -p 4443:4443/tcp \
  -p 8090:8090/tcp \
  -e SFU_ENV="production" \
  -e PUBLIC_IP="${PUBLIC_IP}" \
  -e REALM="slyber.com" \
  -e SFU_UDP_PORT="4443" \
  -e SFU_TCP_PORT="4443" \
  -e SFU_HTTP_PORT="8090" \
  -e AUTH_MODE="jwt" \
  -e TURN_SECRET="${TURN_SECRET}" \
  -e JWT_SECRET="${JWT_SECRET}" \
  -e NODE_SECRET="${NODE_SECRET}" \
  ghcr.io/slyber-app/slyber-sfu-server:latest \
  && sleep 1 && docker exec slyber-sfu-server slyber_sfu doctor

После запуска встроенная утилита slyber_sfu doctor проверяет сетевые сокеты, маршрутизацию публичного IP, секреты аутентификации и доступность Redis:

Code
================================================================
 SLYBER SFU DOCTOR | Version: v1.0.0 | Node: slyber-sfu-01
================================================================
 [OK] Environment       : production
 [OK] Public IP & Realm : 89.111.175.67 (slyber.com)
 [OK] Pion ICE Mux      : UDP :4443 | TCP :4443 (ICE-TCP=true) | HTTP :8090
 [OK] Auth & Security   : jwt (E2EE=true, External TURN=1)
 [OK] All Slyber SFU self-diagnostics passed.
================================================================

Подробный разбор архитектуры

Для глубокого погружения во внутренние подсистемы Slyber SFU Server ознакомьтесь с сопутствующими техническими статьями:

Ключевые технические характеристики

ПодсистемаРеализация в Slyber SFU Server
Мультиплексор WebRTC-транспортаPion WebRTC v4 в режиме ICE-Lite; единый порт 4443/UDP (ICEUDPMux) и 4443/TCP (RFC 4571 ICETCPMux) с перезаписью публичных IP-кандидатов и буферами сокетов ОС 8 МБ.
Движок пакетной памятиНеблокирующий пул sync.Pool для переиспользования пакетов с атомарным подсчетом ссылок (Retain / Release) и разбором заголовков/паддинга RTP на месте.
Simulcast, SVC и QoS3 пространственных слоя (q/h/f) и фильтрация VP9 SVC; послойные кольцевые буферы NACK на 512 пакетов; независимые фильтры PLICoalescer (500 мс); контроллер SubscriberBWE (TWCC, REMB, RTCP RR).
Конференции и рулеткаДетектор активного спикера по уровню звука RFC 6464, автоматическая пауза камер EnforceLastNVideo и мгновенный свап FastSwapRouletteTrack (<1 мс) с монотонной перезаписью номеров последовательности и таймстампов.
Аутентификация и лимиты скоростиПроверка за константное время для HS256 JWT (с правами доступа), пула сессий Redis (мгновенный отзыв) и токенов HMAC-SHA1, а также атомарный ограничитель скорости на базе Token Bucket (TrafficPolice).
Сквозное шифрование (E2EE)Валидация RFC 9605 SFrame с поддержкой до 16 ключей MLS на SSRC, скользящим битовым окном защиты от повторов на 512 пакетов и чтением открытого расширения слоев RFC 9626 Frame Marking.
Шлюзы и телеметрияWHIP/WHEP (прием потоков из OBS за 1 RTT), полнодуплексный голосовой шлюз /ai/ws, релей MoQ Draft-22, UDP-каскад нод с подписью HMAC-SHA256 и защитой от SSRF, а также экспортер Prometheus /metrics.
ВозможностьSlyber SFUКлассические C++ SFUОблачные SFU-сервисы
Артефакт развертывания1 статический бинарник GoСборка со множеством библиотекПроприетарный SaaS
Медиапорты в файрволе1 порт (4443 UDP/TCP)10 000+ UDP-портовУправляются провайдером
Шлюз голосовых ИИ-ботовВстроенный /ai/ws + пейсер 20 мсСамописные связки WebRTC/GStreamerДоп. модуль / высокая задержка
Свап трека в рулетке 1 на 1Смена указателя <1 мс (0 SDP)Полная ренегоциация SDPЗадержка переподписки
Валидация SFrame E2EEНативная RFC 9605 + MLSРучная настройка Insertable StreamsТолько в тарифах Enterprise

Подключение клиента через WebSocket-сигналинг

Клиенты подключаются к /ws, проходят аутентификацию по подписанному JWT, обмениваются SDP Offer/Answer и подписываются на удаленные треки (полная документация протокола сигналинга):

JavaScript
const ws = new WebSocket("wss://sfu.example.com/ws");
const pc = new RTCPeerConnection({ bundlePolicy: "max-bundle" });

ws.onopen = async () => {
  const offer = await pc.createOffer();
  await pc.setLocalDescription(offer);
  ws.send(JSON.stringify({
    type: "join",
    room_id: "conference-alpha",
    token: "YOUR_HS256_JWT_TOKEN",
    sdp: offer.sdp
  }));
};

ws.onmessage = async ({ data }) => {
  const msg = JSON.parse(data);
  if (msg.type === "joined" && msg.sdp) {
    await pc.setRemoteDescription({ type: "answer", sdp: msg.sdp });
  } else if (msg.type === "publish_track") {
    ws.send(JSON.stringify({ type: "subscribe_track", track_id: msg.track_id, spatial_layer: 2 }));
  } else if (msg.type === "offer") {
    await pc.setRemoteDescription({ type: "offer", sdp: msg.sdp });
    const answer = await pc.createAnswer();
    await pc.setLocalDescription(answer);
    ws.send(JSON.stringify({ type: "answer", sdp: answer.sdp }));
  }
};