Bedrud مستندات

بدرود از فایل‌های پیکربندی YAML برای سرور اصلی و media server LiveKit جاسازی‌شده استفاده می‌کند.

همچنین ببینید: شروع سریع | نصب | راهنمای استقرار | راهنمای Docker

پیکربندی حداقل تولید

تنظیمات پیش‌فرض برای توسعه کار می‌کند. برای تولید، این مقادیر را در /etc/bedrud/config.yaml تغییر دهید:

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

پس از تغییرات restart کنید:

sudo systemctl restart bedrud livekit

مرجع کامل در زیر.


پیکربندی سرور

مکان: server/config.yaml (توسعه) یا /etc/bedrud/config.yaml (تولید)

مرجع کامل

server:
  port: 8090                    # پورت HTTP
  host: "localhost"             # آدرس اتصال
  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"                # نوع دیتابیس: sqlite یا postgres
  path: "data.db"               # مسیر فایل دیتابیس SQLite
 
logger:
  level: "debug"                # سطح لاگ: debug، info، warn، error. لاگ‌های برنامه و کوئری‌های SQL را کنترل می‌کند.
  outputPath: ""                # مسیر فایل لاگ (خالی = stdout)
 
livekit:
  host: "http://localhost:8090/livekit"  # URL خارجی LiveKit
  internalHost: "http://127.0.0.1:7880"  # URL داخلی LiveKit
  apiKey: "devkey"              # کلید API LiveKit (auto-generated if empty)
  apiSecret: "devsecret"        # رمز API LiveKit
 
auth:
  jwtSecret: "your-jwt-secret"           # رمز برای امضای توکن‌های JWT
  tokenDuration: 24                       # انقضای توکن به ساعت
  sessionSecret: "your-session-secret"    # رمز برای کوکی‌های جلسه
  frontendURL: "http://localhost:8090"    # URL فرانت‌اند (برای تغییر مسیر OAuth)
  passkeyChallengeTTL: 5                # مدت اعتبار چالش Passkey به دقیقه
 
  # فراهم‌کنندگان OAuth (اختیاری)
  google:
    clientId: ""
    clientSecret: ""
  github:
    clientId: ""
    clientSecret: ""
  twitter:
    clientKey: ""
    clientSecret: ""
 
cors:
  allowedOrigins: "http://localhost:8090,http://localhost:3000"  # با کاما جدا شده
  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

تنظیمات کلیدی

دیتابیس

پیش‌فرض SQLite است (فایل در path). برای concurrency بالا، به PostgreSQL سوییچ کنید. وقتی type: "postgres" باشد، فیلد path رشته اتصال را نگه می‌دارد، نه مسیر فایل:

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

احراز هویت

jwtSecret برای امضای access token و refresh token استفاده می‌شود. حتماً در production تغییرش دهید.

Providerهای OAuth اختیاری‌اند. اگر پیکربندی نشوند، دکمه‌های ورود اجتماعی نمایش داده نمی‌شوند. هر provider نیاز به ثبت اپلیکیشن OAuth و ارائه Client ID و Client Secret دارد.

CORS

allowedOrigins (با کاما جدا شده) باید شامل URL فرانت‌اند باشد. در توسعه: http://localhost:3000. در production: دامنه خودتان (مثلاً https://meet.example.com).

محدودیت نرخ

محدودیت نرخ از نقاط پایانی احراز هویت در برابر حملات brute-force و DoS محافظت می‌کند. دو دسته:

  • نقاط پایانی احراز هویت (ورود، ثبت‌نام، تازه‌سازی، Passkey) — پیش‌فرض: ۱۰ درخواست در ۶۰ ثانیه به ازای هر IP
  • ورود مهمان — پیش‌فرض: ۵ درخواست در ۶۰ ثانیه به ازای هر IP

بخش rateLimit را حذف کنید تا از مقادیر پیش‌فرض استفاده شود. برای غیرفعال کردن، authMaxRequests: 0 یا guestMaxRequests: 0 را تنظیم کنید.

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.

صف (سیستم وظایف)

صف وظایف داخلی، وظایف ناهمزمان پس‌زمینه مانند حذف کاربر/اتاق، تعلیق و آپلودهای چت را پردازش می‌کند.

  • pollInterval — چند وقت یکبار کارگر وظایف جدید را بررسی می‌کند (بر حسب میلی‌ثانیه). مقادیر کمتر تأخیر را کاهش می‌دهد اما به قیمت پرس‌وجوهای بیشتر پایگاه داده.
  • maxAttempts — حداکثر تعداد تلاش‌های مجدد قبل از علامت‌گذاری یک وظیفه به عنوان ناموفق. تلاش‌های مجدد از عقب‌نشینی نمایی استفاده می‌کنند (2^تلاش * 5s، سقف ۱ ساعت).
  • concurrency — تعداد گوروتین‌های کارگر. برای توان عملیاتی بالاتر در PostgreSQL افزایش دهید. SQLite به یک کارگر (یک اتصال) محدود است.

اعلان‌های ایمیل

Bedrud می‌تواند ایمیل‌های تراکنشی (خوش‌آمدگویی، بازنشانی رمز عبور، دعوت به اتاق) را از طریق SMTP ارسال کند.

  • smtpHost / smtpPort — آدرس سرور SMTP. پورت ۵۸۷ (STARTTLS) پیش‌فرض است.
  • username / password — اعتبارنامه SMTP.
  • fromAddress / fromName — هویت فرستنده برای ایمیل‌های خروجی.
  • tlsSkipVerify — رد کردن تأیید گواهی TLS (برای گواهی‌های خودامضا).
  • smtpsMode — TLS مستقیم (SMTPS، پورت ۴۶۵).

پیکربندی LiveKit

مکان: server/config/livekit.yaml (توسعه) یا /etc/bedrud/livekit.yaml (تولید)

port: 7880                      # پورت HTTP/WebSocket LiveKit
 
rtc:
  port_range_start: 50000       # شروع محدوده پورت UDP
  port_range_end: 60000         # پایان محدوده پورت UDP
  use_external_ip: true         # استفاده از IP خارجی برای RTC
 
turn:
  enabled: true
  domain: "localhost"
  tls_port: 5349
  udp_port: 3478
 
keys:
  devkey: "devsecret"           # باید با تنظیمات سرور مطابقت داشته باشد
 
logging:
  level: info
 
room:
  auto_create: true              # ایجاد خودکار اتاق‌ها هنگام پیوستن شرکت‌کنندگان
  empty_timeout: 60              # ثانیه قبل از حذف اتاق خالی
  departure_timeout: 60          # ثانیه برای نگه داشتن اتاق پس از خروج همه شرکت‌کنندگان
  max_participants: 20           # حداکثر شرکت‌کننده در هر اتاق (۰ = نامحدود)
  enable_remote_unmute: true     # اجازه unmute سمت سرور شرکت‌کنندگان

keys در livekit.yaml باید با livekit.apiKey و livekit.apiSecret در config.yaml سرور مطابقت داشته باشد.

محدوده پورت RTC

LiveKit از پورت‌های UDP برای جریان‌های مدیا استفاده می‌کند. محدوده پیش‌فرض 50000-60000 برای اکثر تنظیمات کار می‌کند. اگر پشت فایروال اجرا می‌شود، اطمینان حاصل کنید که این پورت‌ها باز هستند.

برای معماری و عیب‌یابی به اتصال WebRTC ببینید.

سرور TURN

سرور TURN جاسازی‌شده مدیا را برای کلاینت‌های پشت NAT‌های محدود یا فایروال‌های شرکتی رله می‌کند. به طور پیش‌فرض در پورت‌های ۳۴۷۸ (UDP) و ۵۳۴۹ (TLS) فعال است.

TURN یک رله آخرین راه حل است - اکثر کلاینت‌ها (~۸۰٪) مستقیماً از طریق UDP متصل می‌شوند و هرگز از آن استفاده نمی‌کنند. هنگامی که TURN فعال می‌شود، سرور تمام پهنای باند مدیا رله‌شده را حمل می‌کند.

نیاز TLS: TURN/TLS (پورت ۵۳۴۹) به گواهی TLS معتبر نیاز دارد. برای تولید، turn.tls_port: 443 را تنظیم کنید و cert_file/key_file را به گواهی خود اشاره دهید، یا یک load balancer لایه ۴ جلوی آن با external_tls: true قرار دهید.

برای معماری، جزئیات تنظیمات، محاسبات پهنای باند و عیب‌یابی به راهنمای سرور TURN ببینید.

Webhook (تشخیص قطع اتصال)

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.

تنظیمات اتاق

بخش room: رفتار اتاق جلسه را کنترل می‌کند:

  • auto_create - ایجاد خودکار اتاق‌ها هنگام پیوستن شرکت‌کنندگان (پیش‌فرض: true)
  • empty_timeout - ثانیه قبل از حذف اتاقی که هرگز به آن نپیوستند (پیش‌فرض: 60)
  • departure_timeout - ثانیه برای نگه داشتن اتاق فعال پس از خروج همه شرکت‌کنندگان (پیش‌فرض: 60)
  • max_participants - حداکثر شرکت‌کننده در هر اتاق. برای محدودیت نداشتن ۰ تنظیم کنید (پیش‌فرض: 20)
  • enable_remote_unmute - اجازه unmute/mute سمت سرور شرکت‌کنندگان (پیش‌فرض: true)

تنظیم برای ظرفیت:

  • جلسات تیم کوچک: max_participants: 10-20
  • وبینارهای بزرگ: max_participants: 100 (یا ۰ برای نامحدود)
  • سرورهای با محدودیت منابع: max_participants را برای کاهش استفاده از CPU/حافظه کم کنید

متغیرهای محیطی

مقادیر پیکربندی می‌توانند با متغیرهای محیطی جایگزین شوند. نام‌گذاری یک قرارداد پیشوند بخشی دنبال می‌کند:

برای استقرار Docker، به راهنمای Docker ببینید.

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

مرجع کامل متغیر محیطی

متغیر محیطیمسیر YAMLتوضیح
SERVER_PORTserver.portپورت شنیدن HTTP
SERVER_ENABLE_TLSserver.enableTLSفعال کردن HTTPS (true/false)
SERVER_CERT_FILEserver.certFileمسیر به گواهی TLS
SERVER_KEY_FILEserver.keyFileمسیر به کلید خصوصی TLS
SERVER_DOMAINserver.domainنام دامنه
SERVER_EMAILserver.emailایمیل برای Let’s Encrypt
SERVER_USE_ACMEserver.useACMEفعال کردن Let’s Encrypt خودکار (true/false)
SERVER_TRUSTED_PROXIESserver.trustedProxiesIP‌های پروکسی قابل اعتماد با کاما جدا شده
SERVER_PROXY_HEADERserver.proxyHeaderهدر برای خواندن IP کلاینت از (مثلاً X-Forwarded-For)
DB_HOSTdatabase.hostمیزبان دیتابیس (PostgreSQL)
DB_PORTdatabase.portپورت دیتابیس
DB_USERdatabase.userکاربر دیتابیس
DB_PASSWORDdatabase.passwordرمز عبور دیتابیس
DB_NAMEdatabase.dbnameنام دیتابیس
DB_TYPEdatabase.typesqlite یا postgres
DB_PATHdatabase.pathمسیر فایل SQLite یا رشته اتصال PostgreSQL
LIVEKIT_HOSTlivekit.hostURL خارجی LiveKit
LIVEKIT_INTERNAL_HOSTlivekit.internalHostURL داخلی LiveKit
LIVEKIT_API_KEYlivekit.apiKeyکلید API LiveKit (auto-generated as gen-<32hex> if empty)
LIVEKIT_API_SECRETlivekit.apiSecretرمز API LiveKit (64-char hex auto-generated if empty)
JWT_SECRETauth.jwtSecretرمز برای امضای توکن‌های JWT
AUTH_FRONTEND_URLauth.frontendURLURL فرانت‌اند برای تغییر مسیر OAuth
AUTH_PASSKEY_CHALLENGE_TTLauth.passkeyChallengeTTLمدت اعتبار چالش Passkey به دقیقه
CORS_ALLOWED_ORIGINScors.allowedOriginsمبدأهای مجاز با کاما جدا شده
CORS_ALLOWED_HEADERScors.allowedHeadersهدرهای درخواست مجاز
CORS_ALLOWED_METHODScors.allowedMethodsمتدهای HTTP مجاز
CORS_ALLOW_CREDENTIALScors.allowCredentialsاجازه اعطا اعتبار (true/false)
CORS_EXPOSE_HEADERScors.exposeHeadersهدرهای در معرض مرورگر
CORS_MAX_AGEcors.maxAgeمدت کش پیش‌پرواز به ثانیه
RATELIMIT_AUTH_MAXrateLimit.authMaxRequestsحداکثر درخواست‌های احراز هویت در هر پنجره
RATELIMIT_AUTH_WINDOWrateLimit.authWindowSecsپنجره محدودیت نرخ احراز هویت (ثانیه)
RATELIMIT_GUEST_MAXrateLimit.guestMaxRequestsحداکثر درخواست‌های ورود مهمان در هر پنجره
RATELIMIT_GUEST_WINDOWrateLimit.guestWindowSecsپنجره محدودیت نرخ مهمان (ثانیه)
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

چک‌لیست تولید

  • jwtSecret و sessionSecret را به مقادیر تصادفی قوی تغییر دهید
  • logger.level را روی info یا warn تنظیم کنید
  • TLS را پیکربندی کنید (از طریق نصب‌کننده یا reverse proxy)
  • cors.allowedOrigins را به دامنه تولید خود تنظیم کنید
  • در صورت نیاز فراهم‌کنندگان OAuth را پیکربندی کنید
  • محدوده پورت RTC LiveKit را در فایروال خود باز کنید
  • چرخش لاگ را برای /var/log/bedrud/ تنظیم کنید

برای تنظیم کامل تولید، به راهنمای استقرار ببینید.