بدرود از فایلهای پیکربندی 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 to0for unlimited.messageTTLHours— messages older than this threshold are purged from the local cache. Default: 2160 (90 days). Set to0to 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
recordingsAllowedtoggle 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_MBstorageDir— directory for disk-backed recordings. Only used when S3 is not configured. Default:./data/recordings. Env:RECORDING_STORAGE_DIRmaxRecordingsPerRoom— 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:
| Event | Action |
|---|---|
participant_disconnected | Marks participant as inactive in room_participants |
room_finished | Marks 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_PORT | server.port | پورت شنیدن HTTP |
SERVER_ENABLE_TLS | server.enableTLS | فعال کردن HTTPS (true/false) |
SERVER_CERT_FILE | server.certFile | مسیر به گواهی TLS |
SERVER_KEY_FILE | server.keyFile | مسیر به کلید خصوصی TLS |
SERVER_DOMAIN | server.domain | نام دامنه |
SERVER_EMAIL | server.email | ایمیل برای Let’s Encrypt |
SERVER_USE_ACME | server.useACME | فعال کردن Let’s Encrypt خودکار (true/false) |
SERVER_TRUSTED_PROXIES | server.trustedProxies | IPهای پروکسی قابل اعتماد با کاما جدا شده |
SERVER_PROXY_HEADER | server.proxyHeader | هدر برای خواندن IP کلاینت از (مثلاً X-Forwarded-For) |
DB_HOST | database.host | میزبان دیتابیس (PostgreSQL) |
DB_PORT | database.port | پورت دیتابیس |
DB_USER | database.user | کاربر دیتابیس |
DB_PASSWORD | database.password | رمز عبور دیتابیس |
DB_NAME | database.dbname | نام دیتابیس |
DB_TYPE | database.type | sqlite یا postgres |
DB_PATH | database.path | مسیر فایل SQLite یا رشته اتصال PostgreSQL |
LIVEKIT_HOST | livekit.host | URL خارجی LiveKit |
LIVEKIT_INTERNAL_HOST | livekit.internalHost | URL داخلی LiveKit |
LIVEKIT_API_KEY | livekit.apiKey | کلید API LiveKit (auto-generated as gen-<32hex> if empty) |
LIVEKIT_API_SECRET | livekit.apiSecret | رمز API LiveKit (64-char hex auto-generated if empty) |
JWT_SECRET | auth.jwtSecret | رمز برای امضای توکنهای JWT |
AUTH_FRONTEND_URL | auth.frontendURL | URL فرانتاند برای تغییر مسیر OAuth |
AUTH_PASSKEY_CHALLENGE_TTL | auth.passkeyChallengeTTL | مدت اعتبار چالش Passkey به دقیقه |
CORS_ALLOWED_ORIGINS | cors.allowedOrigins | مبدأهای مجاز با کاما جدا شده |
CORS_ALLOWED_HEADERS | cors.allowedHeaders | هدرهای درخواست مجاز |
CORS_ALLOWED_METHODS | cors.allowedMethods | متدهای HTTP مجاز |
CORS_ALLOW_CREDENTIALS | cors.allowCredentials | اجازه اعطا اعتبار (true/false) |
CORS_EXPOSE_HEADERS | cors.exposeHeaders | هدرهای در معرض مرورگر |
CORS_MAX_AGE | cors.maxAge | مدت کش پیشپرواز به ثانیه |
RATELIMIT_AUTH_MAX | rateLimit.authMaxRequests | حداکثر درخواستهای احراز هویت در هر پنجره |
RATELIMIT_AUTH_WINDOW | rateLimit.authWindowSecs | پنجره محدودیت نرخ احراز هویت (ثانیه) |
RATELIMIT_GUEST_MAX | rateLimit.guestMaxRequests | حداکثر درخواستهای ورود مهمان در هر پنجره |
RATELIMIT_GUEST_WINDOW | rateLimit.guestWindowSecs | پنجره محدودیت نرخ مهمان (ثانیه) |
LIVEKIT_CONFIG_PATH | livekit.configPath | Path to external LiveKit YAML config |
LIVEKIT_NODE_IP | livekit.nodeIP | Explicit node IP for embedded LiveKit RTC (disables STUN) |
SERVER_CERT_ALGORITHM | server.certAlgorithm | Key algorithm for cert generation: ed25519, ecdsa256, rsa2048, rsa4096 |
SERVER_MAX_PARTICIPANTS_LIMIT | server.maxParticipantsLimit | Hard ceiling for room capacity (default 1000) |
SERVER_MAX_ROOMS_PER_USER | server.maxRoomsPerUser | Max active rooms per user (default 100, 0 = unlimited) |
CHAT_MAX_UPLOAD_BYTES_PER_USER | chat.maxUploadBytesPerUser | Per-user upload quota in bytes (default 524288000, 0 = unlimited) |
CHAT_GLOBAL_DISK_THRESHOLD_BYTES | chat.globalDiskThresholdBytes | Global upload storage ceiling in bytes (default 0 = unlimited) |
CHAT_MAX_MESSAGE_COUNT | chat.maxMessageCount | Max chat messages kept per room (default 10000, 0 = unlimited) |
CHAT_MESSAGE_TTL_HOURS | chat.messageTTLHours | Max age of chat messages in hours (default 2160 = 90 days, 0 = forever) |
QUEUE_POLL_INTERVAL | queue.pollInterval | Job poll interval in ms (default 500) |
QUEUE_MAX_ATTEMPTS | queue.maxAttempts | Max job retries before marking failed (default 3) |
QUEUE_CONCURRENCY | queue.concurrency | Worker goroutine count (default 1) |
EMAIL_SMTP_HOST | email.smtpHost | SMTP server hostname |
EMAIL_SMTP_PORT | email.smtpPort | SMTP server port (default 587) |
EMAIL_USERNAME | email.username | SMTP username |
EMAIL_PASSWORD | email.password | SMTP password |
EMAIL_FROM_ADDRESS | email.fromAddress | From email address |
EMAIL_FROM_NAME | email.fromName | From display name (default “Bedrud”) |
EMAIL_TLS_SKIP_VERIFY | email.tlsSkipVerify | Skip TLS certificate validation for self-signed SMTP certs |
EMAIL_SMTPS_MODE | email.smtpsMode | Enable direct TLS (SMTPS) mode for port 465 |
چکلیست تولید
-
jwtSecretوsessionSecretرا به مقادیر تصادفی قوی تغییر دهید -
logger.levelرا رویinfoیاwarnتنظیم کنید - TLS را پیکربندی کنید (از طریق نصبکننده یا reverse proxy)
-
cors.allowedOriginsرا به دامنه تولید خود تنظیم کنید - در صورت نیاز فراهمکنندگان OAuth را پیکربندی کنید
- محدوده پورت RTC LiveKit را در فایروال خود باز کنید
- چرخش لاگ را برای
/var/log/bedrud/تنظیم کنید
برای تنظیم کامل تولید، به راهنمای استقرار ببینید.