مثيل خادم Discourse مع وصول دون اتصال

الخلفية
لدينا نسخة مستضافة على السحابة من منصة Discourse لجماعة Ruby الأسترالية (سأشير إليها باسم “المُستضيف الرئيسي”). نُنظّم مرتين سنويًا فعاليات RailsCamp، حيث نقضي عطلة نهاية أسبوع كاملة معًا في موقع نائي (يتراوح عدد المشاركين بين 50 و150 شخصًا لكل فعالية). غالبًا ما يكون هناك تغطية ضعيفة أو معدومة لشبكات الهاتف المحمول، مما يجعل التنسيق تحديًا كبيرًا.

فكرتُ في أن يكون مثيل Discourse مستضافًا على الشبكة المحلية أثناء الفعالية هو الحل الأمثل (سأشير إليه باسم “العبد”). يمكن استخدامه لنشر الإعلانات وجدول الفعاليات ومشاركة الصور وما إلى ذلك.

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

التحدي
كيف يمكن تشغيل مثيل Discourse “العبد” بالتزامن مع “المُستضيف الرئيسي” بينما يكون “العبد” غير متصل بالإنترنت لمدة ثلاثة أيام؟

الحل المقترح
أدرك أن منصة Discourse لم تُصمّم لهذا الغرض، لكنني أعتقد أنه يمكن تكييفها لتناسب احتياجاتنا. أنا مهتم برأيكم في هذا الصدد.

الخطة:

  • نقوم بإعداد مثيل Discourse “العبد” على الشبكة المحلية أثناء الفعالية.
  • قبل الفعالية مباشرة، نقوم بنسخ احتياطي لـ “المُستضيف الرئيسي” واستعادته على “العبد”.
  • على “العبد”:
    • تُعلَّم جميع الفئات بأنها للقراءة فقط.
    • ننشئ فئة جديدة للقراءة والكتابة مخصصة للفعالية.
  • بعد الفعالية، نستخدم سكريبت Ruby لنقل المعلومات من “العبد” إلى “المُستضيف الرئيسي”:
    • المستخدمين الجدد الذين تم إنشاؤهم.
    • جميع المواضيع والمنشورات من الفئة المخصصة للفعالية.
  • النتيجة المرجوة.

الأسئلة

  • هل ترون أي مشاكل في الحل المقترح؟
  • هل يمكنكم اقتراح نهج أفضل؟

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

Hello from a fellow Australian Rubyist… :wave:

This all sounds fine to me. To sync stuff up after the event I would recommend writing a small script that zooms through your read write categories and then makes API requests using our JSON API to create the topics / posts on the master.

I definitely recommend strongly against having any kind of merge topic scenario, it will be full of dragons and not worth the effort.

@antulik

هل جربت أي شيء مشابه؟
أنا أعمل على مشروع مشابه حيث أحتاج إلى تشغيل discourse بشكل غير متصل مع مزامنة البيانات.
لدي خادم رئيسي وسأكون لدي أكثر من 100-200 خادم تابع (slave). يمكن أن تكون الخوادم التابعة متصلة أو غير متصلة بالإنترنت، لكنها ستُستخدم من قبل المستخدمين. ومع ذلك، كلما عاد خادم غير متصل إلى الإنترنت، يجب أن يتمكن من المزامنة مع الخادم الرئيسي دون إنشاء تعارضات، وتحديث جميع البيانات الأحدث. لا أريد إجراء أي تغييرات على الكود لأن discourse يقوم بتحديث نفسه بشكل متكرر، ولا أريد كسر الخوادم بسبب تغييرات الكود.

أفكر في تعديل PostgreSQL إلى حد ما. يمكن مزامنة الملفات الأخرى المتعلقة بالبيانات باستخدام Syncthing. لكن تحديث بيانات PostgreSQL هو ما يقلقني، لأنه إذا قمت بمزامنة بيانات الخادم الرئيسي مباشرة، فستُحذف أي عمل قام به المستخدم أثناء عدم الاتصال بعد المزامنة. كيف كانت تجربتك في كتابة السكريبتات لهذا الغرض؟

لم نقم بذلك بعد لأننا لم نكن نملك اتصالاً بالإنترنت في جميع مواقع الفعاليات.