Configure automatic backups for Discourse

Thanks for the hint. That pushed me towards the command line option which we can schedule to do whenever: :+1:

إعجابَين (2)

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

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

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

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:List*",
                "s3:Get*",
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:PutObjectVersionAcl",
                "s3:PutLifecycleConfiguration",
                "s3:CreateBucket",
                "s3:PutBucketCORS"
            ],
            "Resource": [
                "arn:aws:s3:::classicaltheravadabucket",
                "arn:aws:s3:::classicaltheravadabucket/*",
                "arn:aws:s3:::classicaltheravadabackupbucket",
                "arn:aws:s3:::classicaltheravadabackupbucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:*"
            ],
            "Resource": "*"
        }
    ]
}
إعجابَين (2)

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

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

لست متأكدًا مما تتحدث عنه. النسخ الاحتياطية الخاصة بي تعمل، انظر الصورة.
أستخدم s3 لأن النسخ الاحتياطية الخاصة بـ DigitalOcean أسبوعية فقط، وإذا تعطل الخادم وتم حذفه، فلن يكون ذلك مفيدًا.
من ناحية أخرى، آمل أن يكون الاستعادة من s3 أو تنزيل حاوية s3 على ما يرام.
لا أقوم بتحميل الصور، وآمل أن يتم عمل نسخة احتياطية من النسخ الاحتياطية لـ s3 بما في ذلك الصور (على الرغم من أنها قليلة جدًا).

بشكل عام: لا.
لا معنى لعمل نسخة احتياطية للصور في حاوية S3 إلى حاوية S3 أخرى؟

إعجابَين (2)

هل يمكنك أن تكون أقل غموضًا؟
كانت التعليمات تحتوي على 2 من مستودعات S3. لم أتمكن من جعل ذلك يعمل.
لدي مستودع S3 واحد فقط. نأمل أن تكون الصور مدرجة في هذا النسخ الاحتياطي.. هل هذا صحيح؟

أتخيل أن النسخ الاحتياطي المحلي يعمل بنفس الطريقة، أليس كذلك؟

يرجى الإجابة بجمل كاملة بخصوص أسئلتي. كان البرنامج التعليمي مربكًا للغاية أيضًا.

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

ما هو الغموض في كلمة “لا”؟ (وما هو غير الغامض في “النسخ الاحتياطي يتم نسخه احتياطيًا”؟ :wink: )

دعني أحاول مرة أخرى.

إذا قمت بتكوين التحميلات لتكون على S3، فلن يتم تضمين التحميلات في النسخ الاحتياطي الخاص بك.

إعجابَين (2)

دعنا نستخدم مصطلح “صور” بدلاً من “تحميلات” على الرغم من أنه يمكن أن يكون وسائط أخرى.
بهذه الطريقة لا نخلط محتوى النص كتحميل أقوم بتحميله إلى S3.

إذًا، ملفات النسخ الاحتياطي بحجم 62 ميجابايت على S3 كما هو مصور ومحمل في هذا الموضوع لا تتضمن الصور؟

إذًا كيف أتأكد من أن النسخ الاحتياطي تحتوي على هذه؟
هل النسخ الاحتياطي المحلي يحتوي على الصور أيضًا؟

عندما قمت بتكوين S3 لـ “التحميلات (للوسائط)”، كان هذا غامضًا أيضًا. لم يتمكن أحد من نشر الصور لأنها تم رفضها من S3…

هل هناك طريقة للحصول على نسخ احتياطية يومية محلية وعلى S3؟
لا يهمني إذا فُقدت 5 أيام من الصور، فنحن في الغالب مجموعة تعتمد على النصوص.
لكنني سأهتم إذا فُقدت 5 أيام من النصوص. Digital Ocean تقوم فقط بعمل نسخ احتياطية لمدة 7 أيام إذا دفعت لهم.
لذلك، على الرغم من أنني أستطيع عمل نسخ احتياطي يومي، إذا تعرضت القطرة للاختراق أو التلف، فسنفقد تلك النسخ الاحتياطية… أبدأ في الاعتقاد بأن القيمة المضافة في S3 ليست كبيرة.

أتمنى لو كانت هناك نسخ احتياطية بسيطة مشابهة لـ WordPress والتي تسمح لي بعمل نسخ احتياطي إلى حسابي على Google أو Dropbox.

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

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

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

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

نظرًا لأن منشوراتك تتعلق بالنسخ الاحتياطي وليس بتحميلات الملفات والصور، فسوف أنقلها إلى موضوع آخر.

3 إعجابات

أود نقل النسخ الاحتياطية الخاصة بي من S3 إلى Glacier تلقائيًا ولكنني مرتبك بسبب الخطوات المرتبطة في المنشور الأول، والتي لا تشرح الكثير، ربما لأن هناك أشياء قديمة.

ما هي الخيارات التي يجب تحديدها هنا؟ :thinking:

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

أيضًا، هل تعرف ما الذي يسبب هذه التقلبات في رسوم S3؟

بالإضافة إلى ذلك، منذ إطلاق المنتدى (سبتمبر 2020)، زاد حجم النسخ الاحتياطية بنسبة 15% تقريبًا، لكن فواتير S3 تضاعفت، من 2.50 دولار إلى 5 دولارات. هل لديك أي فكرة عن سبب ذلك؟

لهذا السبب أود استخدام Glacier.


تعديل: لقد اتبعت الخطوات الموضحة هنا وسأرى كيف تسير الأمور.

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

حسنًا، لا تسير الأمور على ما يرام. :sweat_smile:

تكوين دورة حياتي:

دلو S3 الخاص بي:

لا يوجد نسخ احتياطي على Glacier.

إذًا… سؤالان لمن تمكنوا من تحقيق هذا الانتقال الآلي من S3 إلى Glacier:

  1. ما الذي قد يكون خاطئًا في تكويني؟

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

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

أين يتم تخزين النسخ الاحتياطية في الخادم الافتراضي الخاص؟

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

لقد أضفت هذا إلى OP:

إعجابَين (2)

هل يمكننا اختيار مجلد النسخ الاحتياطي أم أن هناك حلاً بديلاً بدون برمجة؟

أنا أستخدم بيانات تخزين من مزود الاستضافة الخاص بي بحيث يمكنني تحميلها واستخدامها كما لو كانت محلية، ولكن لا يُفترض حفظها في المسار الافتراضي.

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

إذا كنت ترغب في حفظه في مكان مختلف، فستحتاج إلى تغيير ذلك في ملف app.yml الخاص بك.

إعجابَين (2)

النسخ الاحتياطي التلقائي على Backblaze B2

إليك كيف قمت بإعداده لموقع افتراضي مستضاف على example.com

  1. قم بإنشاء حساب على Backblaze (حاليًا، لا حاجة لإدخال الدفع مقابل أقل من 10 جيجابايت وهو مجاني)
  2. قم بإنشاء حاوية (Backblaze > B2 Cloud Storage)
    • الاسم: $sitename-discourse-$random مملوء إلى 30 حرفًا
      • في هذا المثال: example-discourse-g87he56ht8vg
      • تحتاج Discourse إلى أن يكون اسم الحاوية أحرفًا صغيرة وأرقامًا وشرطات فقط
      • أقترح الاحتفاظ به عند 30 حرفًا أو أقل لأنه يظهر بشكل جيد في واجهة الويب الخاصة بـ Backblaze دون التفاف
    • حاوية خاصة
    • تمكين التشفير (SSE-B2)
    • تمكين قفل الكائنات
  3. قم بإنشاء مفتاح تطبيق (Backblaze > Account > App Keys)
    • اسم المفتاح: example-discourse
    • اسم الحاوية (السماح بالوصول إلى الحاوية (الحاويات)): example-discourse-g87he56ht8vg
    • القدرات: قراءة وكتابة
    • اترك namePrefix و validDurationSeconds فارغين
  4. قم بتكوين إعدادات Discourse B2 (Discourse > Admin > Settings)
    • backup_location: s3
    • s3_backup_bucket: example-discourse-g87he56ht8vg
    • s3_endpoint: يتم عرضه على صفحة الحاوية - تأكد من إضافة https:// في البداية
    • s3_access_key_id: (من الخطوة السابقة)
    • s3_secret_access_key: (من الخطوة السابقة)
      • يعرض لك Backblaze المفتاح مرة واحدة فقط (عند الإنشاء)!
    • بالمناسبة، يمكنك أيضًا تعيين هذه كمتغيرات بيئة في ملف YML الخاص بالحاوية بدلاً من ذلك. سيسمح لك هذا بالاستعادة باستخدام هذا الملف فقط ولا شيء آخر:
env:
  ## Backblaze B2 Backups
  # DISCOURSE_BACKUP_LOCATION: 's3' # uncomment to recover from cli
  DISCOURSE_S3_ENDPOINT: 'https://....backblazeb2.com'
  DISCOURSE_S3_BACKUP_BUCKET: 'example-discourse-g87he56ht8vg'
  DISCOURSE_S3_ACCESS_KEY_ID: '...'
  DISCOURSE_S3_SECRET_ACCESS_KEY: '...'
  # DISCOURSE_DISABLE_EMAILS: 'non-staff' # uncomment to disable email during a test restore
  ## you can restore with no data beyond this container yml.
  ## uncomment DISCOURSE_BACKUP_LOCATION above, build container (./launcher rebuild ...),
  ## and then run this inside container (it will restore from B2 bucket):
  ##   discourse enable_restore
  ##   discourse restore <example-com-...tar.gz> # choose restore filename by browsing B2 webui
  ## remember to disable restore afterwards
  1. قم بتكوين الاحتفاظ بالنسخ الاحتياطي
    • Discourse:
      • backup_frequency: 1 (نسخ احتياطي يومي في هذا المثال، ولكن يمكنك القيام بأسبوعي)
      • maximum_backups: تجاهل هذا الإعداد - دع Backblaze يتعامل معه :sunglasses:
      • s3_disable_cleanup: true (منع إزالة النسخ الاحتياطي القديم من S3 عندما يكون هناك نسخ احتياطي أكثر من الحد الأقصى المسموح به)
    • Backblaze (انتقل إلى إعدادات الحاوية الخاصة بك):
      • قفل الكائنات (سياسة الاحتفاظ الافتراضية): 7 أيام
      • إعدادات دورة الحياة (مخصصة):
        • fileNamePrefix: default/example-com (اختياري)
        • daysFromUploadingToHiding: 8 أيام
          • يجب أن يكون هذا قفل الكائن + 1
        • daysFromHidingToDeleting: 1 يوم

لتلخيص الاحتفاظ في هذا المثال:

  • تنشئ Discourse نسخًا احتياطيًا كل يوم.
  • كل ملف نسخ احتياطي غير قابل للتغيير لمدة 7 أيام بعد تحميله إلى B2 (قفل الكائن). هذا يحميك من الحوادث، برامج الفدية، إلخ.
  • بعد 8 أيام من التحميل، تنتهي صلاحية قفل الكائن على النسخة الاحتياطية. نظرًا لأنه قابل للتغيير مرة أخرى، يمكن لقاعدة دورة الحياة إخفاء ملف النسخة الاحتياطية.
  • الجزء التالي من قاعدة دورة الحياة يحذف أي ملف بعد يوم واحد من إخفائه.

لذلك تحصل على نسخ احتياطي يومي. مدة الاحتفاظ هي أسبوع واحد لا يمكن خلاله حذف النسخ الاحتياطية بغض النظر عن أي شيء. ثم يتم حذف النسخ الاحتياطية بعد يومين. لذا فإن النسخة الاحتياطية تعيش لمدة 9 أيام تقريبًا.

آمل أن يساعد هذا شخصًا ما :slight_smile:


في تفكير ثانٍ، ربما من الأفضل ترك Discourse يتعامل مع الاحتفاظ (maximum_backups). بهذه الطريقة، لن تبدأ النسخ الاحتياطية في الانتهاء تلقائيًا إذا كان Discourse معطلاً. لن ترغب في أن يتم حساب الوقت على انتهاء صلاحيتها أثناء محاولة الاستعادة. إذا اخترت هذا المسار، يمكنك تعيين maximum_backups=8 و s3_disable_cleanup=false في هذا المثال وعدم استخدام سياسة دورة حياة في B2. ستظل تستخدم سياسة قفل الكائن (7 أيام)، مع ذلك.

تعديل: في الواقع، أعتقد أنك لا تزال بحاجة إلى سياسة دورة حياة B2 لأنني أعتقد أن الملفات يتم “إخفاؤها” فقط ولا يتم حذفها عندما يقوم عميل S2 بحذفها. أنا أستخدم سياسة " Keep only the last version of the file "، وهي تعادل daysFromHidingToDeleting=1, daysFromUploadingToHiding=null.

أعتقد أنك يجب أن تفكر في الأمر وتقرر أي نهج هو الصحيح بالنسبة لك.

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

6 إعجابات

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

يبدو الباقي خطة جيدة.

3 إعجابات

discourse restore <backup.tar.gz>

هل سيبحث هذا في الحاوية الخاصة بك إذا قمت بتعيين متغيرات البيئة؟ رائع جدًا إذا كان الأمر كذلك.

وفي هذه الحالة، يمكنك أيضًا تعيينها يدويًا باستخدام export في bash في حالة الاسترداد غير المحتملة. هذا، إذا كنت لا ترغب في الاحتفاظ بالأسرار في ملف yml الخاص بالحاوية الخاصة بك لسبب ما.

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

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