> ## Content Index
> Fetch the complete content index at: https://arabroot.io/llms.txt
> Use this file to discover other available public pages before exploring further.

# الفصل الافتراضي Virtual Classroom مع BigBlueButton وMoodle
- URL: https://arabroot.io/articles/تثبيت-bigbluebutton-وربطه-مع-moodle/
- Published: 2026-10-14T09:00:00.000Z
- Updated: 2026-10-25T08:50:06.000Z
- Description: ما الذي يحتاجه سيرفر BigBlueButton للمحاضرات المباشرة، وكيف تربطه مع Moodle، ولماذا يفشل الاتصال بينهما في الشبكة الداخلية.
- Author: فريق عرب رووت
- Tags: الأدلة التقنية, التعليم والبحث العلمي, تطبيقات لفريقك, الاستضافة الذاتية, BigBlueButton

عندما تنتقل المحاضرة إلى الإنترنت، فالحل الذي تبدأ به أغلب المدارس والجامعات هو رابط Zoom أو Teams يلصقه المعلم في صفحة المقرر، وهذا يعمل في الأسبوع الأول، ولكن بعد شهر سوف تجد أن الحضور مسجل في نظام آخر، والتسجيلات في حساب شخصي للمعلم، وأن الطالب يدخل باسم يختاره هو وليس بحسابه في المنصة. ولهذا السبب تحديداً بني BigBlueButton، فهو نظام مفتوح المصدر للفصل الافتراضي Virtual Classroom مصمم للتعليم، ونشاطه موجود داخل Moodle نفسه، فيدخل الطالب القاعة من صفحة المقرر بحسابه ودوره. وكما ذكرنا في دليل [تثبيت Moodle على سيرفرك](https://arabroot.io/articles/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-moodle-%D9%85%D9%86%D8%B5%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%B9%D9%84%D9%89-%D8%B3%D9%8A%D8%B1%D9%81%D8%B1%D9%83/)، فالمنصة هي المكان الذي يعيش فيه المقرر، والسؤال في هذا المقال: كيف تضيف إليها القاعة المباشرة، وما الذي تحتاجه لذلك فعلاً؟

في هذا المقال سوف نتناول:

- ما الذي يقدمه BigBlueButton في الدرس المباشر، وما الذي يعمل داخل سيرفره، مع مخطط للمكونات.
- متطلبات الإصدار 4.0 بصراحة، ولماذا لا يصلح تشغيله على سيرفر مشترك أو على جهاز التطوير.
- التثبيت على سيرفر مخصص بالسكربت الرسمي، وخيارات الاستضافة الأخرى.
- ربطه مع Moodle 5.3 خطوة بخطوة في مختبر حقيقي، والعطل الذي سوف تقابله على الأغلب في الشبكات الداخلية، وكيف يوقع Moodle طلباته بالسر المشترك Shared Secret.
- التسجيلات والسعة، ومشكلات شائعة وحلولها.

## ما الذي يقدمه BigBlueButton للدرس المباشر؟

BigBlueButton، واختصاراً BBB، هو نظام مؤتمرات ويب Web Conferencing يعمل من المتصفح دون تثبيت أي برنامج عند الطالب، والفرق بينه وبين أدوات الاجتماعات العامة أن أدواته مبنية حول المحاضرة: المعلم هو المشرف Moderator والطلاب مشاهدون Viewers، والعرض التقديمي يرفع إلى القاعة ويتحول إلى سبورة Whiteboard يكتب عليها المعلم، والتسجيل يعرض بعد المحاضرة بالشرائح والصوت معاً. وفيما يلي أهم ما يأتي مع الإصدار 4.0 بحسب [صفحة الجديد في الإصدار 4.0](https://docs.bigbluebutton.org/new-features/?ref=arabroot.io):

- **معرض التطبيقات Apps Gallery:** فيه الاستطلاعات Polls، والغرف الفرعية Breakout Rooms لتقسيم الطلاب إلى مجموعات، والمؤقت Timer، والترجمة الصوتية Audio Captions.
- **طلب العرض Request to Present:** يطلب الطالب أن يصبح هو المقدم، ويوافق المعلم أو يرفض.
- **الملاحظات المشتركة Shared Notes:** أصبحت تعمل بمحرر BlockNote، وحذف الإصدار 4.0 محرر Etherpad القديم بالكامل.
- **لوحة التعلم Learning Dashboard:** تعرض للمعلم مشاركة الطلاب، وأصبحت تعمل في الغرف الفرعية أيضاً.

والمشروع مرخص بالرخصة LGPL الإصدار 3.0 كما في [الأسئلة الشائعة الرسمية](https://docs.bigbluebutton.org/support/faq/?ref=arabroot.io)، وآخر إصدار مستقر هو [4.0.0](https://github.com/bigbluebutton/bigbluebutton/releases/tag/v4.0.0?ref=arabroot.io) الصادر في 14 أكتوبر 2026، بينما ما زال فرع 3.0 يتلقى تحديثات، وآخرها 3.0.39 في 2 أكتوبر 2026.

## ما الذي يعمل داخل سيرفر BigBlueButton؟

قد يبدو BigBlueButton من الخارج تطبيق ويب عادياً، ولكنه في الواقع مجموعة خدمات على سيرفر واحد، وأهمها خادم الوسائط Media Server الذي يمر عليه صوت وصورة كل طالب، ولهذا السبب فمتطلباته أعلى بكثير من متطلبات Moodle. والصورة التالية تبين المكونات كما في [صفحة البنية الرسمية](https://docs.bigbluebutton.org/development/architecture/?ref=arabroot.io):

![مخطط مكونات BigBlueButton 4.0 على سيرفر مخصص: متصفح الطالب يصل إلى nginx على المنفذ 443 للواجهة HTML5 Client، ويرسل الصوت والصورة عبر WebRTC إلى خادم الوسائط LiveKit على منافذ UDP من 16384 إلى 32768، والهاتف يتصل عبر SIP إلى FreeSWITCH، وMoodle يتصل بالواجهة البرمجية bbb-web بالسر المشترك، وفي الداخل خادم GraphQL مع Hasura وتطبيقات Akka عبر Redis PubSub وقاعدة PostgreSQL مع Redis، وخادم TURN وتحويل العروض بـ LibreOffice داخل Docker ومعالجة التسجيلات بعد نهاية الاجتماع](https://arabroot.io/content/images/2026/10/bigbluebutton-01-architecture.webp)

المتصفح يتصل بالسيرفر مباشرة بالصوت والصورة، وMoodle لا يمر عبره إلا طلب الإنشاء والدخول

في المخطط أعلاه لاحظ التالي:

- **خادم الوسائط LiveKit:** هو الافتراضي في الإصدار 4.0 للصوت والكاميرا ومشاركة الشاشة، وهو من نوع SFU، أي أنه يستقبل تدفق كل مشارك ويعيد توزيعه على الآخرين، وهذا ما يستهلك المعالج والـ Bandwidth، وما زال البديل القديم mediasoup متاحاً.
- **FreeSWITCH:** هو جسر الصوت، ومن خلاله يمكن أن ينضم الطالب برقم هاتف Dial-in، وهو المشروع نفسه الذي شرحناه في [FreeSWITCH للمنصات الكبيرة](https://arabroot.io/articles/freeswitch-%D9%84%D9%84%D9%85%D9%86%D8%B5%D8%A7%D8%AA-%D8%A7%D9%84%D9%83%D8%A8%D9%8A%D8%B1%D8%A9-%D9%88%D9%85%D8%B1%D8%A7%D9%83%D8%B2-%D8%A7%D9%84%D8%A7%D8%AA%D8%B5%D8%A7%D9%84/).
- **bbb-web:** هو الذي يقدم الواجهة البرمجية API التي يتكلم معها Moodle، وكل طلب إليها موقع بالسر المشترك كما سيأتي.
- **تحويل العروض:** ملفات Office يحولها LibreOffice إلى PDF ثم إلى SVG، ويعمل داخل Docker في بيئة معزولة Sandbox، لأن ملف العرض يأتي من المستخدم ولا يجوز أن يعمل بصلاحيات السيرفر.
- **معالجة التسجيلات Recording Processor:** تعمل بعد نهاية الاجتماع، فتجمع الأحداث المحفوظة في Redis مع ملفات الصوت والعروض وتنتج التسجيل الذي يشاهده الطالب.

## المتطلبات: لماذا يحتاج سيرفراً مخصصاً؟

[صفحة التثبيت الرسمية](https://docs.bigbluebutton.org/administration/install/?ref=arabroot.io) للإصدار 4.0 تحدد الحد الأدنى لسيرفر الإنتاج كما في الجدول التالي:

| المورد        | الحد الأدنى للإنتاج                                 | للتطوير فقط |
| ------------- | --------------------------------------------------- | ----------- |
| نظام التشغيل  | Ubuntu 24.04 بنواة Linux 6.x، ونسخة حديثة من Docker | نفسه        |
| المعالج CPU   | 8 أنوية بأداء عال للنواة الواحدة                    | 4 أنوية     |
| الذاكرة RAM   | 16GB مع تفعيل Swap                                  | 8GB         |
| القرص         | 500GB للتسجيلات، أو 50GB إذا أوقفت التسجيل          | 50GB        |
| الشبكة        | 250Mbit/s متماثلة Symmetrical أو أكثر               | غير محدد    |
| العناوين      | IPv4 وIPv6                                          | IPv4 فقط    |
| المنافذ Ports | TCP 80 و443، وUDP من 16384 إلى 32768                | نفسها       |
| النطاق        | اسم مثل bbb.example.com لشهادة TLS                  | نفسه        |

والصفحة نفسها تشترط أن يكون السيرفر نظيفاً، دون أي سيرفر ويب آخر على المنفذين 80 و443، وألا يستخدم لشيء آخر غير BigBlueButton وتطبيقاته مثل Greenlight، وتقول إن اعتماد الإصدار 4.0 على Docker قد يمنع تشغيله في بعض البيئات الافتراضية. والسبب في شهادة TLS ليس الأمان وحده، فالمتصفحات كلها ترفض إعطاء الصفحة إذن الميكروفون والكاميرا إذا لم تكن على HTTPS بشهادة صالحة، أي أن القاعة دون شهادة لا يسمع فيها أحد أحداً.

وقد يتساءل البعض: هل يمكن أن أضعه على سيرفر Moodle نفسه لأوفر سيرفراً؟ والإجابة لا، والسبب أن خادم الوسائط في محاضرة فيها مئة طالب يستهلك المعالج والشبكة في الوقت نفسه الذي يحتاجهما Moodle، وأن السكربت الرسمي يثبت nginx وجدار الحماية UFW ويعيد ضبطهما على مقاسه، فيتعارض مع أي خدمة أخرى على السيرفر. ولنفس السبب لا يصلح جهاز التطوير الذي يعمل عليه Docker Desktop، لأن القاعة تحتاج عنواناً يصل إليه الطلاب ومنافذ UDP مفتوحة، ولذلك فالتثبيت في القسم التالي من التوثيق الرسمي، والتجربة العملية في قسم الربط مع Moodle تختبر جانب Moodle كاملاً مع سيرفر بديل كما سيأتي.

💡

الفصل الافتراضي يحتاج عرض نطاق للرفع Upload مثل التنزيل، لأن السيرفر يرسل تدفق المعلم إلى كل طالب، فإذا كان اتصال السيرفر 1Gbit/s للتنزيل و100Mbit/s للرفع فالرقم الذي يهمك هو 100.

## التثبيت على سيرفر مخصص

الطريقة البسيطة هي أن تبحث عن حزمة BigBlueButton في مستودعات Ubuntu، ولا توجد حزمة كهذه، والطريقة الثانية أن تثبت المكونات واحداً واحداً من التوثيق، وهي ممكنة ولكنها عشرات الخطوات، والطريقة الموصى بها هي السكربت الرسمي [bbb-install.sh](https://github.com/bigbluebutton/bbb-install/tree/v4.0.x-release?ref=arabroot.io)، وهو يثبت كل شيء ويضبط الشهادة والجدار الناري، ونسخته الآن على فرع خاص بكل إصدار.

### قبل تشغيل السكربت

1. **سجل DNS:** أنشئ سجلاً من نوع A للاسم `bbb.example.com` يشير إلى عنوان IP العام للسيرفر، وتأكد منه قبل التثبيت، لأن السكربت يطلب الشهادة من Let's Encrypt في أثناء التثبيت.
2. **الجدار الناري الخارجي:** إذا كان السيرفر خلف جدار ناري لمزود السحابة Security Group، فافتح فيه TCP 22 و80 و443، وUDP من 16384 إلى 32768، فالسكربت لا يستطيع فتحها لك.
3. **منفذ SSH:** السكربت يثبت UFW على السيرفر ولا يسمح إلا بالمنفذ 22 لـ SSH، فإذا كان SSH على منفذ آخر فإنه يتوقف، ويمكنك تجاوز ذلك بالخيار `-W` وإدارة الجدار الناري بنفسك.

```bash
dig bbb.example.com @8.8.8.8
```

### تشغيل السكربت

سجل الدخول كمستخدم root على سيرفر Ubuntu 24.04 نظيف، ثم شغل الأمر التالي كما في ملف المشروع:

```bash
wget -qO- https://raw.githubusercontent.com/bigbluebutton/bbb-install/v4.0.x-release/bbb-install.sh | bash -s -- -v noble-400 -s bbb.example.com -e admin@example.com
```

في الأمر أعلاه لاحظ التالي:

- `-v noble-400` يختار خط الإصدار 4.0 على Ubuntu 24.04، وإعادة تشغيل الأمر نفسه لاحقاً تحدث السيرفر إلى آخر إصدار في الخط نفسه، وتغيير القيمة هو طريقة الانتقال إلى خط أحدث.
- `-s` هو اسم السيرفر و`-e` هو البريد الذي يسجل به في Let's Encrypt، والمشروع يقول إنهما إلزاميان عملياً لأن القاعة لا تعمل دون HTTPS.
- لا يدعم السكربت الترقية من إصدار Ubuntu إلى آخر، فمن كان على سيرفر قديم بالإصدار 22.04 يثبت سيرفراً جديداً وينقل التسجيلات إليه.
- إذا أردت واجهة لإدارة الغرف دون منصة تعلم، فالخيار `-g` يثبت [Greenlight](https://docs.bigbluebutton.org/greenlight/v3/install?ref=arabroot.io) معه، ومع Moodle لا تحتاجه.
- إذا كانت التسجيلات كثيرة فالخيار `-m /mnt/recordings` يضع المجلد `/var/bigbluebutton` على قرص مستقل، وهو المجلد الذي يكبر مع كل محاضرة.

بعد التثبيت تحتاج شيئين لربط Moodle: عنوان الواجهة البرمجية والسر المشترك، ويعرضهما الأمر التالي بحسب [توثيق الواجهة البرمجية](https://docs.bigbluebutton.org/development/api/?ref=arabroot.io):

```bash
bbb-conf --secret
```

والمخرج سطران، الأول `URL:` بعنوان مثل `https://bbb.example.com/bigbluebutton/`، والثاني `Secret:` بالسر، وهذا السر يوضع في Moodle فقط، والتوثيق يحذر من وضعه في أي مكان يصل إليه المستخدم أو في كود JavaScript في المتصفح.

### هل يجب أن تستضيفه بنفسك؟

ليس بالضرورة، وهناك ثلاثة خيارات:

| الخيار                                      | ما الذي تحصل عليه                                                                                                                                                                                                                            | متى يناسب                                                                   |
| ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| الاستضافة المجانية من داخل Moodle Free Tier | تسجيل من صفحة الإعدادات، وبحسب [توثيق Moodle](https://docs.moodle.org/503/en/BigBlueButton?ref=arabroot.io): الجلسة 60 دقيقة كحد أقصى، و25 مستخدماً في الجلسة، والتسجيلات تحذف بعد 7 أيام ولا يمكن تنزيلها، وكاميرات الطلاب يراها المعلم فقط | التجربة، أو مدرسة صغيرة جداً                                                |
| استضافة مدارة من مزود BigBlueButton         | سيرفر لا تديره أنت، وتدفع حسب عدد المستخدمين                                                                                                                                                                                                 | إذا لم يكن لديك فريق يدير سيرفرات الوسائط                                   |
| سيرفر خاص بك                                | تحكم كامل في البيانات والتسجيلات ومكانها                                                                                                                                                                                                     | إذا كانت سياسة المؤسسة تطلب بقاء التسجيلات داخلها، ولديك من يتابع التحديثات |

## الربط مع Moodle 5.3

نشاط BigBlueButton جزء من كود Moodle الأساسي منذ الإصدار 4.0، و[توثيق Moodle 5.3](https://docs.moodle.org/503/en/BigBlueButton?ref=arabroot.io) يذكر أنه أصبح مفعلاً افتراضياً في التثبيتات الجديدة، ولكنه يبقى رمادياً في قائمة الأنشطة حتى يكتب المدير عنوان السيرفر والسر المشترك. والصورة التالية تبين ما يحدث عندما يضغط الطالب زر الانضمام:

![مخطط تدفق الدخول إلى قاعة BigBlueButton من Moodle بخمس خطوات: 1 الطالب يضغط زر الانضمام في نشاط BigBlueButton في صفحة المقرر، 2 سيرفر Moodle يرسل طلب create إلى الواجهة البرمجية لسيرفر BigBlueButton مع checksum، 3 Moodle يحول المتصفح Redirect إلى رابط join موقع، 4 المتصفح يتصل بسيرفر BigBlueButton مباشرة بالصوت والصورة عبر WebRTC، 5 بعد الجلسة يطلب Moodle قائمة التسجيلات](https://arabroot.io/content/images/2026/10/bigbluebutton-02-moodle-flow.webp)

السر المشترك يبقى على سيرفر Moodle، والمتصفح يصله رابط موقع به فقط

### التجربة العملية: Moodle مع سيرفر BigBlueButton بديل

كما ذكرنا فسيرفر BigBlueButton الحقيقي لا يعمل على جهاز تطوير، ولكن ما يهمنا في هذا القسم هو جانب Moodle: هل يصل إلى السيرفر، وهل يوقع الطلبات بشكل صحيح، وماذا يرسل للمتصفح. ولهذا الغرض ينشر فريق Moodle نفسه [bigbluebutton\_mock](https://github.com/moodlehq/bigbluebutton%5Fmock?ref=arabroot.io)، وهو سيرفر بديل Mock يقدم الواجهة البرمجية نفسها ويتحقق من الـ checksum بالسر الافتراضي، ويستخدمه Moodle في اختباراته الآلية، ولكنه لا ينقل صوتاً ولا صورة، فصفحة القاعة فيه نص بسيط يعرض اسم المستخدم ودوره.

بدأنا من مختبر Moodle 5.3 الذي بنيناه في [دليل Moodle](https://arabroot.io/articles/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-moodle-%D9%85%D9%86%D8%B5%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%B9%D9%84%D9%89-%D8%B3%D9%8A%D8%B1%D9%81%D8%B1%D9%83/#lab)، وأضفنا إليه الملف `compose.bbb.yaml` التالي:

```yaml
services:
  bbb:
    image: moodlehq/bigbluebutton_mock@sha256:36a0fa06ada86c883c0eab1db9e9cea95865094aff9194c5db041315aa47ee96
    container_name: edu2-lms-bbb
    restart: unless-stopped
    command: ["symfony", "server:start", "--port=28081", "--no-tls", "--allow-http"]
    ports:
      - "127.0.0.1:28081:28081"
    networks:
      default:
        aliases: [bbb.localhost]
    mem_limit: 512m
```

```bash
docker compose -f compose.yaml -f compose.bbb.yaml up -d bbb
curl -s http://127.0.0.1:28081/edu2/api
```

```text
<?xml version="1.0"?>
<response><version>0.9</version><returncode>SUCCESS</returncode></response>
```

لاحظ أن المسار يبدأ بـ `/edu2/`، فالسيرفر البديل يطلب معرفاً قبل `/api` حتى تعمل عدة اختبارات عليه معاً، وفي السيرفر الحقيقي يكون المسار `/bigbluebutton/api`.

### عنوان السيرفر والسر المشترك

من إدارة الموقع ثم الإضافات ثم وحدات النشاط ثم BigBlueButton ثم الإعدادات العامة، تجد الحقلين، ويمكن ضبطهما من سطر الأوامر أيضاً، وهي الطريقة المناسبة إذا كنت تدير الإعدادات بسكربتات:

```bash
docker exec -u www-data edu2-lms-web php /var/www/html/admin/cli/cfg.php \
  --name=bigbluebuttonbn_server_url --set=http://host.docker.internal:28081/edu2/
docker exec -u www-data edu2-lms-web php /var/www/html/admin/cli/cfg.php \
  --name=bigbluebuttonbn_shared_secret --set=0b21fcaf34673a8c3ec8ed877d76ae34
```

![صفحة الإعدادات العامة لنشاط BigBlueButton في Moodle بالعربية: حقل عنوان الرابط لمخدم غرف اجتماعات BBB وفيه http://host.docker.internal:28081/edu، وحقل السر المشارك مخفي بنقاط، وخوارزمية اختبار الصحة SHA256 وهي الافتراضية، ومدة الاستطلاع لتحديث حالة الغرفة 5 ثوان، ورابط بوابة التسجيل في Blindside](https://arabroot.io/content/images/2026/10/bigbluebutton-03-admin-settings.webp)

إعدادات BigBlueButton في Moodle: العنوان والسر وخوارزمية الـ checksum

في الإعداد أعلاه لاحظ التالي:

- السر `0b21fcaf…` هو السر الافتراضي للسيرفر البديل، وهو منشور في كود Moodle نفسه، فلا تستخدمه إلا مع هذا السيرفر، وفي الإنتاج ضع السر الذي يعرضه `bbb-conf --secret`.
- الخوارزمية الافتراضية في Moodle 5.3 هي SHA256، والإعداد يقبل SHA1 للسيرفرات القديمة وSHA512، وتوثيق BigBlueButton يقول إن السيرفر يقبل أي خوارزمية مدعومة إلا إذا قصرها المدير بالإعداد `supportedChecksumAlgorithms`، فلا تختر SHA1 إلا إذا اضطررت.
- العنوان `host.docker.internal` هو اسم يصل به ال Container إلى الجهاز المضيف في Docker Desktop، واستخدمناه لأن السيرفر البديل منشور على منفذ في الجهاز نفسه.

### نجرب العطل: تعذر الاتصال بالسيرفر

بعد ذلك أنشأنا نشاط BigBlueButton في مقرر «مقدمة في الشبكات» من نوع «غرفة مع تسجيلات»، المعلمة فيه مشرفة Moderator والطلاب مشاهدون، ثم فتحناه بحساب المعلمة، فظهرت الرسالة التالية بدلاً من القاعة:

![رسالة خطأ حمراء في Moodle بالعربية نصها: تعذر الاتصال بمخدم BigBlueButton. يرجى الاتصال بالمشرف](https://arabroot.io/content/images/2026/10/bigbluebutton-04-server-blocked.webp)

الرسالة نفسها تظهر لأسباب مختلفة، لذلك لا تكفي وحدها لمعرفة السبب

والرسالة لا تقول السبب، لذلك طلبنا عنوان السيرفر من داخل Moodle بالكلاس نفسه الذي يستخدمه النشاط، عبر سكربت PHP صغير:

```php
<?php
define('CLI_SCRIPT', true);
require('/var/www/html/config.php');
$v = \mod_bigbluebuttonbn\local\proxy\bigbluebutton_proxy::get_server_version();
echo 'server version: ', var_export($v, true), "\n";
$c = new \mod_bigbluebuttonbn\local\proxy\curl();
$r = $c->get(\mod_bigbluebuttonbn\local\config::get('server_url') . 'api');
echo 'curl error: ', $c->error, "\nresponse: ", trim((string)$r), "\n";
```

```text
server version: NULL
curl error: تم حظر عنوان URL.
response: 
```

والسبب أن Moodle يمنع نفسه من طلب عناوين الشبكة الداخلية والمنافذ غير المعتادة، وهي حماية من نوع SSRF، أي أن المستخدم لا يستطيع أن يجعل Moodle يطلب نيابة عنه سيرفراً داخلياً لا يصل إليه هو، وصفحة [HTTP security](https://docs.moodle.org/503/en/HTTP%5Fsecurity?ref=arabroot.io) في توثيق Moodle توصي بقائمة الحظر هذه وبالمنفذين 80 و443 فقط. وفي موقعنا الجديد كانت القائمتان كما يلي:

```bash
docker exec -u www-data edu2-lms-web php /var/www/html/admin/cli/cfg.php --name=curlsecurityblockedhosts
docker exec -u www-data edu2-lms-web php /var/www/html/admin/cli/cfg.php --name=curlsecurityallowedport
```

```text
127.0.0.0/8
192.168.0.0/16
10.0.0.0/8
172.16.0.0/12
0.0.0.0
localhost
169.254.169.254
0000::1
443
80
```

والعنوان `host.docker.internal` داخل ال Container هو `192.168.65.254`، أي داخل النطاق المحظور `192.168.0.0/16`، والمنفذ 28081 ليس في قائمة المنافذ المسموحة، فكل واحد منهما يكفي لمنع الطلب. وجربنا كل سبب وحده: سمحنا بالمنفذ وأبقينا النطاق محظوراً فبقي الخطأ، ثم أزلنا النطاق من القائمة فنجح الطلب:

```text
server version: '0.9'
curl error:
response: 
```

⚠️

لا تحذف النطاقات الداخلية من قائمة الحظر في سيرفر الإنتاج لتحل هذه المشكلة، والسبب أن ذلك يفتح Moodle كله على الشبكة الداخلية وليس نشاط BigBlueButton وحده. والحل الصحيح أن يكون لسيرفر BigBlueButton اسم وعنوان عام وشهادة على المنفذ 443، وهو ما يطلبه أصلاً ليعمل مع الطلاب، فيمر الطلب دون أي تغيير في القائمتين.

وهنا يظهر سبب آخر للرسالة نفسها، وهو السر الخاطئ، فالسيرفر يرد على الطلب ولكن برفض. أرسلنا طلب `create` مرتين، مرة موقعاً بالسر الصحيح ومرة بسر خاطئ:

```text
<response><meetingID>lab-test</meetingID><attendeePW>ap</attendeePW><moderatorPW>mp</moderatorPW>...<returncode>SUCCESS</returncode></response>
<response><messageKey>checksumError</messageKey><message>checksumError</message><returncode>FAILED</returncode></response>
```

والرد `checksumError` يعامله Moodle في الكود كأن السيرفر غير متاح، فيعرض الرسالة نفسها، لذلك إذا ظهرت لك فابدأ بالسر، ثم بالحظر، ثم بالعنوان.

### ماذا يرسل Moodle عند الانضمام؟

بعد إصلاح الاتصال أصبحت صفحة النشاط تعرض أن الغرفة جاهزة مع زر الانضمام وقائمة التسجيلات:

![صفحة نشاط BigBlueButton في Moodle بالعربية بعنوان المحاضرة المباشرة أساسيات الشبكات، ورسالة هذه الغرفة جاهزة يمكنك الانضمام إليها الآن، وزر انضم إلى الجلسة، وتحته قسم التسجيلات بجدول فارغ فيه عبارة No data to display بالإنجليزية والجدول يخرج عن حدود الصفحة من اليسار، وفي القائمة الجانبية أنشطة المقرر](https://arabroot.io/content/images/2026/10/bigbluebutton-05-teacher-room.webp)

صفحة القاعة كما تراها المعلمة: الزر يعمل، وجدول التسجيلات فيه نص إنجليزي ويخرج عن الصفحة في الاتجاه RTL

لاحظ في الصورة أن جدول التسجيلات الفارغ يعرض «No data to display» بالإنجليزية، وأنه يتجاوز حدود الصفحة من اليسار في الاتجاه من اليمين إلى اليسار RTL، وهي تفاصيل لا تمنع العمل ولكن سوف يسألك عنها المعلمون. وزر الانضمام رابط إلى `bbb_view.php`، وطلبناه بجلسة المعلمة دون أن نتبع التحويل، لنرى ما يرسله Moodle إلى المتصفح:

```text
STATUS 303 LOCATION http://host.docker.internal:28081/edu2/api/join?meetingID=0bd4159adf55fe9ed0e989b31dfae9a315e19eb0-2-1%5B0%5D&fullName=%D8%B3%D8%A7%D8%B1%D8%A9+%D8%A7%D9%84%D9%85%D8%B9%D9%84%D9%85%D8%A9&password=zXyapHcZD5l4&logoutURL=http%3A%2F%2F127.0.0.1%3A28080%2Fmod%2Fbigbluebuttonbn%2Fbbb_view.php%3Faction%3Dlogout%26id%3D2%26courseid%3D2&role=MODERATOR&userID=3&guest=false&createTime=1792588896&userdata-bbb_override_default_locale=ar&checksum=32649e3fa16a1be7cfff1142acedf5839a9a89b88fe027abbae0847e5efc5f21
```

في الرابط أعلاه لاحظ التالي:

- `fullName` هو اسم المعلمة «سارة المعلمة» من حسابها في Moodle، و`userID=3` هو رقمها في Moodle، فالحضور في القاعة مرتبط بالحساب وليس باسم يكتبه المستخدم.
- `role=MODERATOR` جاء من إعداد المشاركين في النشاط، وعندما طلبنا الرابط نفسه بحساب الطالب خالد كان `role=VIEWER`.
- `userdata-bbb_override_default_locale=ar` يطلب من القاعة أن تفتح بالعربية، لأن لغة المستخدم في Moodle عربية.
- `logoutURL` يعيد المستخدم إلى Moodle عند الخروج من القاعة.
- `checksum` طوله 64 حرفاً، أي SHA256، وهو الهاش للنص `join` ثم باقي الرابط ثم السر.

وتحققنا من الهاش بأنفسنا بـ Node.js، بالسر الصحيح ثم بسر خاطئ:

```bash
node -e "
const c = require('crypto');
const q = 'meetingID=0bd4159adf55fe9ed0e989b31dfae9a315e19eb0-2-1%5B0%5D&fullName=%D8%B3%D8%A7%D8%B1%D8%A9+%D8%A7%D9%84%D9%85%D8%B9%D9%84%D9%85%D8%A9&password=zXyapHcZD5l4&logoutURL=http%3A%2F%2F127.0.0.1%3A28080%2Fmod%2Fbigbluebuttonbn%2Fbbb_view.php%3Faction%3Dlogout%26id%3D2%26courseid%3D2&role=MODERATOR&userID=3&guest=false&createTime=1792588896&userdata-bbb_override_default_locale=ar';
console.log(c.createHash('sha256').update('join' + q + '0b21fcaf34673a8c3ec8ed877d76ae34').digest('hex'));
console.log(c.createHash('sha256').update('join' + q + 'wrong-secret').digest('hex'));
"
```

```text
32649e3fa16a1be7cfff1142acedf5839a9a89b88fe027abbae0847e5efc5f21
5a57521055b3ca4ebaa9389c0409b3a5818fe5662a5c2cfe0111f82ccad008fd
```

السطر الأول يطابق الهاش في الرابط حرفاً بحرف، والثاني مختلف تماماً، وهذا هو كل الأمان في الربط: من لا يعرف السر لا يستطيع أن يصنع رابطاً بدور MODERATOR، وأي تغيير في الرابط يغير الهاش فيرفضه السيرفر. ولهذا السبب تحديداً لا يجوز أن يصل السر إلى المتصفح، فمن يعرفه يستطيع أن ينشئ أي قاعة ويدخل أي قاعة بأي دور. وفي سجل السيرفر البديل ظهرت الطلبات بالترتيب الذي في المخطط: `create` ثم `getMeetingInfo` من سيرفر Moodle، ثم `join` من المتصفح.

💡

الرابط فيه كلمة مرور الاجتماع `password` أيضاً، وكان مختلفاً بين المعلمة والطالب، وهي من الطريقة القديمة في الواجهة البرمجية، والدور الفعلي يحدده المعامل `role`، فلا تعتمد على كلمة المرور هذه في أي منطق خاص بك.

## التسجيلات Recordings والخصوصية

التسجيلات تبقى على سيرفر BigBlueButton في المجلد `/var/bigbluebutton`، وMoodle لا يخزنها، وإنما يطلب قائمتها بالطلب `getRecordings` ويعرضها في صفحة النشاط. وهذا يعني ثلاثة أشياء عملية:

- **النسخ الاحتياطي Backup:** نسخة Moodle الكاملة التي شرحناها في [دليل Moodle](https://arabroot.io/articles/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-moodle-%D9%85%D9%86%D8%B5%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%B9%D9%84%D9%89-%D8%B3%D9%8A%D8%B1%D9%81%D8%B1%D9%83/#backup) لا تحتوي على التسجيلات، فيجب أن تنسخ مجلد التسجيلات من سيرفر BigBlueButton بخطة مستقلة.
- **مكان البيانات:** إذا كانت سياسة المؤسسة تطلب بقاء تسجيلات الطلاب داخلها، فالاستضافة المجانية التي تحذف التسجيلات بعد 7 أيام وتديرها جهة أخرى لا تناسبها.
- **الإذن:** في الإصدار 4.0 أصبح التسجيل مفعلاً افتراضياً لجلسات LiveKit بحسب صفحة الجديد في الإصدار، فاتفق مع المعلمين على متى تسجل المحاضرة، وأخبر الطلاب بذلك قبل أن تبدأ.

## كم طالباً يتحمل السيرفر؟

الأسئلة الشائعة الرسمية تعطي قاعدة تقريبية: السيرفر الذي يحقق الحد الأدنى من المتطلبات يتحمل نحو 200 مستخدم في الوقت نفسه، وتوصي بألا تزيد الجلسة الواحدة على 200 مستخدم. والرقم الحقيقي يتغير كثيراً بعدد الكاميرات المفتوحة، فمحاضرة فيها كاميرا المعلم وحده غير محاضرة يفتح فيها كل طالب كاميرته، لذلك اطلب من المعلمين أن يبقى الطلاب بالصوت فقط إلا عند الحاجة.

وعندما يزيد العدد على ما يتحمله سيرفر واحد، فالحل ليس سيرفراً أكبر بلا حد، وإنما عدة سيرفرات خلف [Scalelite](https://github.com/blindsidenetworks/scalelite?ref=arabroot.io)، وهو موزع حمل Load Balancer لسيرفرات BigBlueButton يقدم لـ Moodle الواجهة البرمجية نفسها، فيكتب المدير عنوان Scalelite وسره في الإعدادات نفسها التي رأيناها، ويوزع Scalelite الغرف على السيرفرات. وقبل ذلك قس الحمل الحقيقي كما في [اختبار الأحمال والضغط](https://arabroot.io/articles/%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1-%D8%A7%D9%84%D8%A7%D8%AD%D9%85%D8%A7%D9%84-%D9%88%D8%A7%D9%84%D8%B6%D8%BA%D8%B7-load-%D9%88-stress-testing-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86/)، فقد تكون المشكلة في عرض النطاق وليس في عدد السيرفرات.

## مشكلات شائعة وحلولها

| العرض                                           | السبب المحتمل                                                        | الحل                                                                      |
| ----------------------------------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------- |
| «تعذر الاتصال بمخدم BigBlueButton» في Moodle    | سر خاطئ، أو عنوان في نطاق محظور أو على منفذ غير مسموح، أو عنوان خاطئ | تحقق بالسكربت أعلاه، وتأكد أن العنوان ينتهي بـ /bigbluebutton/ وعلى HTTPS |
| الطالب يدخل القاعة ولا يسمع أحداً ولا يسمعه أحد | منافذ UDP مغلقة في الجدار الناري الخارجي                             | افتح UDP من 16384 إلى 32768                                               |
| طلاب من شبكة معينة فقط لا يتصلون بالصوت         | شبكتهم تمنع UDP                                                      | خادم TURN خارجي، والسكربت يثبته بالخيار \-c على سيرفر مستقل               |
| المتصفح يرفض الميكروفون والكاميرا               | لا توجد شهادة TLS صالحة                                              | أعد التثبيت بالخيارين \-s و\-e                                            |
| القرص يمتلئ بعد الفصل الأول                     | التسجيلات في /var/bigbluebutton                                      | قرص مستقل بالخيار \-m، وسياسة لحذف التسجيلات القديمة                      |

## تنظيف المختبر

```bash
docker compose -f compose.yaml -f compose.bbb.yaml down -v
docker image rm moodlehq/bigbluebutton_mock@sha256:36a0fa06ada86c883c0eab1db9e9cea95865094aff9194c5db041315aa47ee96
```

وإذا غيرت قائمة الحظر أو المنافذ في المختبر، فلا تنقل هذا التغيير إلى أي موقع آخر.

## تدريب عملي

- غير إعداد المشاركين في النشاط ليصبح كل الطلاب مشرفين، ثم اطلب رابط الانضمام بحساب طالب، ولاحظ قيمة `role`.
- غير خوارزمية الـ checksum في إعدادات Moodle إلى SHA512، واحسب الهاش لرابط الانضمام بنفسك كما فعلنا، وتأكد من طوله.

## الخلاصة

وصلنا لنهاية الموضوع، وأهم ما فيه:

- BigBlueButton فصل افتراضي مبني للتعليم، ونشاطه في كود Moodle الأساسي، ولكنه يحتاج سيرفراً خاصاً به.
- الإصدار 4.0 يطلب Ubuntu 24.04 و8 أنوية و16GB وشبكة 250Mbit/s متماثلة ونطاقاً بشهادة TLS، على سيرفر لا يعمل عليه شيء آخر.
- التثبيت بالسكربت الرسمي `bbb-install.sh`، والسر والعنوان من `bbb-conf --secret`.
- Moodle يوقع كل طلب بهاش SHA256 من اسم الطلب والمعاملات والسر، ويرسل للمتصفح رابطاً موقعاً فيه الاسم والدور، والسر لا يغادر السيرفر.
- رسالة «تعذر الاتصال» لها ثلاثة أسباب شائعة: السر، وقائمة الحظر والمنافذ في Moodle، والعنوان.
- التسجيلات على سيرفر BigBlueButton وليست في نسخة Moodle، فلها خطة نسخ مستقلة.

## سجل التحديثات

- أكتوبر 2026: كتابة المقال، وتجربة الربط على Moodle 5.3.0 مع سيرفر bigbluebutton\_mock البديل، ومتطلبات BigBlueButton 4.0.0 من التوثيق الرسمي.