Bedrud Belgeler

Bedrud, hem ana sunucu hem de gömülü LiveKit medya sunucusu için YAML yapılandırma dosyaları kullanır.

Ayrıca bkz.: Hızlı Başlangıç | Kurulum | Dağıtım Kılavuzu | Docker Kılavuzu

Minimum Üretim Yapılandırması

Varsayılan yapılandırma geliştirme için çalışır. Üretim için /etc/bedrud/config.yaml dosyasındaki şu değerleri değiştirin:

auth:
  jwtSecret: "change-to-random-string-32-chars"
  sessionSecret: "change-to-another-random-string"

Değişikliklerden sonra yeniden başlatın:

sudo systemctl restart bedrud livekit

Aşağıda tam referans.


Sunucu Yapılandırması

Konum: server/config.yaml (geliştirme) veya /etc/bedrud/config.yaml (üretim)

Tam Referans

server:
  port: 8090                    # HTTP bağlantı noktası
  host: "localhost"             # Bağlanma adresi
  maxParticipantsLimit: 1000    # Hard ceiling for room capacity (0 = unlimited). Env: SERVER_MAX_PARTICIPANTS_LIMIT
  maxRoomsPerUser: 100          # Max active rooms per user (0 = unlimited). Env: SERVER_MAX_ROOMS_PER_USER
 
database:
  type: "sqlite"                # Veritabanı türü: sqlite veya postgres
  path: "data.db"               # SQLite veritabanı dosya yolu
 
logger:
  level: "debug"                # Günlük seviyesi: debug, info, warn, error. Uygulama ve SQL sorgu günlüklerini kontrol eder.
  outputPath: ""                # Günlük dosya yolu (boş = stdout)
 
livekit:
  host: "http://localhost:8090/livekit"  # Harici LiveKit URL'si
  internalHost: "http://127.0.0.1:7880"  # Dahili LiveKit URL'si
  apiKey: "devkey"              # LiveKit API anahtarı (auto-generated if empty)
  apiSecret: "devsecret"        # LiveKit API gizli anahtarı
 
auth:
  jwtSecret: "your-jwt-secret"           # JWT jetonlarını imzalamak için gizli anahtar
  tokenDuration: 24                       # Jeton geçerlilik süresi (saat)
  sessionSecret: "your-session-secret"    # Oturum çerezleri için gizli anahtar
  frontendURL: "http://localhost:8090"    # Önyüz URL'si (OAuth yönlendirmeleri için)
  passkeyChallengeTTL: 5                # Passkey meydan okuma süresi (dakika)
 
  # OAuth sağlayıcıları (isteğe bağlı)
  google:
    clientId: ""
    clientSecret: ""
  github:
    clientId: ""
    clientSecret: ""
  twitter:
    clientKey: ""
    clientSecret: ""
 
cors:
  allowedOrigins: "http://localhost:8090,http://localhost:3000"  # Virgülle ayrılmış
  allowedHeaders: "Origin, Content-Type, Accept, Authorization"
  allowedMethods: "GET, POST, PUT, DELETE, OPTIONS"
  allowCredentials: true
 
rateLimit:
  authMaxRequests: 10       # Max auth requests per window (login, register, refresh, passkey). 0 = disable
  authWindowSecs: 60         # Auth rate limit window in seconds
  guestMaxRequests: 5        # Max guest join requests per window. 0 = disable
  guestWindowSecs: 60        # Guest rate limit window in seconds
 
chat:
  maxUploadBytesPerUser: 524288000       # Per-user upload quota (500 MB). 0 = unlimited. Env: CHAT_MAX_UPLOAD_BYTES_PER_USER
  globalDiskThresholdBytes: 0            # Global storage ceiling across all users. 0 = unlimited. Env: CHAT_GLOBAL_DISK_THRESHOLD_BYTES
  maxMessageCount: 10000                 # Max chat messages kept per room (0 = unlimited). Env: CHAT_MAX_MESSAGE_COUNT
  messageTTLHours: 2160                  # Purge messages older than this in hours (0 = forever). 2160 = 90 days. Env: CHAT_MESSAGE_TTL_HOURS
 
 
recording:
  maxFileSizeMB: 2048           # Max recording file size in MB (0 = unlimited). Env: RECORDING_MAX_FILE_SIZE_MB
  storageDir: "./data/recordings"  # Local storage path for disk-backed recordings. Env: RECORDING_STORAGE_DIR
  maxRecordingsPerRoom: 100     # Max total recordings per room (0 = unlimited). Env: RECORDING_MAX_PER_ROOM
 
queue:
  pollInterval: 500              # ms between job polls. Env: QUEUE_POLL_INTERVAL
  maxAttempts: 3                 # retries before marking failed. Env: QUEUE_MAX_ATTEMPTS
  concurrency: 1                 # worker goroutines. Env: QUEUE_CONCURRENCY
 
email:
  smtpHost: ""                    # SMTP server hostname. Env: EMAIL_SMTP_HOST
  smtpPort: 587                   # SMTP server port. Env: EMAIL_SMTP_PORT
  username: ""                    # SMTP username. Env: EMAIL_USERNAME
  password: ""                    # SMTP password. Env: EMAIL_PASSWORD
  fromAddress: ""                 # From address. Env: EMAIL_FROM_ADDRESS
  fromName: "Bedrud"              # From display name. Env: EMAIL_FROM_NAME
  tlsSkipVerify: false       # Skip TLS certificate validation. Env: EMAIL_TLS_SKIP_VERIFY
  smtpsMode: false           # Direct TLS (SMTPS, port 465). Env: EMAIL_SMTPS_MODE

Temel Ayarlar

Veritabanı

Varsayılan olarak Bedrud, yapılandırılan path konumundaki bir dosyayla SQLite kullanır. Daha yüksek eşzamanlılık gerektiren üretim için, bunun yerine bir bağlantı dizesi sağlayarak PostgreSQL’e geçin. PostgreSQL kullanırken path alanı bir dosya yolu değil, bağlantı dizesi tutar:

database:
  type: "postgres"
  path: "postgres://user:password@localhost:5432/bedrud?sslmode=disable"

Kimlik Doğrulama

jwtSecret, erişim ve yenileme jetonlarını imzalamak için kullanılır. Üretimde bunu varsayılandan değiştirin.

OAuth sağlayıcıları isteğe bağlıdır. Yapılandırmazsanız, sosyal giriş düğmeleri arayüzde görünmez. Her sağlayıcı, ilgili hizmetle bir OAuth uygulaması kaydetmeyi ve istemci kimliği ile gizli anahtarı sağlamayı gerektirir.

CORS

allowedOrigins dizesi (virgülle ayrılmış), önyüzünüzün sunulduğu URL’yi içermelidir. Geliştirmede bu http://localhost:3000’dir. Üretimde alan adınıza ayarlayın (örn. https://meet.example.com).

Hız Sınırlaması

Hız sınırlaması, kimlik doğrulama uç noktalarını kaba kuvvet ve DoS saldırılarına karşı korur. İki kategori:

  • Kimlik doğrulama uç noktaları (giriş, kayıt, yenileme, passkey giriş/kayıt) — varsayılan: IP başına 60 saniyede 10 istek
  • Misafir katılımı — varsayılan: IP başına 60 saniyede 5 istek

rateLimit bölümünü kaldırarak varsayılanları kullanın. Devre dışı bırakmak için authMaxRequests: 0 veya guestMaxRequests: 0 ayarlayın.

Chat History

Bedrud applies advisory retention limits to in-room chat messages. Since LiveKit — the real-time media layer — does not persist data channel messages server-side, these limits are enforced on the client:

  • maxMessageCount — caps the number of chat messages held in memory and sessionStorage per room. When exceeded, the oldest messages are trimmed. Default: 10000. Set to 0 for unlimited.
  • messageTTLHours — messages older than this threshold are purged from the local cache. Default: 2160 (90 days). Set to 0 to keep messages indefinitely.

Chat messages in Bedrud are transmitted exclusively through LiveKit data channels and are not stored on the server. The retention limits above control how many messages the frontend keeps in memory and sessionStorage. A dedicated chat history service (with server-side persistence) would be needed for true history across sessions — this is tracked as a future enhancement.

Recordings

Room recording is controlled by the RecordingsEnabled system setting (toggle in admin Settings → General). When enabled:

  • Moderators can start/stop composite MP4 recordings from the meeting controls bar
  • Recordings are stored alongside chat uploads using the configured storage backend (disk/S3)
  • Each room has a per-room recordingsAllowed toggle that must also be enabled
  • Failed/pending recordings over 7 days old are automatically cleaned up daily
  • Non-persistent rooms have a configurable per-room recording cap (maxRecordingsPerRoom) to prevent abuse
  • After a room is deleted, the recording creator can still access their recordings from the same room URL

YAML Reference:

  • maxFileSizeMB — maximum file size for a single recording in MB. 0 = unlimited. Default: 2048. Env: RECORDING_MAX_FILE_SIZE_MB
  • storageDir — directory for disk-backed recordings. Only used when S3 is not configured. Default: ./data/recordings. Env: RECORDING_STORAGE_DIR
  • maxRecordingsPerRoom — caps total recordings per room (all statuses: completed, failed, etc.). 0 = unlimited. Only enforced for non-persistent rooms. Default: 100. Env: RECORDING_MAX_PER_ROOM

See the Recordings Guide for full details.

Kuyruk (İş Sistemi)

Dahili iş kuyruğu, kullanıcı/oda silme, askıya alma ve sohbet yükleme gibi asenkron arka plan görevlerini işler.

  • pollInterval — işçinin yeni işleri ne sıklıkta kontrol ettiği (ms cinsinden). Düşük değerler gecikmeyi azaltır ancak daha fazla veritabanı sorgusu anlamına gelir.
  • maxAttempts — bir iş başarısız olarak işaretlenmeden önceki maksimum yeniden deneme sayısı. Yeniden denemeler üstel geri çekilme kullanır (2^deneme * 5s, maksimum 1 saat).
  • concurrency — işçi goroutine sayısı. PostgreSQL’de daha yüksek verim için artırın. SQLite tek işçiyle (tek bağlantı) sınırlıdır.

E-posta Bildirimleri

Bedrud, SMTP üzerinden işlemsel e-postalar (hoş geldiniz, şifre sıfırlama, oda daveti) gönderebilir.

  • smtpHost / smtpPort — SMTP sunucu adresi. Varsayılan olarak 587 numaralı bağlantı noktası (STARTTLS) kullanılır.
  • username / password — SMTP kimlik doğrulama bilgileri.
  • fromAddress / fromName — giden e-postalar için gönderen kimliği.
  • tlsSkipVerify — TLS sertifika doğrulamasını atla (kendi imzalı sertifikalar için).
  • smtpsMode — Doğrudan TLS (SMTPS, bağlantı noktası 465).

LiveKit Yapılandırması

Konum: server/config/livekit.yaml (geliştirme) veya /etc/bedrud/livekit.yaml (üretim)

port: 7880                      # LiveKit HTTP/WebSocket bağlantı noktası
 
rtc:
  port_range_start: 50000       # UDP bağlantı noktası aralığı başlangıcı
  port_range_end: 60000         # UDP bağlantı noktası aralığı sonu
  use_external_ip: true         # RTC için harici IP kullan
 
turn:
  enabled: true
  domain: "localhost"
  tls_port: 5349
  udp_port: 3478
 
keys:
  devkey: "devsecret"           # Sunucu yapılandırmasıyla eşleşmeli
 
logging:
  level: info
 
room:
  auto_create: true              # Katılımcılar katıldığında odaları otomatik oluştur
  empty_timeout: 60              # Boş odayı silmeden önceki saniye
  departure_timeout: 60          # Tüm katılımcılar ayrıldıktan sonra odayı aktif tutma süresi (saniye)
  max_participants: 20           # Oda başına maksimum katılımcı (0 = sınırsız)
  enable_remote_unmute: true     # Katılımcıların sunucu tarafı ses açmasına izin ver

livekit.yaml dosyasındaki keys, sunucunun config.yaml dosyasındaki livekit.apiKey ve livekit.apiSecret ile eşleşmelidir.

RTC Bağlantı Noktası Aralığı

LiveKit, medya akışları için UDP bağlantı noktalarını kullanır. Varsayılan 50000-60000 aralığı çoğu kurulum için çalışır. Bir güvenlik duvarı arkasında çalışıyorsanız, bu bağlantı noktalarının açık olduğundan emin olun.

Mimari ve sorun giderme için bkz. WebRTC Bağlantısı.

TURN Sunucusu

Gömülü TURN sunucusu, kısıtlayıcı NAT’ler veya kurumsal güvenlik duvarları arkasındaki istemciler için medyayı aktarır. Varsayılan olarak 3478 (UDP) ve 5349 (TLS) bağlantı noktalarında etkindir.

TURN son çare aktarıcıdır - çoğu istemci (~%80) doğrudan UDP ile bağlanır ve hiç kullanmaz. TURN etkinleştirildiğinde, sunucu tüm aktarılan medya bant genişliğini taşır.

TLS gereksinimi: TURN/TLS (5349 bağlantı noktası) geçerli bir TLS sertifikası gerektirir. Üretim için turn.tls_port: 443 ayarlayın ve cert_file/key_file dosyalarını sertifikanıza yönlendirin veya önüne external_tls: true ile bir Katman 4 yük dengeleyici yerleştirin.

Mimari, yapılandırma detayları, bant genişliği hesaplamaları ve sorun giderme için bkz. TURN Sunucusu Kılavuzu.

Webhook (bağlantı kesme algılama)

Bedrud receives webhook events from LiveKit to detect when participants disconnect unexpectedly (e.g., browser crash, network drop) and mark them as inactive in the database.

Endpoint: POST /api/livekit/webhook

Authentication: Uses LiveKit JWT signing with the same apiKey/apiSecret. No separate secret needed.

Embedded LiveKit: When Bedrud manages its own LiveKit server (default), the webhook URL is auto-configured in the generated LiveKit YAML. No user action needed.

External LiveKit (Cloud or self-hosted with external: true): Manually configure the webhook URL in your LiveKit dashboard:

https://<your-domain>/api/livekit/webhook

Events handled:

EventAction
participant_disconnectedMarks participant as inactive in room_participants
room_finishedMarks all participants + room as inactive

If apiKey is left empty in config, a random keypair is generated at startup. The embedded LiveKit server and webhook handler both use the same generated key — no manual configuration needed.

Oda Ayarları

room: bölümü toplantı odası davranışını kontrol eder:

  • auto_create - Katılımcılar katıldığında odaları otomatik oluştur (varsayılan: true)
  • empty_timeout - Hiç katılımcı katılmamış bir odayı silmeden önceki saniye (varsayılan: 60)
  • departure_timeout - Tüm katılımcılar ayrıldıktan sonra odayı aktif tutma süresi, saniye (varsayılan: 60)
  • max_participants - Oda başına maksimum katılımcı. Sınır olmaması için 0 ayarlayın (varsayılan: 20)
  • enable_remote_unmute - Katılımcıların sunucu tarafı sesini kapatma/açmasına izin ver (varsayılan: true)

Kapasite için ayarlama:

  • Küçük ekip toplantıları: max_participants: 10-20
  • Büyük web seminerleri: max_participants: 100 (veya sınırsız için 0)
  • Kaynak kısıtlı sunucular: CPU/bellek kullanımını azaltmak için max_participants’ı düşürün

Ortam Değişkenleri

Yapılandırma değerleri ortam değişkenleri ile geçersiz kılınabilir. Adlandırma, bölüm başına bir önek kuralı izler:

Docker dağıtımları için bkz. Docker Kılavuzu.

export SERVER_PORT=8090
export DB_PATH=/var/lib/bedrud/bedrud.db
export JWT_SECRET=production-secret
export LIVEKIT_HOST=http://localhost:8090/livekit
export LIVEKIT_API_KEY=prodkey
export LIVEKIT_API_SECRET=prodsecret

Tam Ortam Değişkeni Referansı

Ortam DeğişkeniYAML YoluAçıklama
SERVER_PORTserver.portHTTP dinleme bağlantı noktası
SERVER_ENABLE_TLSserver.enableTLSHTTPS’yi etkinleştir (true/false)
SERVER_CERT_FILEserver.certFileTLS sertifikasının yolu
SERVER_KEY_FILEserver.keyFileTLS özel anahtarının yolu
SERVER_DOMAINserver.domainAlan adı
SERVER_EMAILserver.emailLet’s Encrypt için e-posta
SERVER_USE_ACMEserver.useACMEOtomatik Let’s Encrypt’i etkinleştir (true/false)
SERVER_TRUSTED_PROXIESserver.trustedProxiesVirgülle ayrılmış güvenilir vekil IP’leri
SERVER_PROXY_HEADERserver.proxyHeaderİstemci IP’sinin okunacağı başlık (örn. X-Forwarded-For)
DB_HOSTdatabase.hostVeritabanı sunucusu (PostgreSQL)
DB_PORTdatabase.portVeritabanı bağlantı noktası
DB_USERdatabase.userVeritabanı kullanıcısı
DB_PASSWORDdatabase.passwordVeritabanı parolası
DB_NAMEdatabase.dbnameVeritabanı adı
DB_TYPEdatabase.typesqlite veya postgres
DB_PATHdatabase.pathSQLite dosya yolu veya PostgreSQL bağlantı dizesi
LIVEKIT_HOSTlivekit.hostHarici LiveKit URL’si
LIVEKIT_INTERNAL_HOSTlivekit.internalHostDahili LiveKit URL’si
LIVEKIT_API_KEYlivekit.apiKeyLiveKit API anahtarı (auto-generated as gen-<32hex> if empty)
LIVEKIT_API_SECRETlivekit.apiSecretLiveKit API gizli anahtarı (64-char hex auto-generated if empty)
JWT_SECRETauth.jwtSecretJWT jetonlarını imzalamak için gizli anahtar
AUTH_FRONTEND_URLauth.frontendURLOAuth yönlendirmeleri için önyüz URL’si
AUTH_PASSKEY_CHALLENGE_TTLauth.passkeyChallengeTTLPasskey meydan okuma süresi (dakika)
CORS_ALLOWED_ORIGINScors.allowedOriginsVirgülle ayrılmış izin verilen kaynaklar
CORS_ALLOWED_HEADERScors.allowedHeadersİzin verilen istek başlıkları
CORS_ALLOWED_METHODScors.allowedMethodsİzin verilen HTTP yöntemleri
CORS_ALLOW_CREDENTIALScors.allowCredentialsKimlik bilgilerine izin ver (true/false)
CORS_EXPOSE_HEADERScors.exposeHeadersTarayıcıya sunulan başlıklar
CORS_MAX_AGEcors.maxAgeÖn uçuş önbellek süresi, saniye
RATELIMIT_AUTH_MAXrateLimit.authMaxRequestsPencere başına maksimum auth isteği
RATELIMIT_AUTH_WINDOWrateLimit.authWindowSecsAuth hız sınırı penceresi (saniye)
RATELIMIT_GUEST_MAXrateLimit.guestMaxRequestsPencere başına maksimum misafir katılım isteği
RATELIMIT_GUEST_WINDOWrateLimit.guestWindowSecsMisafir hız sınırı penceresi (saniye)
LIVEKIT_CONFIG_PATHlivekit.configPathPath to external LiveKit YAML config
LIVEKIT_NODE_IPlivekit.nodeIPExplicit node IP for embedded LiveKit RTC (disables STUN)
SERVER_CERT_ALGORITHMserver.certAlgorithmKey algorithm for cert generation: ed25519, ecdsa256, rsa2048, rsa4096
SERVER_MAX_PARTICIPANTS_LIMITserver.maxParticipantsLimitHard ceiling for room capacity (default 1000)
SERVER_MAX_ROOMS_PER_USERserver.maxRoomsPerUserMax active rooms per user (default 100, 0 = unlimited)
CHAT_MAX_UPLOAD_BYTES_PER_USERchat.maxUploadBytesPerUserPer-user upload quota in bytes (default 524288000, 0 = unlimited)
CHAT_GLOBAL_DISK_THRESHOLD_BYTESchat.globalDiskThresholdBytesGlobal upload storage ceiling in bytes (default 0 = unlimited)
CHAT_MAX_MESSAGE_COUNTchat.maxMessageCountMax chat messages kept per room (default 10000, 0 = unlimited)
CHAT_MESSAGE_TTL_HOURSchat.messageTTLHoursMax age of chat messages in hours (default 2160 = 90 days, 0 = forever)
QUEUE_POLL_INTERVALqueue.pollIntervalJob poll interval in ms (default 500)
QUEUE_MAX_ATTEMPTSqueue.maxAttemptsMax job retries before marking failed (default 3)
QUEUE_CONCURRENCYqueue.concurrencyWorker goroutine count (default 1)
EMAIL_SMTP_HOSTemail.smtpHostSMTP server hostname
EMAIL_SMTP_PORTemail.smtpPortSMTP server port (default 587)
EMAIL_USERNAMEemail.usernameSMTP username
EMAIL_PASSWORDemail.passwordSMTP password
EMAIL_FROM_ADDRESSemail.fromAddressFrom email address
EMAIL_FROM_NAMEemail.fromNameFrom display name (default “Bedrud”)
EMAIL_TLS_SKIP_VERIFYemail.tlsSkipVerifySkip TLS certificate validation for self-signed SMTP certs
EMAIL_SMTPS_MODEemail.smtpsModeEnable direct TLS (SMTPS) mode for port 465

Üretim Kontrol Listesi

  • jwtSecret ve sessionSecret değerlerini güçlü rastgele değerlerle değiştirin
  • logger.level değerini info veya warn olarak ayarlayın
  • TLS yapılandırın (kurucu veya ters vekil sunucu ile)
  • cors.allowedOrigins değerini üretim alan adınıza ayarlayın
  • Gerekirse OAuth sağlayıcılarını yapılandırın
  • Güvenlik duvarınızda LiveKit RTC bağlantı noktası aralığını açın
  • /var/log/bedrud/ için günlük döndürme ayarlayın

Tam üretim kurulumu için bkz. Dağıtım Kılavuzu.