Bedrud مستندات

بدرود یک monorepo شامل سرور Go، سه اپلیکیشن کلاینت، agentهای Python و پکیج‌های مشترک است. این صفحه نشان می‌دهد اجزا چگونه به هم متصل‌اند.

نمودار سطح بالا

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

اجزا

سرور (server/)

backend Go هسته اصلی بدرود است. وظایف آن:

  • REST API — احراز هویت، مدیریت اتاق، عملیات ادمین
  • فایل‌های استاتیک — frontend کامپایل‌شده با //go:embed در باینری embed شده
  • یکپارچگی LiveKit — تولید token و مدیریت اتاق‌ها با LiveKit Protocol SDK
  • LiveKit داخلی — media server به عنوان فرآیند فرزند اجرا می‌شود

سرور از Fiber (فریم‌ورک وب مشابه Express.js) و GORM (ORM) استفاده می‌کند. SQLite برای توسعه، PostgreSQL برای production.

برای جزئیات معماری سرور را ببینید.

فرانت‌اند وب (apps/web/)

اپلیکیشن React با TanStack Start، TailwindCSS v4 و shadcn/ui. در production، SSR انجام می‌شود و assetها در باینری Go embed می‌شوند.

قابلیت‌های کلیدی:

  • Web UI جلسه ویدیویی با LiveKit Client SDK
  • احراز هویت مبتنی بر JWT با تازه‌سازی خودکار توکن
  • داشبورد ادمین برای مدیریت کاربران و اتاق‌ها
  • سیستم طراحی با کتابخانه کامپوننت سازگار

برای جزئیات به فرانت‌اند وب ببینید.

اپلیکیشن Android (apps/android/)

یک اپلیکیشن بومی Android ساخته شده با Jetpack Compose و Kotlin. از Koin برای تزریق وابستگی و Retrofit برای HTTP استفاده می‌کند.

قابلیت‌های کلیدی:

  • تجربه کامل جلسه ویدیویی با LiveKit Android SDK
  • حالت تصویر در تصویر
  • مدیریت لینک عمیق (bedrud.com/m/* و bedrud.com/c/*)
  • مدیریت تماس با ConnectionService اندروید
  • پشتیبانی چند نمونه (اتصال به چندین سرور)

برای جزئیات به اپلیکیشن Android ببینید.

اپلیکیشن iOS (apps/ios/)

یک اپلیکیشن بومی iOS ساخته شده با SwiftUI. از KeychainAccess برای ذخیره امن اعتبارنامه و LiveKit Swift SDK برای مدیا استفاده می‌کند.

قابلیت‌های کلیدی:

  • تجربه کامل جلسه ویدیویی
  • پشتیبانی چند نمونه
  • مدیریت لینک عمیق
  • ذخیره امن مبتنی بر Keychain

برای جزئیات به اپلیکیشن iOS ببینید.

اپلیکیشن دسکتاپ (apps/desktop/)

یک اپلیکیشن دسکتاپ بومی Windows و Linux ساخته شده با Rust و جعبه ابزار UI Slint. به یک باینری تکی کامپایل می‌شود بدون وابستگی‌های زمان اجرا.

قابلیت‌های کلیدی:

  • تجربه کامل جلسه ویدیویی از طریق LiveKit Rust SDK
  • رندر بومی Windows (Direct3D 11) و Linux (OpenGL/Vulkan)
  • پشتیبانی چند نمونه (اتصال به چندین سرور بدرود)
  • یکپارچی با keyring سیستم‌عامل برای ذخیره امن اعتبارنامه

برای جزئیات به اپلیکیشن دسکتاپ ببینید.

عوامل ربات (agents/)

اسکریپت‌های Python که به عنوان ربات به اتاق‌های جلسه می‌پیوندند و محتوای مدیا را استریم می‌کنند:

  • عامل موزیک - فایل‌های صوتی را پخش می‌کند
  • عامل رادیو - ایستگاه‌های رادیو اینترنتی را استریم می‌کند
  • عامل استریم ویدیو - محتوای ویدیویی را به اشتراک می‌گذارد (HLS، MP4)

برای جزئیات به عوامل ربات ببینید.

جریان احراز هویت

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

همه درخواست‌های احراز هویت شده از توکن‌های JWT در هدر Authorization استفاده می‌کنند. wrapper authFetch فرانت‌اند وب پیوست توکن و تازه‌سازی خودکار را مدیریت می‌کند.

روش‌های احراز هویت پشتیبانی شده:

روشEndpointتوضیح
ایمیل/رمز عبورPOST /api/auth/loginاعتبارنامه‌های سنتی
ثبت‌نامPOST /api/auth/registerایجاد حساب جدید
مهمانPOST /api/auth/guest-loginدسترسی موقت فقط با نام
OAuthGET /api/auth/:provider/loginGoogle، GitHub، Twitter
کلیدهای عبورPOST /api/auth/passkey/*بیومتریک FIDO2/WebAuthn

جریان اتصال جلسه

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

۱. کلاینت درخواست پیوستن به اتاق را از طریق REST API می‌دهد ۲. سرور مجوزها را تأیید می‌کند و یک توکن LiveKit امضا شده تولید می‌کند ۳. کلاینت مستقیماً به LiveKit از طریق WebSocket با استفاده از توکن متصل می‌شود ۴. ICE نامزدها را جمع‌آوری می‌کند (host، STUN، TURN) و بهترین مسیر را انتخاب می‌کند ۵. ترک‌های صوتی/ویدیویی از طریق SFU LiveKit جریان می‌یابند

برای پشته اتصال کامل به اتصال WebRTC ببینید.

مدل داده

کاربر

فیلدنوعتوضیح
IDuintکلید اصلی
Emailstringآدرس ایمیل منحصر به فرد
Namestringنام نمایشی
Passwordstringرمز عبور هش شده (خالی برای OAuth/مهمان)
AvatarstringURL آواتار
Providerstringprovider احراز هویت (local، google، github، twitter، guest)
Rolestringuser یا admin

اتاق

فیلدنوعتوضیح
IDuintکلید اصلی
AdminIDuintکلید خارجی → User.ID (سازنده اتاق)
Namestringنام اتاق / slug URL
IsPublicboolآیا مهمانان می‌توانند بدون دعوت بپیوندند
ChatEnabledboolآیا چت در اتاق فعال است
VideoEnabledboolآیا ویدیو مجاز است
Participants[]Userکاربرانی که در حال حاضر در اتاق هستند

کلید عبور

فیلدنوعتوضیح
IDuintکلید اصلی
UserIDuintکلید خارجی → User.ID
CredentialID[]byteشناسه اعتبار WebAuthn
PublicKey[]byteکلید عمومی WebAuthn
Counteruint32تعداد امضای WebAuthn

توکن تازه‌سازی

فیلدنوعتوضیح
Tokenstringرشته توکن تازه‌سازی
UserIDuintکلید خارجی → User.ID
ExpiresAttimeمهر زمان انقضای توکن

معماری استقرار

در تولید، بدرود به عنوان دو سرویس systemd اجرا می‌شود:

سرویسباینریهدف
bedrud.servicebedrud --runسرور API + فرانت‌اند وب جاسازی‌شده
livekit.servicebedrud --livekitmedia server WebRTC

هر دو توسط یک باینری تکی مدیریت می‌شوند. Traefik یا reverse proxy دیگر خاتمه TLS را مدیریت می‌کند و ترافیک را مسیریابی می‌کند.

برای دستورالعمل‌های تنظیم به راهنمای استقرار ببینید.

اصطلاحات کلیدی

این اصطلاحات در سرتاسر مستندات معماری ظاهر می‌شوند:

اصطلاحنام کاملمعنی
SFUواحد ارسال انتخابییک media server که جریان‌ها را از هر شرکت‌کننده دریافت می‌کند و به دیگران ارسال می‌کند. کلاینت‌ها به سرور متصل می‌شوند، نه به همدیگر.
SDPپروتکل توضیح جلسهفرمت استفاده شده برای توصیف پارامترهای اتصال WebRTC (کدک‌ها، رزولوشن‌ها، انواع مدیا).
ICEایجاد اتصال تعاملییک چارچوب که تمام مسیرهای شبکه ممکن بین کلاینت و سرور را جمع‌آوری می‌کند، سپس بهترین را انتخاب می‌کند.
STUNابزارهای عبور جلسه برای NATیک پروتکل سبک که به کلاینت کمک می‌کند آدرس IP عمومی خود را کشف کند. برای اکثر اتصالات کار می‌کند.
TURNعبور با استفاده از رله‌ها در اطراف NATیک پروتکل که تمام مدیا را از طریق سرور رله می‌کند وقتی اتصال مستقیم غیرممکن است. آخرین راه حل، بالاترین هزینه پهنای باند.
NATترجمه آدرس شبکهیک ویژگی روتر که آدرس‌های خصوصی داخلی را به یک آدرس عمومی نگاشت می‌کند. بسته به نوع می‌تواند اتصال مستقیم WebRTC را مسدود کند.
srflxبازتابی سروریک نوع نامزد ICE که نشان‌دهنده IP عمومی کلاینت است، کشف شده از طریق STUN.
WebRTCارتباط زمان واقعی وباستاندارد API مرورگر و موبایل برای انتقال صدا، ویدیو و داده در زمان واقعی.

همچنین ببینید