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 SFrameE2EE с ротацией ключей 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 и запускает самодиагностику.
curl -fsSL https://raw.githubusercontent.com/slyber-app/slyber-sfu-server/main/install.sh | sudo 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:
================================================================
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 ознакомьтесь с сопутствующими техническими статьями:
- Архитектура WebRTC SFU на Go без аллокаций: мультиплексирование на одном порту и свап за доли миллисекунды
- Построение голосовых ИИ-пайплайнов реального времени поверх WebRTC SFU без транскодирования на сервере
Ключевые технические характеристики
| Подсистема | Реализация в 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 и QoS | 3 пространственных слоя (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 и подписываются на удаленные треки (полная документация протокола сигналинга):
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 }));
}
};