Bedrud Documentación

Bedrud es un monorepo que contiene un servidor Go, tres aplicaciones cliente, agentes de bot Python y paquetes compartidos. Esta página describe cómo se relacionan los componentes entre sí.

Diagrama de Alto Nivel

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

Componentes

Servidor (server/)

El backend en Go es el núcleo de Bedrud. Maneja:

  • REST API - autenticación, gestión de salas, operaciones de administración
  • Servicio de archivos estáticos - el frontend web compilado se incrusta vía //go:embed
  • Integración con LiveKit - genera tokens y gestiona salas a través del LiveKit Protocol SDK
  • Servidor LiveKit incrustado - el binario del servidor multimedia se ejecuta como proceso hijo

El servidor utiliza el framework web Fiber (similar a Express.js en Node.js) y GORM como capa ORM. Soporta SQLite para desarrollo y PostgreSQL para producción.

Consulte Arquitectura del Servidor para obtener detalles.

Frontend Web (apps/web/)

Una aplicación React construida con TanStack Start, TailwindCSS v4 y shadcn/ui. En producción, se pre-renderiza en el servidor y los activos del cliente se incrustan en el binario Go.

Capacidades clave:

  • Interfaz de usuario de videoconferencia con LiveKit Client SDK
  • Autenticación basada en JWT con actualización automática de tokens
  • Panel de administración para gestión de usuarios y salas
  • Sistema de diseño con biblioteca de componentes consistente

Consulte Frontend Web para obtener detalles.

Aplicación Android (apps/android/)

Una aplicación Android nativa construida con Jetpack Compose y Kotlin. Usa Koin para inyección de dependencias y Retrofit para HTTP.

Capacidades clave:

  • Experiencia completa de videoconferencia con LiveKit Android SDK
  • Modo de imagen en imagen
  • Manejo de enlaces profundos (bedrud.com/m/* y bedrud.com/c/*)
  • Gestión de llamadas con ConnectionService de Android
  • Soporte multi-instancia (conectarse a múltiples servidores)

Consulte Aplicación Android para obtener detalles.

Aplicación iOS (apps/ios/)

Una aplicación iOS nativa construida con SwiftUI. Usa KeychainAccess para almacenamiento seguro de credenciales y LiveKit Swift SDK para medios.

Capacidades clave:

  • Experiencia completa de videoconferencia
  • Soporte multi-instancia
  • Manejo de enlaces profundos
  • Almacenamiento seguro basado en Keychain

Consulte Aplicación iOS para obtener detalles.

Aplicación de Escritorio (apps/desktop/)

Una aplicación de escritorio nativa para Windows y Linux construida con Rust y el toolkit de interfaz de usuario Slint. Se compila en un solo binario sin dependencias de tiempo de ejecución.

Capacidades clave:

  • Experiencia completa de videoconferencia vía LiveKit Rust SDK
  • Renderizado nativo de Windows (Direct3D 11) y Linux (OpenGL/Vulkan)
  • Soporte multi-instancia (conectarse a múltiples servidores Bedrud)
  • Integración con el llavero del sistema operativo para almacenamiento seguro de credenciales

Consulte Aplicación de Escritorio para obtener detalles.

Agentes Bot (agents/)

Scripts Python que se unen a salas de reuniones como bots y transmiten contenido multimedia:

  • Music Agent - reproduce archivos de audio
  • Radio Agent - transmite estaciones de radio de internet
  • Video Stream Agent - comparte contenido de video (HLS, MP4)

Consulte Agentes Bot para obtener detalles.

Flujo de Autenticación

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

Todas las solicitudes autenticadas usan tokens JWT en el encabezado Authorization. El wrapper authFetch del frontend web maneja el adjunto de tokens y la actualización automática.

Métodos de autenticación admitidos:

MethodEndpointDescription
Email/PasswordPOST /api/auth/loginCredenciales tradicionales
RegistrationPOST /api/auth/registerCreación de nueva cuenta
GuestPOST /api/auth/guest-loginAcceso temporal solo con nombre
OAuthGET /api/auth/:provider/loginGoogle, GitHub, Twitter
PasskeysPOST /api/auth/passkey/*Biometría FIDO2/WebAuthn

Flujo de Conexión de Reunión

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. El cliente solicita unirse a una sala vía la REST API
  2. El servidor valida permisos y genera un token LiveKit firmado
  3. El cliente se conecta directamente a LiveKit vía WebSocket usando el token
  4. ICE recopila candidatos (host, STUN, TURN) y selecciona la mejor ruta
  5. Las pistas de audio/video fluyen a través del SFU de LiveKit

Consulte Conectividad WebRTC para obtener la pila completa de conectividad.

Modelo de Datos

Usuario

FieldTypeDescription
IDuintClave primaria
EmailstringDirección de correo único
NamestringNombre para mostrar
PasswordstringContraseña hasheada (vacío para OAuth/invitado)
AvatarstringURL del avatar
ProviderstringProveedor de autenticación (local, google, github, twitter, guest)
Rolestringuser o admin

Sala

FieldTypeDescription
IDuintClave primaria
AdminIDuintClave foránea → User.ID (creador de la sala)
NamestringNombre de la sala / slug de URL
IsPublicboolSi los invitados pueden unirse sin invitación
ChatEnabledboolSi el chat en la sala está activo
VideoEnabledboolSi se permite video
Participants[]UserUsuarios actualmente en la sala

Passkey

FieldTypeDescription
IDuintClave primaria
UserIDuintClave foránea → User.ID
CredentialID[]byteID de credencial WebAuthn
PublicKey[]byteClave pública WebAuthn
Counteruint32Contador de firma WebAuthn

RefreshToken

FieldTypeDescription
TokenstringLa cadena del token de actualización
UserIDuintClave foránea → User.ID
ExpiresAttimeMarca de tiempo de expiración del token

Arquitectura de Despliegue

En producción, Bedrud se ejecuta como dos servicios systemd:

ServiceBinaryPurpose
bedrud.servicebedrud --runAPI server + frontend web incrustado
livekit.servicebedrud --livekitServidor multimedia WebRTC

Ambos son gestionados por un solo binario. Traefik u otro proxy inverso maneja la terminación TLS y enruta el tráfico.

Consulte Guía de Despliegue para obtener instrucciones de configuración.

Términos Clave

Estos términos aparecen en toda la documentación de arquitectura:

TermFull NameMeaning
SFUSelective Forwarding UnitUn servidor multimedia que recibe transmisiones de cada participante y las reenvía a otros. Los clientes se conectan al servidor, no entre sí.
SDPSession Description ProtocolEl formato utilizado para describir parámetros de conexión WebRTC (códecs, resoluciones, tipos de medios).
ICEInteractive Connectivity EstablishmentUn marco que recopila todas las rutas de red posibles entre cliente y servidor, luego selecciona la mejor.
STUNSession Traversal Utilities for NATUn protocolo ligero que ayuda a un cliente a descubrir su dirección IP pública. Funciona para la mayoría de las conexiones.
TURNTraversal Using Relays around NATUn protocolo que retransmite todos los medios a través del servidor cuando no es posible una conexión directa. Último recurso, mayor costo de ancho de banda.
NATNetwork Address TranslationUna función del enrutador que asigna direcciones internas privadas a una dirección pública. Puede bloquear conexiones WebRTC directas dependiendo del tipo.
srflxServer ReflexiveUn tipo de candidato ICE que representa la IP pública del cliente, descubierta vía STUN.
WebRTCWeb Real-Time CommunicationEl estándar de API de navegador y móvil para transferencia de audio, video y datos en tiempo real.

Véase También