Bedrud التوثيق

يستخدم بدرود ملفات تهيئة YAML لكل من الخادم الرئيسي وخادم وسائط LiveKit المدمج.

أنظر أيضاً: البداية السريعة | التثبيت | دليل النشر | دليل Docker

الحد الأدنى لتهيئة الإنتاج

التهيئة الافتراضية تعمل للتطوير. للإنتاج، غيّر هذه القيم في /etc/bedrud/config.yaml:

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

أعد التشغيل بعد التغييرات:

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"  # رابط LiveKit الخارجي
  internalHost: "http://127.0.0.1:7880"  # رابط 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"    # رابط الواجهة الأمامية (لإعادة توجيه 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 المُهيّأ. للإنتاج مع تزامن أعلى، انتقل إلى PostgreSQL بتوفير سلسلة اتصال بدلاً من ذلك. عند استخدام PostgreSQL، يحمل حقل path سلسلة اتصال، وليس مسار ملف:

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

المصادقة

يُستخدم jwtSecret لتوقيع رموز الوصول والتحديث. غيّره عن الافتراضي في الإنتاج.

مزوّدو OAuth اختياريون. إذا لم تهيّئهم، لن تظهر أزرار تسجيل الدخول الاجتماعي في الواجهة. كل مزوّد يتطلب تسجيل تطبيق OAuth مع الخدمة المعنية وتوفير معرّف العميل والسر.

CORS

سلسلة allowedOrigins (مفصولة بفواصل) يجب أن تتضمن الرابط الذي تُقدّم منه واجهتك الأمامية. في التطوير، هذا http://localhost:3000. في الإنتاج، اضبطه على نطاقك (مثلاً https://meet.example.com).

تحديد المعدل

يعمل تحديد المعدل على حماية نقاط نهاية المصادقة من هجمات القوة الغاشمة وهجمات حجب الخدمة (DoS). فئتان:

  • نقاط نهاية المصادقة (تسجيل الدخول، التسجيل، التحديث، Passkey) — الافتراضي: 10 طلبات لكل 60 ثانية لكل IP
  • انضمام الضيف — الافتراضي: 5 طلبات لكل 60 ثانية لكل 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، الحد الأقصى 1 ساعة).
  • concurrency — عدد goroutines العامل. قم بزيادته للحصول على إنتاجية أعلى في PostgreSQL. SQLite مقصور على عامل واحد (اتصال واحد).

إشعارات البريد الإلكتروني

يمكن لـ Bedrud إرسال رسائل بريد إلكتروني للمعاملات (الترحيب، إعادة تعيين كلمة المرور، دعوة الغرفة) عبر SMTP.

  • smtpHost / smtpPort — عنوان خادم SMTP. المنفذ 587 (STARTTLS) هو الافتراضي.
  • username / password — بيانات اعتماد SMTP.
  • fromAddress / fromName — هوية المرسل للبريد الإلكتروني الصادر.
  • tlsSkipVerify — تخطي التحقق من شهادة TLS (للشهادات الموقعة ذاتياً).
  • smtpsMode — TLS مباشر (SMTPS، المنفذ 465).

تهيئة 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     # السماح بإلغاء كتم المشاركين من الخادم

keys في livekit.yaml يجب أن يتطابق مع livekit.apiKey و livekit.apiSecret في ملف config.yaml للخادم.

نطاق منافذ RTC

يستخدم LiveKit منافذ UDP لتدفقات الوسائط. النطاق الافتراضي 50000-60000 يعمل لمعظم الإعدادات. إذا كنت تعمل خلف جدار حماية، تأكد من أن هذه المنافذ مفتوحة.

راجع اتصال WebRTC للبنية واستكشاف الأخطاء.

خادم TURN

خادم TURN المدمج يُرحّل الوسائط للعملاء خلف NATs مقيدة أو جدران حماية مؤسسية. مُفعّل افتراضياً على المنفذين ٣٤٧٨ (UDP) و ٥٣٤٩ (TLS).

TURN هو حل أخير - معظم العملاء (~٨٠٪) يتصلون مباشرة عبر UDP ولا يستخدمونه أبداً. عند تفعيل TURN، يحمل الخادم كل عرض نطاق الوسائط المُرحّلة.

متطلب TLS: TURN/TLS (المنفذ ٥٣٤٩) يحتاج شهادة TLS صالحة. للإنتاج، اضبط turn.tls_port: 443 وأشِر cert_file/key_file إلى شهادتك، أو ضع موازن تحميل من الطبقة ٤ أمامه مع 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 - السماح بالكتم/إلغاء الكتم من الخادم للمشاركين (الافتراضي: true)

الضبط للسعة:

  • اجتماعات الفريق الصغير: max_participants: 10-20
  • الندوات الكبيرة: max_participants: 100 (أو ٠ بلا حد)
  • الخوادم محدودة الموارد: اخفض max_participants لتقليل استخدام المعالج/الذاكرة

متغيرات البيئة

يمكن تجاوز قيم التهيئة بمتغيرات البيئة. تتبع التسمية اتفاقية بادئة لكل قسم:

لعمليات نشر 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.trustedProxiesعناوين البروكسي الموثوقة مفصولة بفواصل
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.hostرابط LiveKit الخارجي
LIVEKIT_INTERNAL_HOSTlivekit.internalHostرابط 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.frontendURLرابط الواجهة الأمامية لإعادة توجيه 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 (عبر المثبّت أو البروكسي العكسي)
  • اضبط cors.allowedOrigins على نطاق الإنتاج الخاص بك
  • هيّئ مزوّدي OAuth إذا لزم الأمر
  • افتح نطاق منافذ RTC لـ LiveKit في جدار الحماية
  • أعِد تدوير السجلات لـ /var/log/bedrud/

لإعداد الإنتاج الكامل، راجع دليل النشر.