نسخ النسخ الاحتياطية إلى خادم آخر باستخدام rsync و cron

لدي خادم نسخ احتياطي ينسق عمليات النسخ الاحتياطي عبر العديد من الخوادم. أريد أن يقوم خادم النسخ الاحتياطي هذا بجلب نسخ احتياطية من Discourse من خادم المنتدى الخاص بي.

فكرت في كيفية السماح لخادم النسخ الاحتياطي بالوصول إلى ملفات النسخ الاحتياطي على خادم المنتدى. أفضل طريقة استطعت التوصل إليها هي السماح بالوصول عن بُعد باسم مستخدم www-data (الذي يملك نسخ Discourse الاحتياطية).

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

على أي حال، إليك كيفية تنفيذ ذلك.

السماح بالوصول عن بُعد باسم مستخدم www-data

  1. عدّل الملف /etc/passwd واستبدل غلاف (shell) مستخدم www-data بـ /bin/bash بدلاً من /usr/sbin/nologin.
  2. عدّل الملف /etc/passwd مرة أخرى واستبدل الدليل الرئيسي (home directory) الخاص بـ www-data بـ /home/www-data بدلاً من /var/www (اختياري، لكنه يبدو لي مناسبًا).
  3. أضف مفتاح SSH الخاص بخادم النسخ الاحتياطي إلى /home/www-data/.ssh/authorized_keys.

rsync

أخيرًا، على خادم النسخ الاحتياطي، أضفت أمر cron كل ساعة يقوم بتشغيل السكربت التالي:

#!/usr/bin/env bash

set -xe

HOST="$1"
DIR="$2"
if [ -z "$HOST" ] || [ ! -d "$DIR" ]; then
	echo "$0 HOST DIR"
	exit 1
fi

# --ignore-existing سيجعل rsync يتجاهل أي نسخ احتياطية تم نسخها بالفعل.
# --delay-updates يضمن أن تصل إلى $DIR فقط النسخ الاحتياطية المكتملة. إذا لم
# يتم تحديد هذا الخيار، فقد تنتهي نسخ احتياطية جزئية في $DIR، وبما أن
# --ignore-existing لن يقوم بأي نوع من فحص المساواة، فلن يتم تصحيح المشكلة
# أو اكتشافها.
rsync --ignore-existing --delay-updates "$HOST:/var/discourse/shared/standalone/backups/default/*" "$DIR"

أتمنى أن يثبت هذا المفيدًا لشخص ما هناك.

8 إعجابات

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

ماذا يفعل ما سبق؟

هل تقصد المفتاح العام هنا؟

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

يسمح للمستخدم www-data بتسجيل الدخول بنجاح. هذا يغير “shell تسجيل الدخول” وهو مصطلح رئيسي جيد للبحث عنه لمعرفة المزيد.

نعم. يجب (بشكل أساسي) عدم نسخ المفاتيح الخاصة/مشاركتها في أي مكان خارج جهازها المضيف.

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

نظرًا لأنك شخص جديد في البحث، هل هناك طريقة بسيطة لنقل نسخة احتياطية من خادمنا المحلي إلى S3 buckets مختلفة، مثل Google S3، iDrive S3 عبر cron jobs؟
(أعلم أنه يمكننا تكوينه لـ AWS S3 bucket مباشرة باستخدام مفتاحه وسره).

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

إعجابَين (2)

هذا أعرفه بالفعل وحتى الآن، منذ البداية قبل 6 سنوات، كنت أستخدم هذا الإعداد بالضبط (لتحميل جميع الوسائط والنسخ الاحتياطي إلى حاوية AWS).

لكنني كنت أسأل عما سبق لمشكلة مختلفة أواجهها.
الآن، قمت بإعداد لإنشاء نسخ احتياطية (تتضمن الوسائط ‘التحميلات’) على خادم Ubuntu محلي. ولكن (كما تمت مناقشته في موضوع آخر)، لا يمكنني الاستعادة من تلك النسخ الاحتياطية (بحجم 1 جيجابايت). هناك شيء مفقود/يسبب مشكلة. لذلك كنت أفكر في استخدام حاوية Google والتخلي عن AWS تمامًا.

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

لا أرى الفرق بين AWS S3 و Google. ولكن ربما سيساعدك https://restic.net/؟ إنه برنامج نسخ احتياطي يمكنه النسخ الاحتياطي إلى حاويات s3.

لست متأكدًا من مشكلة الاستعادة لديك.

إعجابَين (2)

لكل من يأتي إلى هذا الموضوع مثلي، أود أن أشرح هذا المنشور الأول في الموضوع بشكل أكبر.

  • هذا نص برمجي bash، يمكن لصقه “كما هو” في ملف باسم أي شيء، ولكن له امتداد .sh
  • السطر الأول من النص البرمجي يضبط البيئة لتشغيل النص البرمجي، فيما يتعلق بأي shell أو بيئة يجب استخدامها: #!/usr/bin/env bash: يخبر هذا النظام باستخدام مترجم bash الذي تم العثور عليه عبر أمر env.
  • الأعلام (set -xe):
  • -x: يُمكّن التصحيح، مما يعني أن كل أمر وحججه سيتم طباعتها في الطرفية قبل تنفيذها. هذا مفيد لتصحيح النص البرمجي.
  • -e: يتسبب في إنهاء النص البرمجي فورًا إذا أعاد أي أمر حالة غير صفرية (تشير إلى خطأ). هذا مفيد لمنع النص البرمجي من الاستمرار بعد فشل.
  • وفي الخطوة المهمة التالية، المتغيرات (HOST="$1" DIR="$2"):
  • HOST="$1": يعين الوسيط الأول الذي تم تمريره إلى النص البرمجي ($1) إلى المتغير HOST. أي أنه عند تشغيل هذا النص البرمجي، سيطلب بعض المدخلات من المستخدم، وأي مدخل أول ($1) سيدخله المستخدم، سيتم تمريره/اعتباره كقيمة “المضيف” (من حيث سيتم نسخ البيانات ربما).
  • DIR="$2": يعين الوسيط الثاني الذي تم تمريره إلى النص البرمجي ($2) إلى المتغير DIR. أي أن أي شيء (مسار دليل) سيدخله المستخدم بعد إدخال القيمة الأولى (المسمى $2) سيأخذه النص البرمجي كـ “دليل الهدف”.
    إذا كان أي شخص مهتمًا، يمكنني شرح الخطوتين المتبقيتين أيضًا، ولكن يكفي القول إن الخطوة التالية تتحقق فقط من أن المستخدم يوفر قيم المضيف والدليل الهدف الصحيحة عند المطالبة. وإلا (الخطوة الأخيرة) ستعيد 1 كمخرج خطأ.
    الشيء الرئيسي الذي أكرره هو أن هذا نص برمجي، عند تشغيله، سيطلب من المستخدم المضيف (من أين سيتم نسخ البيانات) والدليل الهدف (حيث سيتم لصق البيانات). وستقوم بتضمين المسار إلى هذا الملف في ملف cron job الخاص بك، والذي قد يقوم بتشغيل ملف النص البرمجي هذا عدة مرات في اليوم كما تحدده في ملف cron.

ولكن ما فشلت في فهمه هو أين تتم عمليات النسخ واللصق الفعلية (أو النسخ الاحتياطي)؟
كيف سيحدث المزامنة الفعلية؟

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