لدي خادم نسخ احتياطي ينسق عمليات النسخ الاحتياطي عبر العديد من الخوادم. أريد أن يقوم خادم النسخ الاحتياطي هذا بجلب نسخ احتياطية من Discourse من خادم المنتدى الخاص بي.
فكرت في كيفية السماح لخادم النسخ الاحتياطي بالوصول إلى ملفات النسخ الاحتياطي على خادم المنتدى. أفضل طريقة استطعت التوصل إليها هي السماح بالوصول عن بُعد باسم مستخدم www-data (الذي يملك نسخ Discourse الاحتياطية).
لم أرغب في السماح لخادم النسخ الاحتياطي بالدخول إلى خادم المنتدى كجذر (root) لأسباب إدارية قياسية. كما أردت تجنب القيام بأي شيء قد يتسبب في توقف Discourse أثناء النسخ الاحتياطي أو الاستعادة. كما أردت تجنب استضافة خدمة أخرى على خادم المنتدى.
على أي حال، إليك كيفية تنفيذ ذلك.
السماح بالوصول عن بُعد باسم مستخدم www-data
عدّل الملف /etc/passwd واستبدل غلاف (shell) مستخدم www-data بـ /bin/bash بدلاً من /usr/sbin/nologin.
عدّل الملف /etc/passwd مرة أخرى واستبدل الدليل الرئيسي (home directory) الخاص بـ www-data بـ /home/www-data بدلاً من /var/www (اختياري، لكنه يبدو لي مناسبًا).
أضف مفتاح 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"
رائع!!
على الرغم من أنني سأقدر ذلك كثيرًا إذا شرحت الخطوات المذكورة أدناه بتفصيل أكبر حتى لا يرتكب المستخدمون المبتدئون مثلي أي خطأ (ويحصلون أيضًا على فكرة عما يفعله كل خطوة).
نظرًا لأنك شخص جديد في البحث، هل هناك طريقة بسيطة لنقل نسخة احتياطية من خادمنا المحلي إلى S3 buckets مختلفة، مثل Google S3، iDrive S3 عبر cron jobs؟
(أعلم أنه يمكننا تكوينه لـ AWS S3 bucket مباشرة باستخدام مفتاحه وسره).
إذا قمت بتكوين النسخ الاحتياطي لـ S3، فسيتم تحميلها إلى S3 تلقائيًا، على الرغم من أنها تحتوي إما على جميع التحميلات أو لا شيء منها، لذلك ما لم يكن لديك تحميلات على S3، سيكون لديك نسخ متعددة من جميع التحميلات في ملفات النسخ الاحتياطي.
هذا أعرفه بالفعل وحتى الآن، منذ البداية قبل 6 سنوات، كنت أستخدم هذا الإعداد بالضبط (لتحميل جميع الوسائط والنسخ الاحتياطي إلى حاوية AWS).
لكنني كنت أسأل عما سبق لمشكلة مختلفة أواجهها.
الآن، قمت بإعداد لإنشاء نسخ احتياطية (تتضمن الوسائط ‘التحميلات’) على خادم Ubuntu محلي. ولكن (كما تمت مناقشته في موضوع آخر)، لا يمكنني الاستعادة من تلك النسخ الاحتياطية (بحجم 1 جيجابايت). هناك شيء مفقود/يسبب مشكلة. لذلك كنت أفكر في استخدام حاوية Google والتخلي عن AWS تمامًا.
لكل من يأتي إلى هذا الموضوع مثلي، أود أن أشرح هذا المنشور الأول في الموضوع بشكل أكبر.
هذا نص برمجي 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.
ولكن ما فشلت في فهمه هو أين تتم عمليات النسخ واللصق الفعلية (أو النسخ الاحتياطي)؟ كيف سيحدث المزامنة الفعلية؟