Bedrud Документация

Bedrud - это монорепозиторий, содержащий сервер на Go, три клиентских приложения, ботов-агентов на Python и общие пакеты. Эта страница описывает взаимосвязь между компонентами.

Высокоуровневая диаграмма

flowchart TB
    subgraph Clients ["Clients"]
        Web["Web<br/>React"]
        Android["Android<br/>Compose"]
        iOS["iOS<br/>SwiftUI"]
        Desktop["Desktop<br/>Rust + Slint"]
    end
 
    subgraph Server ["Bedrud Server"]
        Router["Fiber HTTP Router<br/>/api/auth/* /api/room/* /api/admin/*"]
        DB["GORM / SQLite<br/>(or PostgreSQL)"]
        LKSDK["LiveKit Protocol SDK<br/>(token generation, room management)"]
        LiveKit["Embedded LiveKit<br/>Media Server (WebRTC)"]
    end
 
    Clients -->|"REST API + WebSocket"| Router
    Router --> DB
    Router --> LKSDK
    LKSDK --> LiveKit

Компоненты

Сервер (server/)

Бэкенд на Go - ядро Bedrud. Он отвечает за:

  • REST API - аутентификация, управление комнатами, административные операции
  • Раздача статических файлов - скомпилированный веб-фронтенд встраивается через //go:embed
  • Интеграция с LiveKit - генерация токенов и управление комнатами через LiveKit Protocol SDK
  • Встроенный сервер LiveKit - бинарник медиасервера запускается как дочерний процесс

Сервер использует веб-фреймворк Fiber (аналог Express.js в Node.js) и GORM в качестве ORM. Поддерживает SQLite для разработки и PostgreSQL для продакшена.

Подробнее см. Архитектура сервера.

Веб-фронтенд (apps/web/)

Приложение на React, построенное с TanStack Start, TailwindCSS v4 и shadcn/ui. В продакшене оно предварительно рендерится на сервере, а клиентские ресурсы встраиваются в бинарник Go.

Ключевые возможности:

  • Интерфейс видеоконференций с LiveKit Client SDK
  • Аутентификация на основе JWT с автоматическим обновлением токенов
  • Панель администратора для управления пользователями и комнатами
  • Система дизайна с единообразной библиотекой компонентов

Подробнее см. Веб-фронтенд.

Приложение для Android (apps/android/)

Нативное приложение для Android, построенное на Jetpack Compose и Kotlin. Использует Koin для внедрения зависимостей и Retrofit для HTTP-запросов.

Ключевые возможности:

  • Полноценный интерфейс видеоконференций с LiveKit Android SDK
  • Режим «картинка в картинке»
  • Обработка глубоких ссылок (bedrud.com/m/* и bedrud.com/c/*)
  • Управление звонками через Android ConnectionService
  • Поддержка нескольких экземпляров (подключение к нескольким серверам)

Подробнее см. Приложение для Android.

Приложение для iOS (apps/ios/)

Нативное приложение для iOS, построенное на SwiftUI. Использует KeychainAccess для безопасного хранения учётных данных и LiveKit Swift SDK для работы с медиа.

Ключевые возможности:

  • Полноценный интерфейс видеоконференций
  • Поддержка нескольких экземпляров
  • Обработка глубоких ссылок
  • Безопасное хранение учётных данных в Keychain

Подробнее см. Приложение для iOS.

Десктопное приложение (apps/desktop/)

Нативное приложение для Windows и Linux, построенное на Rust и UI-фреймворке Slint. Компилируется в единый бинарник без зависимостей времени выполнения.

Ключевые возможности:

  • Полноценный интерфейс видеоконференций через LiveKit Rust SDK
  • Нативный рендеринг: Windows (Direct3D 11) и Linux (OpenGL/Vulkan)
  • Поддержка нескольких экземпляров (подключение к нескольким серверам Bedrud)
  • Интеграция с OS keyring для безопасного хранения учётных данных

Подробнее см. Десктопное приложение.

Боты-агенты (agents/)

Скрипты на Python, которые подключаются к комнатам как боты и транслируют медиаконтент:

  • Музыкальный агент - воспроизводит аудиофайлы
  • Радио-агент - транслирует интернет-радиостанции
  • Видеостриминг-агент - делится видеоконтеинтом (HLS, MP4)

Подробнее см. Боты-агенты.

Процесс аутентификации

sequenceDiagram
    participant Client
    participant Server
    participant Database
 
    Client->>Server: POST /api/auth/login
    Server->>Database: verify credentials
    Database-->>Server: credentials valid
    Server-->>Client: access + refresh JWT
 
    Client->>Server: GET /api/room/list
    Note right of Server: "Authorization: Bearer <access_token>"
    Server-->>Client: room list

Все аутентифицированные запросы используют JWT-токены в заголовке Authorization. Обёртка authFetch веб-фронтенда автоматически добавляет токен и обновляет его.

Поддерживаемые методы аутентификации:

МетодЭндпоинтОписание
Email/парольPOST /api/auth/loginТрадиционные учётные данные
РегистрацияPOST /api/auth/registerСоздание нового аккаунта
Гостевой входPOST /api/auth/guest-loginВременный доступ только по имени
OAuthGET /api/auth/:provider/loginGoogle, GitHub, Twitter
Ключи доступаPOST /api/auth/passkey/*Биометрия FIDO2/WebAuthn

Процесс подключения к конференции

sequenceDiagram
    participant C as Client
    participant S as Bedrud Server
    participant LK as LiveKit SFU
 
    C->>S: POST /api/room/join
    S->>S: Validate permissions
    S->>C: LiveKit JWT token
    C->>LK: WebSocket connect (with token)
    LK->>C: SDP offer + join response
 
    Note over C,LK: ICE connectivity check
    C->>LK: Host + STUN + TURN candidates
 
    alt Direct path (UDP)
        C-->>LK: Media via UDP 50000-60000
    else TURN relay
        C-->>LK: Media via TURN relay
    end
 
    Note over C,LK: Audio/video tracks flow through SFU
  1. Клиент запрашивает подключение к комнате через REST API
  2. Сервер проверяет разрешения и генерирует подписанный LiveKit-токен
  3. Клиент подключается напрямую к LiveKit через WebSocket, используя токен
  4. ICE собирает кандидатов (host, STUN, TURN) и выбирает лучший маршрут
  5. Аудио- и видеодорожки проходят через SFU LiveKit

Подробнее см. Подключение WebRTC - полный стек подключения.

Модель данных

User

ПолеТипОписание
IDuintПервичный ключ
EmailstringУникальный email-адрес
NamestringОтображаемое имя
PasswordstringХэш пароля (пустой для OAuth/гостя)
AvatarstringURL аватара
ProviderstringПровайдер аутентификации (local, google, github, twitter, guest)
Rolestringuser или admin

Room

ПолеТипОписание
IDuintПервичный ключ
AdminIDuintВнешний ключ → User.ID (создатель комнаты)
NamestringНазвание комнаты / URL-слаг
IsPublicboolМогут ли гости присоединиться без приглашения
ChatEnabledboolАктивен ли чат в комнате
VideoEnabledboolРазрешено ли видео
Participants[]UserПользователи, находящиеся в комнате

Passkey

ПолеТипОписание
IDuintПервичный ключ
UserIDuintВнешний ключ → User.ID
CredentialID[]byteИдентификатор учётных данных WebAuthn
PublicKey[]byteПубличный ключ WebAuthn
Counteruint32Счётчик подписей WebAuthn

RefreshToken

ПолеТипОписание
TokenstringСтрока refresh-токена
UserIDuintВнешний ключ → User.ID
ExpiresAttimeВремя истечения токена

Архитектура развёртывания

В продакшене Bedrud работает как два сервиса systemd:

СервисБинарникНазначение
bedrud.servicebedrud --runAPI-сервер + встроенный веб-фронтенд
livekit.servicebedrud --livekitМедиасервер WebRTC

Оба сервиса управляются единым бинарником. Traefik или другой обратный прокси обрабатывает TLS-терминацию и маршрутизацию трафика.

Инструкции по настройке см. в Руководстве по развёртыванию.

Ключевые термины

Эти термины встречаются в документации по архитектуре:

ТерминПолное названиеЗначение
SFUSelective Forwarding UnitМедиасервер, который получает потоки от каждого участника и перенаправляет их остальным. Клиенты подключаются к серверу, а не друг к другу.
SDPSession Description ProtocolФормат описания параметров соединения WebRTC (кодеки, разрешения, типы медиа).
ICEInteractive Connectivity EstablishmentФреймворк, который собирает все возможные сетевые маршруты между клиентом и сервером, затем выбирает лучший.
STUNSession Traversal Utilities for NATЛёгкий протокол, помогающий клиенту узнать свой публичный IP-адрес. Работает для большинства соединений.
TURNTraversal Using Relays around NATПротокол, который ретранслирует все медиаданные через сервер, когда прямое соединение невозможно. Последнее средство, наибольшая нагрузка на канал.
NATNetwork Address TranslationФункция маршрутизатора, сопоставляющая внутренние приватные адреса с публичным. Может блокировать прямые WebRTC-соединения в зависимости от типа.
srflxServer ReflexiveТип ICE-кандидата, представляющий публичный IP клиента, обнаруженный через STUN.
WebRTCWeb Real-Time CommunicationСтандарт браузерного и мобильного API для передачи аудио, видео и данных в реальном времени.

См. также