8.3 KiB
گزارش ادغام رکوردر با سیستم PlugNMeet و Django
این گزارش شامل تمام مراحل فنی طی شده جهت راهاندازی، اتصال، رفع باگ و بهینهسازی رکوردر جلسات آنلاین (plugNmeet-recorder) و ادغام کامل آن با پنل مدیریتی جنگو است.
۱. راهاندازی و شبیهسازی محلی (Cloning & Docker Setup)
برای بالا آوردن سیستم ضبط به صورت ایزوله و ارتباط آن با سرور کلاسها، کارهای زیر انجام شد:
- شبیهسازی رکوردر: مخزن رسمی رکوردر در مسیر موازی پروژه تحت عنوان
plugNmeet-recorderکلون گردید. - پیکربندی شبکه (Docker Compose): در فایل
docker-compose.ymlمربوط به سرور ویدیو کنفرانس، کانتینر رکوردر به کانتینرهای دیگر متصل شد:- به کانتینرها اجازه دسترسی به شبکه اشتراکی پروژه (
imam-javad_backend_imam-javad) داده شد تا رکوردر بتواند به وبهوک جنگو و سرور nats متصل شود. - با استفاده از
extra_hostsآیپی دامنه کلاسها به گیتوی کانتینرها مپ شد تا مرورگر داخلی رکوردر (Chrome بدون واسط گرافیکی) بتواند بدون مشکل با دامنه کلاس کار کند:extra_hosts: - "meet.imamjavad.online:host-gateway" - تنظیم ولوم مشترک برای فایلهای ذخیرهشده ضبط (
plugnmeet-recordings) صورت گرفت.
- به کانتینرها اجازه دسترسی به شبکه اشتراکی پروژه (
۲. تنظیمات رکوردر (recorder_config.yaml)
پیکربندی فایل تنظیمات رکوردر برای سازگاری کامل با سیستم محلی به شرح زیر انجام شد:
- تنظیم شناسه رکوردر به
node_01و حالت اجرایی بهboth(انجام همزمان ضبط زنده و فشردهسازی پس از اتمام ضبط). - اتصال به وبسرویس nats از طریق:
nats_info: nats_urls: - "nats://plugnmeet-nats:4222" - تنظیم اعتبارسنجی اتصال به API در بخش
plugNmeet_infoبا استفاده ازapi_keyوapi_secretمشترک و هماهنگشده با جنگو. - آدرسدهی فایل خروجی رکوردر به پوشه اشتراکی
/recording_files.
۳. پیادهسازی گیرنده وبهوک زنده (Django Webhook)
در فایل webhook.py، تغییرات اساسی جهت دریافت اطلاعات فایل نهایی و وضعیت کاربران اعمال شد:
الف) رفع باگ مسیر رویداد ضبط (Webhook Routing)
سرور PlugNMeet رویداد اتمام ضبط و آمادهسازی فایل فشردهشده را با کلید recording_proceeded (حروف کوچک) ارسال میکرد. مسیردهی متناظر در جنگو اصلاح شد تا متد پردازشی درست فراخوانی گردد.
ب) اعتبارسنجی دوگانه امنیت (Signature Verification)
بررسی امنیتی پیامهای دریافتی مجهز به دو لایه شد:
- اعتبارسنجی JWT (استاندارد PlugNMeet): بررسی صحت امضا با توکن رمزنگاریشده با الگوریتم HS256 و کلید
PLUGNMEET_API_SECRET. - بررسی پشتیبان HMAC-SHA256: برای سناریوهای تستی و کلاینتهای قدیمی که توکن JWT خام ارسال میکنند.
ج) دانلود و پردازش خودکار فایل ویدیویی
درون متد _handle_recording_proceeded فرآیند زیر پیاده شد:
- دانلود امن: توکن موقت دانلود از API دریافت شده و فایل ویدیویی از آدرس وبسرویس دانلود و در حافظه موقت سیستم ذخیره میگردد.
- محاسبه مدت زمان ویدیو (Video Duration): با اجرای ابزار سیستم
ffprobeدر پسزمینه، طول دقیق ویدیو به صورت پویا استخراج میشود. - ثبت در پایگاه داده: فایل در مدل
LiveSessionRecordingذخیره میگردد. - تولید خودکار کاور تصویر (Thumbnail): با استفاده از دستورات
ffmpegفریمی در ثانیه اول ویدیو استخراج و تغییر سایز داده شده و به عنوان پیشنمایش در فیلد مربوطه ذخیره میشود.
۴. ثبت خودکار درس در دوره آموزشی (Django Signals)
پس از ثبت فایل ضبط شده، یک پروسه اتوماتیک در فایل signals.py از طریق سیگنال post_save روی مدل LiveSessionRecording فعال میشود:
- جلوگیری از ثبت تکراری: با فیلتر کردن نام فایلی که ثبت میشود، تضمین میگردد وبهوکهای همزمان یا ذخیرهسازیهای مجدد باعث ایجاد درسهای تکراری نشوند.
- ساخت هوشمند چپتر: تاریخ ضبط جلسه استخراج شده و به عنوان نام چپتر (به فرمت
YYYY-MM-DD) ثبت میشود. در صورتی که این چپتر از قبل برای این دوره وجود داشته باشد، از همان چپتر استفاده میشود. - نامگذاری خودکار درسها (Part n):
- تعداد درسهای موجود در همان چپتر مشخص شمرده میشود.
- بر اساس فرمول
تعداد درسها + ۱نام درس به عنوان بخش بعدی (مثلاPart 4در صورتی که ۳ درس در چپتر باشد) تعیین میشود.
- ساخت شیء درس و انتساب به دوره: آبجکت
Lessonساخته شده و به مدل واسطCourseLessonمرتبط میگردد.
۵. سیستم پایش حضور و غیاب مطمئن (Fail-safe Participant Tracking)
وبهوکهای LiveKit مربوط به ملحق شدن و خروج کاربران در زمان تستهای محلی ممکن است به دلیل مسائل شبکه یا فایروال به درستی کار نکنند. به همین منظور مکانیزم پشتیبان (Fail-safe) زیر طراحی شد:
- ثبت زودهنگام حضور (در live_session.py):
در متد
CourseLiveSessionTokenAPIView.postکه توکن دسترسی برای کاربران تولید میکند، درست قبل از ورود کاربر به کلاس، یک رکورد حضور در مدلLiveSessionUserبا وضعیت آنلاین ایجاد/بروزرسانی میشود. - ثبت خودکار خروج در زمان بسته شدن کلاس:
در متد پایش فعالِ کلاس (
_verify_room_is_active) و متد دریافت اتمام رویداد وبهوک، به محض اینکه سرور تشخیص دهد کلاس به اتمام رسیده است، وضعیت تمام کاربران حاضر در آن جلسه به صورت خودکار آفلاین (is_online=False) شده و زمان خروج آنها در فیلدexited_atثبت میگردد. - نادیده گرفتن رباتهای سیستمی:
رویدادهای کاربرانی نظیر
RECORDER_BOT(که مرورگر رکوردر است) به دلیل عدم همخوانی با شناسههای کاربری عددی از محاسبات پایگاه داده فیلتر و نادیده گرفته میشوند تا پایگاه داده با خطای تبدیل نوع (Type Casting) روبرو نشود.
[!TIP] برای اجرای تست سناریوها در محیط توسعه محلی بدون نیاز به اجرای دستی مرورگرها، میتوانید از اسکریپت بهروزشده
backend/scripts/test_webhook.pyهمراه با شناسه رویدادهای مختلف نظیرRECORDING_PROCEEDEDاستفاده نمایید.