اذهب إلى المحتوى

نشر تطبيق الاجتماعات جيتسي Jitsi محليا على خادم خاص باستخدام دوكر


Hassan Hedr

تطبيق الويب Jitsi Meet هو تطبيق اجتماعات مرئية مفتوح المصدر يمكن استضافته محليًا، ويعتبر بديلًا جيدًا عن الخدمات الأخرى مثل Google Meet أو Zoom، حيث يمكن ربط Jitsi Meet مع أدوات أخرى مفتوحة المصدر مثل Nextcloud أو Rocket.Chat أو ‎Synapse (Matrix implementation)‎ التي تتكامل مع بعضها لتوفير حل شامل، يمكن أيضًا استخدام Jitsi Meet مجانًا على خوادمهم لكن بمزايا محدودة، وللمزايا الإضافية يمكن الانضمام إلى Jitsi كخدمة المقدم من مطوري Jitsi، يمكن بدلًا من ذلك استضافة البرنامج على خادم خاص محلي، حيث من السهل نشر برنامج Jitsi، سنعرض تلك الخطوات ونشرحها ونشرح طريقة استضافته خلف وكيل عكسي وبدون ذلك.

المستلزمات

يجب القيام ببعض التحضيرات قبل البدء، حيث يفضل امتلاك معرفة مبدئية عن دوكر والحاويات، وامتلاك اسم نطاق خاص، حيث أن عملية الوصول لخادم التطبيق في هذا المقال لن تكون اعتمادًا على عنوان IP، بل سنشرح خطوات النشر باستخدام اسم نطاق حقيقي أو اسم نطاق فرعي مع تفعيل بروتوكول الاتصال الآمن HTTPS، ويمكن خلال مرحلة الاختبار الوصول للتطبيق عبر مسار بالبنية:

HTTP://[some IP]:[some port]‎

أيضًا امتلاك خادم لينكس حقيقي أو مُستضاف ضمن السحابة، حيث يمكن استخدام خادم لينكس على عدة استضافات مثل Linode أو DigitalOcean أو Vultr أو UpCloud، بينما استخدام AWS يمكن أن يعتمد بشكل كبير على النظام الأساسي لذا لن نتحدث عنه، حيث تنصح التوصيات الرسمية للبرنامج بتوفر ذاكرة للخادم بحجم 4 جيجابايت ومعالج ثنائي النوى لخدمة بين 10 و 20 مستخدم.

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

تعديل سجلات DNS

لا يكفي شراء وامتلاء اسم نطاق، يجب التأكد من إدراج سجلات DNS له أيضًا، سنستعمل ضمن هذا المقال اسم النطاق التالي "openexperiment.in"، وتأكد عند اتباعك للخطوات ضمن هذا المقال من تبديل اسم النطاق إلى اسم النطاق الخاص بك، حيث بعد امتلاك اسم النطاق ونشر الخادم (خادم فقط من دون برنامج Jitsi)، يجب جلب عناوين IP للخادم (كل من عنواني IPv4 و IPv6) ونضيف سجلات من النوع A و AAAA لكل منها على الترتيب، وبعد الانتهاء من ذلك يجب إضافة سجل من النوع CNAME، يمكن إضافة نطاق فرعي محدد، أو تعيين ذلك بمحرف بدل في حال كنا سنستضيف البرنامج على النطاق الأساسي.

الصورة التالية توضح ما ذكرناه، قمنا بتغطية عناوين IP بما أنها خاصة بالخادم الذي جهزناه لهذا المثال ويجب تعيين عناوين IP الخاصة بالخادم الخاص بك.

تعديل سجلات DNS

قد تحتاج للانتظار قليلًا ليتم تطبيق التغييرات ضمن DNS، يمكن استخدام الأمر ping للتأكد من تطبيق التغييرات، عبر تنفيذ الأمر ping على اسم النطاق إلى أن نحصل ضمن الخرج على عنوان IP الخاص بالخادم كالتالي (أيضًا أخفينا العنوان الحقيقي واستبدلناه بمحارف x):

❯ ping openexperiment.in -4
PING openexperiment.in (xxx.xxx.xxx.xxx) 56(84) bytes of data.
^C64 bytes from xxx.xxx.xxx.xxx: icmp_seq=1 ttl=55 time=36.6 ms

--- openexperiment.in ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 36.610/36.610/36.610/0.000 ms

يمكن أيضًا استخدام الأمر dig للتحقق من سجلات DNS كالتالي:

dig openexperiment.in +nocmd +nocomments

ليظهر لنا خرج مشابه للتالي:

❯ dig openexperiment.in +nocmd +nocomments
;openexperiment.in.   IN  A
openexperiment.in.  2970  IN  A xxx.xxx.xxx.xxx
;; Query time: 1 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sun Mar 07 11:38:20 IST 2021
;; MSG SIZE  rcvd: 62

فهم مكونات Jitsi Meet

من المفيد فهم مكونات البرنامج ودورها وأهميتها إلى جانب المكونات التي سنستخدمها لنشر التطبيق، يمكنك تجاوز هذه الفقرة إلى فقرة النشر إذا أردت:

  • jitsi/web:latest : وهي واجهة الويب لبرنامج Jitsi Meet التي تستخدمها عبر المتصفح، وهي مرفقة داخل الصورة، مع خادم ويب Nginx.
  • jitsi/prosody:latest : وهو خادم XMPP المسؤول عن الاتصالات المرئية أو الصوتية أو المحادثات النصية، وهو يعتبر أساس Jitsi.
  • jitsi/jicofo:latest : وهو مكون من خادم XMPP مسؤول عن إدارة جلسات الفيديو بين المشاركين وجسر الفيديو، بمعنى آخر هو من يدير الاجتماع، وهو عنصر آخر ضروري من Jitsi.
  • jitsi/jvb:latest : مكون جسر فيديو Jitsi مسؤول عن نقل قنوات الفيديو القادمة إلى كل المشاركين.

هذه هي المكونات الضرورية لعمل نسخة Jitsi المنشورة وهي فقط ما سنستخدمه ضمن هذا المقال، يوجد مكونات أخرى مثل Jibri و Jigasi ولكنها اختيارية ولن نتطرق إليها، إذا كنت تنوي نشر البرنامج خلف وكيل عكسي تأكد من إعداده أولًا قبل تنفيذ الخطوات التالية.

استنساخ مستودع docker-jitsi-meet

يحوي المستودع على كل الملفات التي سنحتاجها للنشر مع بعض التعديلات عليها، نستنسخ المستودع ونغير المسار الحالي إلى مسار مجلد المستودع كالتالي:

git clone https://github.com/jitsi/docker-jitsi-meet jitsi
cd jitsi

تعديل متغيرات البيئة

بما أننا نستخدم دوكر يجب تغيير بعض متغيرات البيئة، نستخدم نسخة ملف المثال لمتغيرات البيئة env.example المرفق داخل المستودع كقالب عبر تنفيذ الأمر:

cp env.example .env

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

./gen-passwords.sh

بعد إنهاء تنفيذه نلاحظ أنه تم ملئ النصوص السرية ضمن ملف ‎.env، ولن نحتاج كل تلك النصوص السرية لعملية النشر التي نقوم بها ويمكننا تركها دون حذف أو تعليق.

سنشرح الآن ثلاثة أقسام فرعية لإتمام عملية النشر، الأول لتعيين المتغيرات المشتركة لكلا طريقتي النشر مع وكيل عكسي وبدونه، والثاني للوكيل العكسي، والأخير للطريقة من دون استخدام الوكيل العكسي، كل تلك المتغيرات سيتم تعديلها ضمن الملف ‎.env .

المتغيرات المشتركة لكل من طريقة الوكيل العكسي وبدونه

المتغيرات التالية هي المشتركة بين طريقتي النشر، ونضيفها ضمن ملف ‎.env:

  • CONFIG: يمكننا تغيير قيمة هذا المتغير لكنها غير ضرورية، قيمته تعبر عن مجلد ضمن المضيف سيتم ربطه وتركيبه ضمن الحاويات لتخزين البيانات داخله، يمكنك تغيير القيمة حسب ما تريد.
  • PUBLIC_URL: اسم النطاق الذي سيتم استضافة Jitsi ضمنه مع البروتوكول، في مثالنا تكون قيمة هذا المتغير هي https://meet.openexperiment.in
  • ENABLE_AUTH: في حال أردنا تفعيل الاستيثاق، فيجب على المستخدم إدخال اسم المستخدم وكلمة السر الخاصة بحسابه المسجل قبل أن يتمكن من الانضمام أو إنشاء اجتماع، إذا أردت تفعيل تلك الميزة يمكنك إلغاء تعليق هذا السطر وتعيين قيمته إلى 1.
  • AUTH_TYPE: إذا عينت قيمة المتغير ENABLE_AUTH إلى 1، فيجب تعيين قيمة هذا المتغير إلى internal، يمكن أيضًا الاستيثاق عبر LDAP أو JWT ولكن لن نتطرق إليهما في هذا المقال.
  • RESTART_POLICY: سياسة إعادة تشغيل الحاويات، حيث أن القيمة الافتراضية لها هي unless-stopped، ويفضل تغييرها إلى always أو on-failure.
  • TZ: المنطقة الزمنية للنظام، إذا كان الخادم يعمل على المنطقة الزمنية UTC فلا داعي لتغيير هذه القيمة.

متغيرات طريقة النشر بدون الوكيل العكسي

إذا لم تكن تستخدم وكيل عكسي يجب إضافة المتغيرات التالية إلى ملف env.:

  • HTTP_PORT, HTTPS_PORT: عين تلك القيم إلى 80 و 443 بالترتيب، وهي المنافذ التي ستُربط مع الحاوية.
  • ENABLE_LETSENCRYPT: عين قيمتها إلى 1 في حال أردت تفعيل HTTPS.
  • LETSENCRYPT_DOMAIN و LETSENCRYPT_EMAIL: اسم النطاق الذي ستستضاف عليه النسخة وعنوان البريد لإرسال إشعارات متعلقة بشهادة الحماية.
  • ENABLE_HTTP_REDIRECT: عند تعيين قيمتها إلى 1 سيتم إعادة توجيه طلبات HTTP إلى HTTPS.
  • ENABLE_HSTS: عند تعيين قيمتها إلى 1 سيتم إجبار المتصفح على استخدام اتصالات موثوقة فقط.

متغيرات مطلوبة للوكيل العكسي

إذا كنت ستستخدم وكيل عكسي يجب إضافة المتغيرات التالية إلى ملف env.:

  • DISABLE_HTTPS: بما أن اتصال HTTPS سيتم معالجته من قبل خادم ويب الوكيل العكسي، فلا حاجة لفعيل HTTPS ضمن Jitsi، نعين قيمة هذا المتغير إلى 1.
  • ENABLE_HTTP_REDIRECT: عينها إلى 0 لأنها غير ضرورية، حيث أن اتصالات HTTP و HTTPS ستعالج من قبل الوكيل العكسي.
  • VIRTUAL_HOST و LETSENCRYPT_HOST: هذه المتغيرات غير موجودة ضمن الملف بشكل افتراضي، فيجب إضافتها وتعيين قيمها باسم النطاق الذي ستستضاف عليه النسخة.

تعديل ملف compose (فقط للوكيل العكسي)

نفتح ملف docker-compose.yml ضمن أي محرر نصوص، ونعدل خدمة خادم الويب فقط، عبر اتباع الخطوات التالية:

  • إزالة قسم ports، فلا حاجة لربط أي منافذ من الحاوية إلى المضيف.
  • إضافة شبكة أخرى، نفس الشبكة المستخدمة ضمن إعدادات الوكيل العكسي.
  • تعريف الشبكة في نهاية الملف كالتالي:
networks:
  net:
    external: true

وذلك بفرض اسم الشبكة هو net، يمكنك تغييره بحسب اسم الشبكة الذي لديك.

  • إضافة متغيري البيئة VIRTUAL_HOST و LETSENCRYPT_HOST كالتالي:
- VIRTUAL_HOST
- LETSENCRYPT_HOST

نشر الحاوية

بعد الانتهاء من كل التعديلات يمكننا نشر Jitsi عبر تنفيذ الأمر docker-compose up -d، وتأكد بعدها أن حاويات الوكيل العكسي تعمل إذا كنت تستخدم طريقتها، بقي الآن عملية إنشاء مستخدمين جدد لخادم Jitsi.

إنشاء المستخدمين

إذا فعلت ميزة الاستيثاق ضمن الإعدادات السابقة، فيجب تسجيل المستخدمين قبل أن يتمكنوا من استخدام Jitsi، يمكن تنفيذ ذلك بسهولة، عبر التوجه إلى مجلد المستودع الذي قمنا باستنساخه وتنفيذ أمر مشابه للتالي مع تبديل اسم المستخدم USERNAME وكلمة السر PASSWORD:

docker-compose exec prosody prosodyctl --config=/config/prosody.cfg.lua register [USERNAME] meet.jitsi [PASSWORD]

يمكن حذف مستخدم باستخدام الأمر unregister كالتالي مع تبديل اسم المستخدم بالاسم الصحيح:

docker-compose exec prosody prosodyctl --config=/config/prosody.cfg.lua unregister [USERNAME] meet.jitsi

الآن يمكنك الذهاب إلى واجهة Jitsi Meet عبر المتصفح من خلال عنوان اسم النطاق الذي سجلناه للتطبيق:

إنشاء المستخدمين في Jitsi Meet

ترجمة -وبتصرف- للمقال How to Self Host Jitsi Meet With Docker لصاحبه Debdut Chakraborty.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...