سيناريو النسخ الاحتياطي الآلي لمواقع الويب المستضافة من Pantheon

نشرت: 2023-03-28

تستضيف DigiSavvy العديد من مواقع الويب على Pantheon. تم تمكين النسخ الاحتياطية التلقائية للمواقع الموجودة على خطة مدفوعة ، لكن المواقع التي لم تدخل بعد في خطة مدفوعة لا تحتوي على هذه الميزة ؛ هذا هو جوهر المشكلة التي نحلها. وبالتالي ، احتجنا إلى إنشاء برنامج نصي يقوم بتشغيل نسخ احتياطية يومية لتلك المواقع التي لا تحتوي على ميزة النسخ الاحتياطي التلقائي.

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

كنا نعلم أن هذا كان ممكنًا باستخدام مزيج من الأدوات مثل Terminus و Bash و Linux cronjobs. بعد بعض المناقشة ، بدأنا العمل على حل لأتمتة عملية النسخ الاحتياطي لـ Pantheon لمواقع Pantheon غير المدفوعة.

الحل

لقد أنشأنا برنامجًا نصيًا bash يتم تشغيله يوميًا لعمل نسخة احتياطية لجميع مواقع Pantheon بدون ميزة النسخ الاحتياطي التلقائي.

أيضًا ، يتم إرسال رسالة إعلام إلى قناة Slack الخاصة بنا لإبلاغنا بالأخطاء أو المشكلات المحتملة.

متطلبات

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

  • خادم Ubuntu مع وصول SSH : هناك حاجة إلى مستوى عالٍ من تخصيص الخادم لتثبيت بعض الأدوات وحل المشكلات المحتملة. نحن نستخدم Ubuntu ، ولكن يمكنك استخدام نكهة Linux المفضلة لديك.
  • المحطة النهائية : هذه هي أداة Pantheon CLI الرسمية. يجب تثبيته على خادم Ubuntu الخاص بك.
  • تطبيق Slack : اختياري ولكنه ضروري لإطلاق الإشعار بعد تشغيل النسخ الاحتياطية. اتبع هذا البرنامج التعليمي لتكوينه. تذكر أيضًا إضافة التطبيق إلى القناة التي تريد إرسال الإشعار إليها.

كتابة النصوص

يجب كتابة البرامج النصية باستخدام بنية bash ضرورية لأننا نحتاج إلى إجراء بعض الفحوصات الشرطية وتنفيذ بعض أوامر Linux و Terminus.

سكربت باش الاحتياطية

يتكرر هذا البرنامج النصي bash عبر مصفوفة من معرفات سلسلة مواقع الويب ويستخدم نهاية الأمر Terminus terminus backup:create لإنشاء نسخة احتياطية لكل منها. يحدد الخيار --keep-for فترة الاحتفاظ ، بالأيام ، للاحتفاظ بالنسخة الاحتياطية.

 #!/bin/sh # Exit on error set -e # Stash list of all Pantheon sites in the org PANTHEON_SITES=("site1.env" "site2.env" "site3.env") # Loop through each site in the list for sitename in ${PANTHEON_SITES[@]}; do terminus backup:create --keep-for 30 $sitename done

تتضمن بنية أمر Terminus عادةً <site>.<env> تحديد الموقع المستهدف والبيئة التي سيتم تنفيذها على أساسها.

لاحظ أن رموز <> هي جزء من المثال ولا يجب تضمينها في أوامر Terminus الخاصة بك.

أيضًا ، يجب المصادقة على Terminus برمز مميز للجهاز قبل استخدام أي أمر. قد تحتاج أيضًا إلى إعداد وصول مفتاح SSH لتنفيذ التعليمات عن بُعد.

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

التحقق من حالة النسخ الاحتياطي

لقد كتبنا نصًا برمجيًا آخر للتحقق من حالة جميع النسخ الاحتياطية التي تم إنشاؤها بواسطة البرنامج النصي للنسخ الاحتياطي.

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

تتكون كل نسخة احتياطية من Pantheon من ثلاثة ملفات.

  • الكود : أي إصدار يتم التحكم فيه والتزامه عبر لوحة تحكم الموقع. لا يتم إجراء نسخ احتياطي لتغييرات SFTP غير الملتزم بها على التعليمات البرمجية.
  • الملفات : الصور والأصول المخزنة في مسار التحميل القياسي wp-content/uploads لـ WordPress sites/all/default/files for Drupal.
  • قاعدة البيانات : هي عبارة عن تفريغ MySQL لقاعدة بيانات موقعك.

يكون النسخ الاحتياطي ناجحًا عند توفر هذه الملفات الثلاثة للتنزيل.

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

يستخدم البرنامج النصي terminus backup:get للتحقق من وجود هذه الملفات الثلاثة. سيتم اعتبار حالة النسخ الاحتياطي فاشلة في حالة فقد أي من هذه الملفات الثلاثة.

يتم حفظ نتيجة كل فحص للنسخ الاحتياطي في ملف يسمى backups_results.txt . يحتوي ملف backups_results.txt على سلسلة تمثيل لكائن JSON. يحتوي هذا الكائن على إدخال لكل موقع ويب احتياطي.

 #!/bin/sh # Stash list of all Pantheon sites in the org PANTHEON_SITES=("site1.env" "site2.env" "site3.env") FILES=("code" "files" "database") backups_checks='{' # JSON file with all the websites with a true variable. This file will save the backup status of each website # Loop through each site in the list to check the backups for sitename in ${PANTHEON_SITES[@]}; do check_result=true # Assume the backup was sucefully made # Each backup has a code, files and database file. If one of these is missing, Pantheon reports the back as failed. for file_type in ${FILES[@]}; do result=$(terminus backup:get --no-ansi --element $file_type $sitename) if [ -z "$result" ] then # Edit the corresponding JSON entry to false. check_result=false fi done # Save true or false in a json file. That file will be used by a php script to generate the Slack notification backups_checks+="\\"$sitename\\":\\"$check_result\\"," done # Remove last character ',' backups_checks=${backups_checks:0:-1} backups_checks+="}" echo $backups_checks > backups_results.txt

سلاك إعلام - اختياري

أخيرًا ، أنشأنا ملف PHP لإرسال إشعار باستخدام Slack API. أولاً ، يتم سحب السلسلة الموجودة داخل "backups_results.txt" باستخدام الدالة file_get_contents() وتحويلها إلى متغير PHP صالح باستخدام الوظيفة json_decode() . سيساعد هذا المتغير في إعداد المنطق المطلوب لإنشاء رسالة Slack. يكرر الكود موقع الويب الزائد وينشئ إشعارًا لكل واحد. ستختلف الرسالة حسب حالة آخر نسخة احتياطية لها.

يتم إرسال الرسالة إلى قناة Slack محددة باستخدام endpoint chat.postMessage . يمكنك أيضًا استخدام conversations.list نقطة النهاية للعثور على معرّف القناة حيث تريد إرسال الرسالة.

 <?php $backups_results_file = file_get_contents( 'backups_results.txt' ); $backups_results = json_decode( $backups_results_file, true ); slack_post( $backups_results ); /** * POST the message to the Slack channel named 'client-support' */ function slack_post( $backups_results ) { $ch = curl_init(); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt( $ch, CURLOPT_TIMEOUT, 10 ); curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Authorization: Bearer your-slack-token', ) ); # The id of the client-support channel. The channel id could be retrieved using this function $channel_; # Prepare the slack message $slack_blocks = array( array( 'type' => 'section', 'text' => array( 'type' => 'plain_text', 'emoji' => true, 'text' => 'Some Pantheon backups were made', ), ), array( 'type' => 'divider', ), ); foreach ( $backups_results as $website_name => $website_backup_status ) { $website_dashboard = shell_exec( "terminus dashboard:view --print -- $website_name" ); if ( $website_backup_status ) { $status_icon = ':white_check_mark:'; $status_text = "*Website $website_name* \\n The backup was successfully made $status_icon \\n Visit $website_dashboard to download the backup"; } else { $status_icon = ':x:'; $status_text = "*Website $website_name* \\n The backup could not be completed $status_icon \\n Visit $website_dashboard to manually create the backup"; } $slack_blocks[] = array( 'type' => 'section', 'text' => array( 'type' => 'mrkdwn', 'text' => $status_text, ), ); } $payload = json_encode( array( 'channel' => $channel_id, 'text' => 'Posting to Digisavy client-support channel', 'blocks' => $slack_blocks, ) ); curl_setopt( $ch, CURLOPT_URL, '<https://slack.com/api/chat.postMessage>' ); curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'POST' ); curl_setopt( $ch, CURLOPT_POSTFIELDS, $payload ); $result = curl_exec( $ch ); $result_encode = json_decode( $result ); curl_close( $ch ); }

إنشاء cronjob

يعد cronjob جزءًا كبيرًا من عملية أتمتة النسخ الاحتياطي. اتبع الخطوات التالية لإعداده. قم بالوصول إلى الخادم الخاص بك باستخدام SHH وقم بتشغيل الأمر crontab -e لفتح ملف تكوين cronjob.

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

إذا كنت بحاجة إلى مساعدة في إنشاء أمر cron الخاص بك وتهيئة بناء الجملة للجدول ، فيمكن أن يساعدك منشئ crontab هذا.

يجب أن يحتوي خط كرون الخاص بك

  • أمر للوصول إلى المجلد حيث توجد البرامج النصية
  • أمر لتنفيذ البرامج النصية.

الغرض من المتغير PATH هو السماح لـ crontab بمعرفة مكان وجود المكتبات في البرامج النصية ، على سبيل المثال ، Terminus.

هذا مثال على السطر الذي أضفناه إلى ملف الخادم crontab الخاص بنا.

 PATH="/path/to/backup/scripts/.local/bin:/usr/bin:/bin:/usr/local/bin" #Pantheon backups 0 11 * * * cd /path/to/backup/scripts/; bash pantheon-backups.sh; bash pantheon-backups-check.sh; php slack-notification.php >/dev/null 2>&1

الآن لا نحتاج إلى عمل جميع النسخ الاحتياطية يدويًا كما كان من قبل لأن العملية مؤتمتة بالكامل. أيضًا ، نحن نوفر بعض الوقت لسير العمل اليومي لدينا.