مقدمة
خلفية Bedrud هي منصة اجتماعات بملف ثنائي واحد مكتوبة بـ Go 1.24+. جميع التبعيات - خادم الوسائط، واجهة الويب، خادم TURN - مدمجة في ملف تنفيذي واحد.
التقنيات الأساسية
- إطار العمل الأساسي: Fiber v2 (موجّه بدون تخصيص ذاكرة، واجهة برمجة تشبه Express).
- طبقة قاعدة البيانات: GORM مع دعم لـ SQLite (قياسي) و PostgreSQL (إنتاج).
- محرك الوسائط: LiveKit (مدمج كملف ثنائي شقيق).
- نظام المصادقة: مصادقة متعددة الطبقات تدعم JWT و OAuth2 (Google/GitHub/Twitter) ومفاتيح المرور FIDO2 بدون كلمة مرور.
- الأصول الثابتة المدمجة: يستخدم حزمة
embedفي Go 1.16+ لتجميع واجهة React الأمامية (أصول العميل المُعرَّضة مسبقًا عبر SSR). - النشر: مثبّت تلقائي متكامل لـ Debian/Ubuntu مع تنسيق systemd ودعم ACME (Let’s Encrypt).
لماذا هذه البنية؟
منصات WebRTC تعمل عادةً بخدمات منفصلة للإشارات و TURN وخدمة الويب وإدارة قواعد البيانات. يجمع Bedrud كل هذا في ملف ثنائي واحد عبر:
١. استخراج ملف خادم الوسائط الثنائي أثناء التشغيل. ٢. تمرير حركة الوسائط عبر منفذ HTTP(S) الرئيسي. ٣. أتمتة تهيئة مستوى نظام التشغيل (SSL، systemd) عبر الملف الثنائي نفسه.
البنية عالية المستوى
تتبع الخلفية بنية طبقية قياسية:
١. طبقة الخادم (internal/server): تُعد تطبيق Fiber والمسارات والبرمجيات الوسيطة.
٢. طبقة المعالجات (internal/handlers): تدير طلبات واستجابات HTTP.
٣. طبقة المستودعات (internal/repository): تتعامل مع استعلامات قاعدة البيانات باستخدام GORM.
٤. طبقة النماذج (internal/models): تُعرّف جداول قاعدة البيانات وبنى Go.
٥. طبقة الخدمات/المنطق: مدمجة في المعالجات والمستودعات للتبسيط، مع حزم متخصصة مثل internal/auth و internal/livekit.
نقطة الدخول الرئيسية
يبدأ التطبيق في server/cmd/bedrud/main.go. يعمل بثلاثة أوضاع رئيسية:
run: يشغّل خادم الاجتماعات الكامل.livekit: يشغّل خادم الوسائط المدمج فقط.install: يُعد الخادم تلقائيًا على أنظمة Debian/Ubuntu.
أقسام التوثيق
- بنية الكود: أين يقع كل شيء؟
- قاعدة البيانات والنماذج: كيف تُخزَّن البيانات؟
- المصادقة: كيف يسجّل المستخدمون الدخول؟
- معالجات API: كيف تُعالَج الطلبات؟
- تكامل LiveKit: كيف يعمل خادم الفيديو؟
- اتصال WebRTC: كيف يُنشئ العملاء اتصالات الوسائط؟ (STUN/ICE/TURN/SFU)
- خادم TURN: بنية ترحيل TURN والتهيئة واستكشاف الأخطاء
- التثبيت والنشر: كيف يعمل المثبّت التلقائي؟