Bedrud التوثيق

بدرود هو مستودع أحادي (monorepo) يحتوي على خادم Go، وثلاثة تطبيقات عميل، ووكلاء بوت 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/)

خلفية Go هي نواة بدرود. تتولى ما يلي:

  • REST API - المصادقة، إدارة الغرف، عمليات المسؤول
  • خدمة الملفات الثابتة - واجهة الويب المُجمَّعة مدمجة عبر //go:embed
  • تكامل LiveKit - ينشئ الرموز ويدير الغرف عبر LiveKit Protocol SDK
  • خادم LiveKit المدمج - يعمل كعملية فرعية للخادم

يستخدم الخادم إطار عمل الويب Fiber (مشابه لـ Express.js في Node.js) وGORM كطبقة ORM. يدعم SQLite للتطوير وPostgreSQL للإنتاج.

للتفاصيل راجع بنية الخادم.

واجهة الويب (apps/web/)

تطبيق React مبني بـ TanStack Start وTailwindCSS v4 وshadcn/ui. في الإنتاج، يُعرَض مسبقًا على الخادم وتُدمَج أصول العميل في الملف الثنائي Go.

القدرات الأساسية:

  • واجهة اجتماعات الفيديو مع 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
  • دعم تعدد المثيلات (الاتصال بعدة خوادم)

للتفاصيل راجع تطبيق Android.

تطبيق iOS (apps/ios/)

تطبيق iOS أصلي مبني بـ SwiftUI. يستخدم KeychainAccess لتخزين بيانات الاعتماد بأمان وLiveKit Swift SDK للوسائط.

القدرات الأساسية:

  • تجربة اجتماعات فيديو كاملة
  • دعم تعدد المثيلات
  • معالجة الروابط العميقة
  • تخزين آمن قائم على Keychain

للتفاصيل راجع تطبيق iOS.

تطبيق سطح المكتب (apps/desktop/)

تطبيق أصلي لـ Windows وLinux مبني بـ Rust وأدوات واجهة المستخدم 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. مغلف authFetch في واجهة الويب يتولى إرفاق الرموز وتحديثها تلقائيًا.

طرق المصادقة المدعومة:

الطريقةنقطة النهايةالوصف
البريد/كلمة المرور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/ضيف)
Avatarstringرابط الصورة الرمزية
Providerstringمزود المصادقة (local، google، github، twitter، guest)
Rolestringuser أو admin

الغرفة

الحقلالنوعالوصف
IDuintالمفتاح الأساسي
AdminIDuintمفتاح خارجي ← User.ID (منشئ الغرفة)
Namestringاسم الغرفة / slug الرابط
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 --livekitخادم وسائط WebRTC

كلاهما يُدار بملف ثنائي واحد. يتولى Traefik أو وكيل عكسي آخر إنهاء TLS وتوجيه حركة المرور.

للتفاصيل راجع دليل النشر.

المصطلحات الأساسية

تظهر هذه المصطلحات في أنحاء وثائق البنية:

المصطلحالاسم الكاملالمعنى
SFUوحدة الإرسال الانتقائيخادم وسائط يستقبل التدفقات من كل مشارك ويعيد توجيهها للآخرين. يتصل العملاء بالخادم، وليس ببعضهم.
SDPبروتوكول وصف الجلسةالتنسيق المستخدم لوصف معلمات اتصال WebRTC (الترميزات، الدقات، أنواع الوسائط).
ICEإنشاء الاتصال التفاعليإطار عمل يجمع جميع مسارات الشبكة الممكنة بين العميل والخادم، ثم يختار أفضلها.
STUNأدوات عبور الجلسة لـ NATبروتوكول خفيف يساعد العميل على اكتشاف عنوان IP العام الخاص به. يعمل لمعظم الاتصالات.
TURNالعبور باستخدام المرحلات حول NATبروتوكول يُرحِّل جميع الوسائط عبر الخادم عندما يكون الاتصال المباشر مستحيلًا. الملاذ الأخير، أعلى تكلفة عرض نطاق.
NATترجمة عناوين الشبكةميزة في الموجه تربط العناوين الخاصة الداخلية بعنوان عام واحد. قد تمنع اتصال WebRTC المباشر حسب النوع.
srflxالانعكاسي الخادمينوع من مرشحي ICE يمثل عنوان IP العام للعميل، المكتشف عبر STUN.
WebRTCاتصال الويب في الوقت الفعليمعيار API للمتصفح والهاتف المحمول لنقل الصوت والفيديو والبيانات في الوقت الفعلي.

انظر أيضًا