مثيل خادم 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

Did you try anything for the same ?
I am into a similar thing where I need to take discourse offline with sync.
I have a master server and I will be having more than 100-200 slave instance. Slave instance can be online/offline but will be used by users. But whenever an offline instance comes online it should be able to sync with master server without creating conflicts and all update all the latest data. I do not want to create any code related changes as discourse keeps updating itself quite often and don’t want to break instance due to code changes.

I am thinking of tweaking postgresql to some extent. Other files related data can be synced using syncthing. But updating postgresql data is something which worries me because if i directly sync master data then the work done by offline user will get erased after the sync. How was your experience writing scripts for the same ?

We didn’t do it yet as we had internet access at all event locations.