Установка и запуск Slyber SFU Server в Docker

Обновлено:

Самый быстрый способ развернуть 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 адрес вашего сервера, сгенерирует три изолированных криптографических ключа, запустит контейнер в фоновом режиме и сразу выполнит встроенную самодиагностику узла.

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)
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.

Bash
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 и запустите оба контейнера командами ниже.

Bash
# 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.

Bash
# Проверить версию бинарного файла внутри образа
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 и автоматической ротацией логов.

Code
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, голосовой конвейер ИИ и телеметрия).