نسخ احتياطي للنقاش من سطر الأوامر

:bookmark: This guide covers how to back up and restore your Discourse site using command line tools, specifically designed for self-hosted environments.

:person_raising_hand: Required user level: Administrator

:information_source: You can use the below placeholders to automatically fill out the command line prompts in this guide:

Backing up

To create a backup of your Discourse site, follow these steps:

  1. Enter the container:
./launcher enter app
  1. Run the backup:
discourse backup
exit

This will print out the final filename of your backup. Download the backup and container configuration (if needed) to your local machine:

scp =USER=@=HOST=:/var/discourse/shared/standalone/backups/default/=FILENAME= .
scp =USER=@=HOST=:/var/discourse/containers/app.yml .

Restoring

To restore a Discourse backup, follow these steps:

  1. Install a Discourse site on the server you are restoring to.

If you’re testing this procedure multiple times, you can wipe the data on your test server.

Wipe Discourse data (optional)
./launcher stop app
./launcher destroy app
rm -r /var/discourse/shared/standalone/
mkdir -p /var/discourse/shared/standalone/backups/default/

  1. Upload the backup file:
scp =FILENAME= =USER=@=HOST=:/var/discourse/shared/standalone/backups/default/
  1. Enter the container and start the restore:
./launcher enter app
discourse enable_restore
discourse restore =FILENAME=

If you happen to forget what the filename was, run the “discourse restore” command by itself to get a list of available backup files.

:information_source: For a two-container setup, use ./launcher enter web_only and replace standalone with web-only in the path to backups.

For additional information about restoring Discourse backups, see Restore a backup from the command line.

Last edited by @SaraDev 2024-08-23T20:50:17Z

Check documentPerform check on document:
40 إعجابًا

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

على جهازك المحلي.

هل تستخدم مفتاح SSH للاتصال؟ الخطأ متعلق بذلك.

يجب أن يكون الأمر بعد ذلك:

scp -i /path_to_your_key/your_key.pem root@147.43.15.199:/var/discourse/shared/standalone/backups/default/discourse-2024-12-25-033740-v20241211222608.tar.gz .

لدي سيناريو أرغب فيه في ترحيل تثبيت Discourse إلى خادم جديد تمامًا.
كانت خطتي:

  1. إنشاء تثبيت Discourse جديد فارغ
  2. عمل نسخة احتياطية من Discourse القديم، ونسخها احتياطيًا إلى الخادم الجديد واستعادتها
  3. نسخ كل شيء من S3 (صور، إلخ) إلى S3 جديد في حساب مختلف

تنجح عملية الاستعادة جيدًا حتى تبدأ في البحث عن S3 ثم تفشل لعدم وجود وصول. أعتقد أنها تحاول الوصول إلى نفس اسم حاوية S3 على Discourse القديم، ولكن هذه الحاوية غير موجودة في الحاوية الجديدة ولا يمكنني إنشاؤها.

هل هناك حل موصى به؟

اعتقدت أنه يمكنني محاولة تغيير اسم حاوية S3 على Discourse القديم (قبل إجراء النسخ الاحتياطي) ثم عند الاستعادة، سيتوقع وجود حاوية S3 الجديدة. لكنني أخشى مما سيحدث لـ Discourse القديم إذا قمت بتبديله إلى حاوية غير موجودة.

هناك إعداد مخفي سيقوم بتنزيل ملفات s3 ووضعها في النسخة الاحتياطية.

تحتاج إلى تكوين s3 في ملف yml كما هو موضح في تكوين موفر تخزين كائنات متوافق مع S3 للتحميلات

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

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

هل اكتشفت هذا الأمر؟

تحتاج إلى تكوين s3 في متغيرات البيئة كما هو موضح في تكوين موفر تخزين كائنات متوافق مع S3 لعمليات التحميل

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

ولكن هناك مفتاح لأمر الاستعادة يجعله يتوقف مؤقتًا بين الأجزاء المختلفة. يمكن أن يساعد ذلك.

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

أقوم دائمًا بإعادة البناء من سطر الأوامر، لكنني أقوم أولًا بالنسخ الاحتياطي باستخدام الموقع. هذه المرة نسيت إجراء النسخ الاحتياطي! أعتقد أن استخدام سطر الأوامر في كلتا الحالتين قد يساعدني :slight_smile: تمنياتي بالتوفيق.

نص النسخ الاحتياطي ذكر:

انتهى!
[نجاح]
تم النسخ الاحتياطي.
ملف المخرجات موجود في: /var/www/discourse/public/backups/default/FILENAME.tar.gz

في البداية حاولت تنزيل ذلك، لكنه يحتوي على المسار الخاطئ. عثرت على الملف في مكان آخر، وفقط بعد ذلك لاحظت أن الأوامر في هذا الموضوع صحيحة…

مرحبًا! أود فقط أن أشير إلى أنه لإجراء النسخ الاحتياطي دون رفع الملفات، استخدم الأمر التالي:

discourse backup --sql-only

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

ملاحظة ممتازة - يجب أن نضيف هذا (وبعض المعلومات الأخرى) إلى المنشور الأصلي.

إعجابَين (2)

مرحباً @supermathie ! من دواعي سروري “رؤيتك”. لست متأكداً إذا كنت تتذكرني؟ أجرينا مقابلة قبل فترة.

أيضاً، كان من الجيد لو أن معامل --help يعمل بعد تنفيذ أمر discourse backup. بدلاً من ذلك، ينتهي الأمر بتسمية النسخة الاحتياطية “–helpXXX”. :lolsob:

مع أطيب التحيات!

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

توفر واجهة سطر الأوامر discourse (المُنفذة عبر script/discourse باستخدام حزمة Thor) 13 أمرًا فرعيًا أساسيًا مصنفة في النسخات الاحتياطية والاستعادة، إدارة الموقع والأوضاع، أدوات قاعدة البيانات، وهجرة البيانات (الاستيراد/التصدير).


مرجع سريع للأوامر

الفئة الأمر الفرعي الوظيفة الأساسية
النسخ الاحتياطي والاستعادة backup ينشئ أرشيف نسخ احتياطي كامل أو لقاعدة البيانات فقط.
restore يستعيد ملف النسخ الاحتياطي .tar.gz إلى المثيل.
enable_restore يمنح الإذن بتنفيذ أوامر الاستعادة.
disable_restore يسحب الإذن بتنفيذ عمليات الاستعادة.
rollback يعكس حالة قاعدة البيانات بعد فشل عملية الاستعادة.
أوضاع الموقع enable_readonly يبدّل وضع القراءة فقط المؤقت عبر الموقع.
disable_readonly يزيل وضع القراءة فقط لاستعادة الكتابة العادية في الموقع.
request_refresh يُطلق مطالبة بتحديث المتصفح لجميع العملاء المتصلين النشطين.
عمليات قاعدة البيانات remap يؤدي بحثًا واستبدالًا نصيًا عالميًا عبر جداول قاعدة البيانات.
هجرة البيانات export_category يصدر فئة واحدة، ومواضيعها، والمستخدمين المرتبطين بها.
import_category يستورد أرشيف فئة إلى المنتدى الحالي.
export_topics يصدر مواضيع محددة حسب المعرف وحسابات مؤلفيها/المرددين عليها.
import_topics يستورد أرشيف موضوع إلى المنتدى الحالي.

وثائق مفصلة للأوامر الفرعية

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

discourse backup [FILENAME]

  • الوصف: ينشئ نسخة احتياطية كاملة لقاعدة بيانات المنتدى والملفات الثابتة (Assets).

  • العلامات:

  • --sql-only: (قيمة منطقية، الافتراضي: false) يصدر فقط قاعدة بيانات PostgreSQL، متجاوزًا الملفات المرفوعة محليًا.

  • --s3-uploads: (قيمة منطقية، الافتراضي: false) يفرض تضمين الملفات الثابتة المخزنة في S3 في أرشيف النسخ الاحتياطي (يُتجاهل عند تعيين --sql-only).

  • مثال:

discourse backup
discourse backup --sql-only

discourse restore [FILENAME]

  • الوصف: يستعيد نسخة احتياطية للمنتدى من أرشيف محلي .tar.gz موجود في /var/www/discourse/public/backups/default.
  • المتطلب المسبق: يتطلب تشغيل discourse enable_restore أولاً.
  • مثال:
discourse restore discourse-2026-07-22-120000-v2026xxxx.tar.gz

discourse enable_restore و discourse disable_restore

  • الوصف: يبدّل العلم التطبيقي الذي يسمح أو يقيد مهام الاستعادة عبر واجهة سطر الأوامر أو الويب.
  • تسلسل الاستخدام:
discourse enable_restore
discourse restore <filename>
discourse disable_restore

discourse rollback

  • الوصف: يعكس مخطط قاعدة البيانات وحالتها إلى النقطة التي كانت عليها قبل فشل تنفيذ عملية الاستعادة.

2. حالة الموقع والتحكم في العملاء

discourse enable_readonly و discourse disable_readonly

  • الوصف: يحدد أو يزيل READONLY_MODE_KEY في Redis.
  • التفاصيل:
  • يجمد عمليات الكتابة في قاعدة البيانات مع إبقاء الموقع قابلًا للقراءة للمستخدمين.
  • يستخدم حلقة «مدة الحياة» (TTL) القصيرة التي يتم تجديدها أثناء النشاط، مما يمنع بقاء الموقع مقفلاً بشكل دائم إذا تعطلت جلسة الطرفية.

discourse request_refresh

  • الوصف: يرسل رسالة نظام عبر MessageBus تأمر جميع جلسات الويب المتصلة بإعادة تحميل صفحة الويب. مفيد بعد نشر تحديثات الملفات الثابتة أو التغييرات العالمية في السمات.

3. إعادة تعيين قاعدة البيانات

discourse remap [OPTIONS] FROM TO

  • الوصف: يؤدي بحثًا واستبدالًا مباشرًا للسلاسل النصية عبر الأعمدة النصية في قاعدة البيانات. أمر حاسم عند تحديث أسماء النطاقات، أو مسارات CDN، أو بادئات رفع الصور.

  • العلامات:

  • --global: (قيمة منطقية) يمسح ويعيد تعيين عبر جميع الجداول بدلاً من جداول المحتوى القياسية.

  • --regex: (قيمة منطقية) يقيّم معامل FROM كتعبير نمطي بدلاً من سلسلة حرفية.

  • مثال:

discourse remap "old-domain.com" "new-domain.com"
discourse remap --global "/uploads/default/" "/cdn-uploads/"

4. الاستيراد والتصدير الانتقائي للبيانات

discourse export_category [CATEGORY_ID]

  • الوصف: يسلسل فئة واحدة، بما في ذلك جميع المواضيع المتداخلة، والمنشورات، وملفات تعريف المستخدمين المشاركين، في ملف أرشيف JSON.

discourse import_category [FILE_PATH]

  • الوصف: يقرأ أرشيفًا أنشأه export_category ويدمج بيانات الفئة في المثيل المستهدف.

discourse export_topics [TOPIC_IDS...]

  • الوصف: يأخذ معرفًا واحدًا أو أكثر للمواضيع مفصولًا بمسافات ويصدر المواضيع، والمنشورات، وحسابات المستخدمين ذات الصلة.
  • مثال:
discourse export_topics 102 105 210

discourse import_topics [FILE_PATH]

  • الوصف: يستورد أرشيف JSON أنشأه export_topics إلى مثيل Discourse الوجهة.
إعجاب واحد (1)