Самый быстрый способ развернуть Slyber SFU Server на любом сервере Linux или локальной машине разработчика заключается в запуске официального контейнера из реестра GitHub Container Registry. Готовый образ ghcr.io/slyber-app/slyber-sfu-server:latest автоматически собирается для архитектур процессора linux/amd64 и linux/arm64 на базе легковесной системы Alpine 3.20. Внутри образа уже находится статический бинарный файл /usr/local/bin/slyber_sfu, прошедший проверку контрольной суммы SHA256SUMS. Если вы предпочитаете установку напрямую в операционную систему без контейнеров, перейдите в раздел Установка бинарного файла и настройка службы systemd.
Быстрый запуск одной командой через Docker CLI
Вам не нужно клонировать репозиторий, устанавливать компилятор Go или вручную писать конфигурационные файлы. Скопируйте и выполните в терминале следующую команду. Она скачает свежий образ, автоматически определит внешний IP адрес вашего сервера, сгенерирует три изолированных криптографических ключа, запустит контейнер в фоновом режиме и сразу выполнит встроенную самодиагностику узла.
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)
JWT_SECRET=$(head -c 24 /dev/urandom | od -An -tx1 | tr -d ' \n')
NODE_SECRET=$(head -c 24 /dev/urandom | od -An -tx1 | tr -d ' \n')
docker run -d \
--name slyber-sfu-server \
--restart unless-stopped \
--network host \
-e SFU_ENV="production" \
-e PUBLIC_IP="${PUBLIC_IP}" \
-e SFU_UDP_PORT="4443" \
-e SFU_TCP_PORT="4443" \
-e SFU_HTTP_PORT="8090" \
-e AUTH_MODE="jwt" \
-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 && \
echo "Public IP : ${PUBLIC_IP}" && \
echo "JWT Secret : ${JWT_SECRET}" && \
echo "Node Secret: ${NODE_SECRET}" && \
echo "Test Token : $(curl -fsS -H "X-Slyber-Node-Secret: ${NODE_SECRET}" "http://127.0.0.1:8090/auth/token?room=test-room&user=user-1")"
Сразу после выполнения команды в консоли появится зеленый отчет утилиты slyber_sfu doctor и сгенерированные секретные ключи, которые вы можете скопировать в настройки своего бэкенда или в визуальный стенд тестирования Slyber Inspector.
Как устроен контейнер внутри и почему он безопасен
Официальный Docker образ спроектирован по стандартам безопасности для продакшен окружений.
- Работа без прав суперпользователя. Внутри контейнера создается изолированная системная группа и пользователь
slyber_sfuс идентификаторомUID 10001и запретом интерактивного входа/sbin/nologin. Процесс медиасервера никогда не выполняется от имениroot. - Привязка привилегированных портов. На этапе сборки бинарному файлу
/usr/local/bin/slyber_sfuчерез утилитуsetcapвыдается точечное разрешение ядраcap_net_bind_service=+ep. Это позволяет непривилегированному пользователю при необходимости открывать даже системные порты ниже 1024 (например порт443для обхода строгих корпоративных прокси). - Единый порт для медиатрафика. Поскольку стек Pion WebRTC мультиплексирует все соединения на одном порту
4443, вам достаточно пробросить в Docker всего три порта (4443/udp,4443/tcpи8090/tcp) без создания тяжелых правил iptables на десятки тысяч портов. На высоконагруженных серверах Linux вместо флагов-pможно также указать флаг--network hostдля прямого доступа к сетевой карте хоста.
Примеры запуска для разных режимов аутентификации
В зависимости от архитектуры вашего проекта вы можете запустить контейнер в одном из трех режимов проверки клиентских токенов (подробный разбор криптографии приведен в статье Аутентификация и сквозное шифрование SFrame E2EE).
1. Запуск в режиме Secret или JWT и выпуск первого токена
Этот сценарий подходит для быстрой проверки на локальной машине или тестовом сервере. Мы запускаем контейнер и сразу запрашиваем у встроенного генератора /auth/token готовый токен для пользователя erkin в комнате test-room.
docker run -d \
--name slyber_sfu_secret \
-p 4443:4443/udp -p 4443:4443/tcp -p 8090:8090/tcp \
-e PUBLIC_IP="127.0.0.1" \
-e REALM="sfu.local" \
-e SFU_UDP_PORT="4443" \
-e SFU_TCP_PORT="4443" \
-e SFU_HTTP_PORT="8090" \
-e AUTH_MODE="secret" \
-e TURN_SECRET="my-custom-sfu-turn-secret-2026" \
-e JWT_SECRET="my-custom-sfu-jwt-secret-2026" \
-e NODE_SECRET="my-custom-sfu-node-secret-2026" \
ghcr.io/slyber-app/slyber-sfu-server:latest
# Выпускаем готовые токены через административный эндпоинт
curl -s -H "X-Slyber-Node-Secret: my-custom-sfu-node-secret-2026" \
"http://127.0.0.1:8090/auth/token?room=test-room&user=erkin"
2. Запуск в связке с Redis в общей сети Docker
Если вы хотите управлять активными сессиями через базу данных Redis и мгновенно отзывать доступ у участников во время звонка, создайте общую сеть Docker и запустите оба контейнера командами ниже.
# 1. Создаем изолированную сеть Docker и запускаем Redis
docker network create slyber_sfu_net
docker run -d --name slyber_sfu_redis --network slyber_sfu_net redis:alpine
# 2. Записываем тестовую сессию со сроком жизни 3600 секунд
docker exec slyber_sfu_redis redis-cli SET "slyber:session:tok_777" "erkin" EX 3600
# 3. Запускаем Slyber SFU Server в режиме redis
docker run -d \
--name slyber-sfu-server \
--network slyber_sfu_net \
-p 4443:4443/udp -p 4443:4443/tcp -p 8090:8090/tcp \
-e PUBLIC_IP="127.0.0.1" \
-e REALM="sfu.local" \
-e SFU_UDP_PORT="4443" \
-e SFU_TCP_PORT="4443" \
-e SFU_HTTP_PORT="8090" \
-e AUTH_MODE="redis" \
-e REDIS_ADDR="slyber_sfu_redis:6379" \
-e NODE_SECRET="my-custom-sfu-node-secret-2026" \
ghcr.io/slyber-app/slyber-sfu-server:latest
# 4. Проверяем, что SFU сервер видит базу Redis и проходит диагностику
docker exec slyber-sfu-server slyber_sfu doctor
Управление контейнером, диагностика и обновление
Для повседневного обслуживания запущенного контейнера используйте стандартные команды Docker CLI.
# Проверить версию бинарного файла внутри образа
docker run --rm ghcr.io/slyber-app/slyber-sfu-server:latest --version
# Запустить полную самодиагностику внутри работающего контейнера
docker exec slyber-sfu-server slyber_sfu doctor
# Посмотреть логи запуска и итоговую статистику пакетов
docker logs -f slyber-sfu-server
# Проверить HTTP эндпоинт здоровья сервера
curl -i http://127.0.0.1:8090/healthz
Альтернативный запуск через Docker Compose
Если в вашей инфраструктуре принято описывать сервисы в виде декларативных файлов, вы можете использовать готовый шаблон docker-compose.yml с режимом сети host и автоматической ротацией логов.
services:
slyber-sfu:
image: ghcr.io/slyber-app/slyber-sfu-server:latest
container_name: slyber-sfu-server
restart: unless-stopped
network_mode: host
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
ulimits:
nofile:
soft: 65535
hard: 65535
logging:
driver: "json-file"
options:
max-size: "50m"
max-file: "3"
environment:
SFU_ENV: "${SFU_ENV:-production}"
SFU_NODE_ID: "${SFU_NODE_ID:-slyber-sfu-01}"
PUBLIC_IP: "${PUBLIC_IP:?Set PUBLIC_IP in .env}"
REALM: "${REALM:-slyber.com}"
DEFAULT_ROOM_PROFILE: "${DEFAULT_ROOM_PROFILE:-conference}"
SFU_UDP_PORT: "${SFU_UDP_PORT:-4443}"
SFU_TCP_PORT: "${SFU_TCP_PORT:-4443}"
SFU_HTTP_PORT: "${SFU_HTTP_PORT:-8090}"
ENABLE_ICE_TCP: "${ENABLE_ICE_TCP:-true}"
SOCKET_BUFFER_BYTES: "${SOCKET_BUFFER_BYTES:-8388608}"
EXTERNAL_TURN_URLS: "${EXTERNAL_TURN_URLS:-}"
AUTH_MODE: "${AUTH_MODE:-jwt}"
JWT_SECRET: "${JWT_SECRET:?Set JWT_SECRET (min 24 chars) in .env}"
NODE_SECRET: "${NODE_SECRET:?Set NODE_SECRET (min 24 chars) in .env}"
TURN_SECRET: "${TURN_SECRET:-}"
ALLOWED_ORIGINS: "${ALLOWED_ORIGINS:-https://slyber.com}"
CREDENTIAL_TTL_SEC: "${CREDENTIAL_TTL_SEC:-3600}"
REQUIRE_E2EE: "${REQUIRE_E2EE:-false}"
REDIS_ADDR: "${REDIS_ADDR:-127.0.0.1:6379}"
MAX_KBPS_PER_TRACK: "${MAX_KBPS_PER_TRACK:-3500}"
MAX_KBPS_PER_SESSION: "${MAX_KBPS_PER_SESSION:-10000}"
ENABLE_SIMULCAST: "${ENABLE_SIMULCAST:-true}"
ENABLE_SVC: "${ENABLE_SVC:-true}"
VIDEO_CODECS: "${VIDEO_CODECS:-VP9,AV1,H264,VP8}"
NACK_BUFFER_SIZE: "${NACK_BUFFER_SIZE:-512}"
LAST_N_VIDEO_LIMIT: "${LAST_N_VIDEO_LIMIT:-16}"
DYNACAST_ENABLED: "${DYNACAST_ENABLED:-true}"
ENABLE_WHIP_WHEP: "${ENABLE_WHIP_WHEP:-true}"
ENABLE_MOQ_RELAY: "${ENABLE_MOQ_RELAY:-false}"
ENABLE_AI_GATEWAY: "${ENABLE_AI_GATEWAY:-true}"
ENABLE_CASCADE_PIPE: "${ENABLE_CASCADE_PIPE:-true}"
ENABLE_INSPECTOR: "${ENABLE_INSPECTOR:-true}"
Полный справочник переменных окружения
Сетевой стек и идентификация узла
SFU_ENVопределяет режим работы сервера (productionвключает обязательную валидацию длины ключей и маршрутизируемого IP адреса,developmentразрешает локальный запуск без ключей).SFU_NODE_IDзадает уникальное имя сервера в метриках Prometheus и заголовках каскадирования (по умолчаниюslyber-sfu-01).PUBLIC_IPзадает публичный IPv4 адрес хоста, который Pion WebRTC записывает в ICE кандидаты для подключения браузеров (поддерживается значениеautoдля автоопределения).REALMустанавливает доменную зону сервера (по умолчаниюslyber.com).DEFAULT_ROOM_PROFILEзадает профиль новых комнат по умолчанию (conference,roulette_1v1,broadcast,gamingилиai_voice).SFU_UDP_PORTиSFU_TCP_PORTзадают единый порт приема медиатрафика WebRTC по протоколам UDP и RFC 4571 TCP (по умолчанию4443).SFU_HTTP_PORTзадает TCP порт для сигнального WebSocket шлюза, WHIP/WHEP и телеметрии (по умолчанию8090).ENABLE_ICE_TCPвключает или отключает прием медиатрафика поверх TCP (по умолчаниюtrue).ALLOW_PORT_FALLBACKразрешает серверу автоматически занять следующий свободный порт при конфликте портов (по умолчаниюfalse).SOCKET_BUFFER_BYTESзадает размер буфера чтения и записи UDP сокета в операционной системе (по умолчанию8388608байт, то есть 8 МБ).EXTERNAL_TURN_URLSпринимает список внешних TURN серверов через запятую для автоматической выдачи клиентам временных учетных данных при входе в комнату.
Безопасность, ключи и подключение к Redis
AUTH_MODEвыбирает режим проверки клиентских токенов между значениямиjwt,redisиsecret.JWT_SECRETзадает секретный ключ подписи HMAC SHA256 для клиентских токенов в режимеjwt(не менее 24 символов в продакшене).TURN_SECRETзадает общий секретный ключ HMAC SHA1 для режимаsecretи генерации паролей к внешним серверам из спискаEXTERNAL_TURN_URLS.NODE_SECRETзадает изолированный административный ключ для доступа к шлюзам/ai/ws,/cascade/,/auth/tokenи/inspector/statsчерез заголовокX-Slyber-Node-Secret.ALLOWED_ORIGINSзадает список разрешенных доменов через запятую для проверки заголовкаOriginв WebSocket и CORS запросах.ALLOW_INTERNAL_CASCADEразрешает использование внутренних IP адресов (RFC 1918 и loopback) в межсерверном каскаде (по умолчаниюfalseдля защиты от SSRF атак).CREDENTIAL_TTL_SECзадает срок действия выпускаемых временных токенов в секундах (по умолчанию3600).REQUIRE_E2EEвключает обязательное сквозное шифрование SFrame для всех комнат узла (по умолчаниюfalse).REDIS_ADDR,REDIS_USERNAME,REDIS_PASSWORDиREDIS_DBзадают параметры подключения к серверу Redis при выборе режимаAUTH_MODE=redis.
Управление качеством медиа (QoS) и шлюзы
MAX_KBPS_PER_TRACKиMAX_KBPS_PER_SESSIONограничивают максимальный входящий битрейт одного медиатрека и всей сессии участника в килобитах в секунду (по умолчанию3500и10000).ENABLE_SIMULCASTиENABLE_SVCуправляют поддержкой многослойного видео Simulcast и фильтрации масштабируемых кодеков SVC (по умолчаниюtrue).VIDEO_CODECSопределяет список активных видеокодеков через запятую (по умолчаниюVP9,AV1,H264,VP8).NACK_BUFFER_SIZEзадает размер кольцевого буфера пакетов для обработки запросов повторной отправки NACK на каждом слое (по умолчанию512).LAST_N_VIDEO_LIMITзадает максимальное число одновременно активных видеокамер в комнате конференции (по умолчанию16).DYNACAST_ENABLEDвключает автоматическое переключение слоев качества на основе оценки пропускной способности канала BWE (по умолчаниюtrue).ENABLE_WHIP_WHEP,ENABLE_MOQ_RELAY,ENABLE_AI_GATEWAY,ENABLE_CASCADE_PIPEиENABLE_INSPECTORвключают или отключают соответствующие шлюзы сервера (принцип работы каждого шлюза подробно описан в статье Шлюзы WHIP и WHEP, голосовой конвейер ИИ и телеметрия).