العثور على النسخ الاحتياطي الذي تم إنشاؤه بواسطة واجهة المستخدم واستعادة الموقع

مرحبًا، يا Discourse،

في الليلة الماضية، كنت أعمل على ترقيات Discourse وأعدت بناء التطبيق، مما أدى إلى ظهور مجموعة من أخطاء Postgres. أدركت أن هذا ناتج عن الترقية الأخيرة، لكنني ظلت تظهر لي أخطاء “مرفوضة بسبب عدم وجود إذن”، وغيرها من المشاكل (ونعم، قمت بتغيير ملكية كل شيء إلى 700، لذا لم يكن الأمر عامًا). لذا، قمت بنقل مجلد /var/discourse الأصلي إلى مكان كان من المفترض أن يكون مؤقتًا، وقمت بإعادة تثبيت نسخة جديدة من Discourse في محاولة لتحديث Postgres على الأقل.

هنا يبدأ الأمر بالمتعة. كان لدي نسخة احتياطية من الموقع (قاعدة البيانات فقط، حيث تم حفظ الملفات المرفوعة في حجم مختلف) تم إنشاؤها عبر واجهة المستخدم قبل ثلاثة أيام. أو على الأقل، كنت أظن ذلك. ما لدي الآن هو ملف يُسمى wacky-writers-forum-2021-04-06-033906-v20210328233843.sql.gz، والذي أعتقد أنني تعلمت أنه في الواقع ليس ملف tar.gz الذي يجب أن تكون عليه النسخة الاحتياطية الفعلية.

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

أقوم بحفظ نسخي الاحتياطية والملفات المرفوعة في تخزين Digital Ocean الكتلي، ولا يزال لدي مجلد discourse من التثبيت القديم الذي كان يعمل، لكن نقله أو نسخه مرة أخرى إلى /var/discourse يكسر كل شيء مرة أخرى، بما في ذلك ظهور أخطاء Postgres. لقد عملت على هذا لمدة 9 ساعات متواصلة، وأنا على وشك الوصول إلى حضيض صبري. هل يمكن لأي شخص مساعدتي، أو على الأقل محاولة توجيهي في الاتجاه الصحيح؟ :pray: لقد وصلنا للتو إلى علامة 1000 مستخدم، وأود حقًا حقًا تجنب فقدان كل ذلك.

تم التعديل لتحديث إعدادات الرفع الخاص بي.

إذا كان لديك تكوين S3 في ملف app.yml، فيمكنك ببساطة إجراء استعادة عبر سطر الأوامر، وسيتم جلب النسخة الاحتياطية من S3.
وبما أن أصولك مخزنة في S3، فإن النسخة الاحتياطية تحتوي فقط على قاعدة البيانات.

يجب أن تتمكن ببساطة من استنساخ مجلد /var/discourse الجديد، ونسخ ملف yml الخاص بك، وإعادة البناء، ثم إجراء استعادة عبر سطر الأوامر.

استخدام التخزين الكائني للتحميلات (S3 والنسخ)

استعادة نسخة احتياطية من سطر الأوامر

أظن أنني استخدمت المصطلح الخطأ لوصف كيفية إعداد نسخي الاحتياطية/تحميلي. لقد استخدمت هذه الطريقة: Move Uploads and Backups to DigitalOcean Block Storage

سأعدّل ذلك وأقول إن تحميلي ونسخي الاحتياطية ليست محلية لمجلد discourse الرئيسي (هذا جزئيًا كيف بدأت كل هذه القصة، كنت أحاول نقلنا إلى DigitalOcean Spaces). لذا، لا، للأسف، لم أقم بأي إعدادات لـ S3 لأنني كنت فقط أحفظها في مساحة تخزين موصولة.

كانت النسخ الاحتياطية تُحفظ في mnt/my_storage/shared/standalone، ولكن عندما أذهب للبحث عن النسخ الاحتياطية هناك، كل ما لدي هو ملف wacky-writers-forum-2021-04-06-033906-v20210328233843.sql.gz. لقد حاولت بالفعل الاستعادة من هذا الملف لعدم وجود فكرة أفضل (وهو ما كان ربما خطأ)، لكنني حصلت على خطأ “مرفوض من حيث الإذن”. أنا متأكد أن الأمر يتعلق بكيفية إنشاء هذه النسخ الاحتياطية فعليًا.

إذن، هل لا تزال ملفاتك المرفوعة مخزنة على مساحة التخزين الكتلية الخاصة بـ DigitalOcean؟

نعم، جميع التحميلات سليمة.

حسنًا، هذا جيد.

في هذه الحالة، يجب أن تتمكن من استعادة ملف SQL، ثم إعادة توصيل وحدة تخزين الكتلة لاستعادة ملفات التحميل الخاصة بك.

هناك نوعان من النسخ الاحتياطية: sql.gz الذي لا يتضمن ملفات التحميل، و tar.gz الذي يتضمنها. لذا، كان لديك النوع الخاطئ من النسخ الاحتياطي، لكن حقيقة أن ملفات التحميل كانت على وحدة تخزين خارجية أنقذت ظهرك.

إعجابَين (2)

لذا أدخلت التطبيق واستعدت ملف sql.gz، لكنني حصلت على خطأ “مرفوض بسبب عدم وجود صلاحية”. هل لديك أي فكرة عن سبب ذلك؟

أنت تقول لي!! :slight_smile:

(بافتراض أنك تقصد chmod). إذا كانت الملفات مضبوطة على مالك خاطئ، فلن تكون قابلة للكتابة.

أعتقد أن هذا ربما تسبب في رفض الإذن.

ما هو الخطأ الدقيق؟

نعم، شكرًا لك، لقد بقيت مستيقظًا طوال الليل وأصبحت عقليًا منهكًا بعض الشيء.

استثناء: lib/discourse.rb:93:in `exec': فشل في نسخ الأرشيف إلى مجلد tmp.
cp: لا يمكن فتح '/var/www/discourse/public/backups/default/wacky-writers-forum-2021-04-06-033906-v20210328233843.sql.gz' للقراءة: إذن مرفوض

جرب chmod 644 /var/www/discourse/public/backups/default/*

إعجابَين (2)

حسناً، أنا أعمل على ذلك الآن وسأبلغك قريباً. شكراً لك على تخصيص وقتك لمساعدتي.

نجح هذا في بدء عملية الاستعادة، شُكراً جزيلاً لك. :pray:

الآن عليّ فقط أن أفهم سبب عدم تحميل الموقع بعد. :grimacing:

إعادة البناء جارية حالياً مع ملف app.yml المحفوظ من قبل أن يحدث كل هذا الخلل.

إعجاب واحد (1)

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

يمكنك تنزيله من S3 ووضعه في

/var/discourse/shared/standalone/backups/default

يجب أن تتمكن من استعادة النسخة من سطر الأوامر.

ولكن بعد ذلك، يجب عليك تكوين إعدادات S3 الخاصة بك كما هو موضح في الرابط أعلاه؛ فهذا يجعل الأمور أسهل.

إعجابَين (2)

شكرًا لك، جاي. نعم، هذا بالتأكيد هو خطتي.

إعجاب واحد (1)

حسنًا، إليك أين وصلت الآن.

  • تم استعادة قاعدة البيانات بنجاح من ملف .sql.gz. (يا لها من فرحة! شكرًا مجددًا ريتشارد.)
  • تأكدت من أن ملف app.yml يحمل نفس الإعدادات التي كانت عليه قبل تعطل كل شيء.
  • شغلت الأمر ./launcher rebuild app
  • اكتملت عملية إعادة البناء بنجاح مع Postgres 13 (أخيرًا)

ومع ذلك، لا يزال الوصول إلى الموقع نفسه غير متاح. أستخدم Cloudflare، لكنني فعلت وضع التطوير حاليًا، وقمت بتفريغ ذاكرة التخزين المؤقت لـ DNS. جميع التوجيهات صحيحة كما يجب. قالب Cloudflare موجود في ملف app.yml.

يتم حل أسماء النطاقات (DNS) بشكل صحيح، وأسماء المضيفين محدثة، وتم تثبيت Discourse باستخدام عنوان URL المناسب، وقد نفدت من الأفكار.

عنوان URL هو https://forum.wackywriters.com، وأواجه فقط أخطاءً تقول “الخادم غير متاح”. أشعر وكأنني أدور في حلقة مفرغة هنا (عذرًا)، لكن هل لديك أي اقتراحات؟

تعديل: عند تشغيل ./discourse-doctor، أرى أن هناك نسختين من التطبيق تعملان داخل Docker:

هل هذا طبيعي؟ (يبدو أنه ليس كذلك، لكن كل ما كنت أعرفه عن Discourse قد أُسقط من نافذتي خلال الـ 24 ساعة الماضية :sweat_smile: )

تعديل 2: كنت أرجئ هذا كحل أخير، لكنني سأحاول الآن إعداد خادم جديد تمامًا مع تثبيت نظيف لـ Discourse. أنا قلق من أن يكون قد حدث شيء معقد بسبب كل تعديلاتي، ولا أستطيع معرفة ما الذي تعطل. لحسن الحظ، لا يزال لدي النسخ الاحتياطي وجميع الملفات المرفوعة في تخزين الكتل، لذا إذا حظيت بحظ جيد، يجب أن أتمكن من ربطها بخادم جديد (droplet) ونقل البيانات منه. إذا كان لدى أي شخص نصائح أو اقتراحات إضافية، فسأقدر الخبرة الأقدم من خبرتي.

تعديل 3: حتى مع وجود خادم جديد وانتشار عنوان IP (يبدو أن nslookup و ping يعملان بشكل جيد، وموقع whatsmydns.net يبدو جيدًا)، لا يزال المنتدى لا يعمل. ما زلت أحصل على أخطاء اتصال. يبدو وكأنه لا يقوم بربط عنوان IP بنسخة Discourse، وبدلاً من ذلك يحاول تحميل صفحة ثابتة، وهو أمر غير موجود بالطبع في هذه الحالة.

إذًا، بعد ما يقارب 24 ساعة من النضال، أدركت السبب وراء رفض تحميل الموقع بعد بدء عملية الاستعادة.
:point_down:

بسبب إعادة التعيين وإعادة التثبيت العديدة وما لا يعلمه إلا الله، وصلت إلى حد معدل الطلبات، لذا قمت مؤقتًا بإسقاط قوالب SSL وسأعيدها للعمل خلال أسبوع.

الموقع “يعمل” بينما أعيد معالجة جميع المنشورات لإصلاح الصور المعطلة، لكنني أقدر حقًا مساعدتي جاي وريتشارد اليوم؛ لقد ساعدتموني في تجاوز الأجزاء التي لم أستطع حلها بمفردي.

الآن، يجب أن أحمل نسخة احتياطية حقيقية حتى أتمكن من إعداد S3 هذا الأسبوع دون القلق من تكرار هذه المشكلة مرة أخرى. :sweat_smile:

إعجاب واحد (1)

إذا بحثت، توجد طريقة لإضافة دومين ثانٍ بحيث يُحتسب كطلب منفصل لـ Let’s Encrypt. لكن الانتظار أسهل.

أوصي بتعيين غيوم كلاودفلير إلى اللون الرمادي دون تفعيل أي تحسينات للسرعة.

إعجاب واحد (1)

@pfaffman أليس من الممكن أنك تخلط بين تخزين الكائنات وتخزين الكتل؟ تخزين الكائنات هو S3، لكن TS يقولون إنهم استخدموا تخزين الكتل، وهو مجرد قرص مرفق في مجلد التحميلات الخاص بهم:

إعجاب واحد (1)

أوه. :man_facepalming:

نعم. إذن لا معنى لأي شيء قلته.

شكرًا لك على ملاحظتك، ريتشارد.

إعجابَين (2)

حسنًا، معظم ما قلته كان منطقيًا، لكنك أربكتني هنا :slight_smile:

إعجابَين (2)