สคริปต์การสำรองข้อมูลอัตโนมัติสำหรับเว็บไซต์ที่โฮสต์โดย Pantheon

เผยแพร่แล้ว: 2023-03-28

DigiSavvy โฮสต์เว็บไซต์จำนวนมากบน Pantheon ไซต์ในแผนชำระเงินเปิดใช้งานการสำรองข้อมูลอัตโนมัติ แต่ไซต์ที่ยังไม่ได้อยู่ในแผนชำระเงินจะไม่มีคุณสมบัตินี้ นี่คือหัวใจของปัญหาที่เรากำลังแก้ไข ดังนั้นเราจึงจำเป็นต้องสร้างสคริปต์ที่เรียกใช้การสำรองข้อมูลรายวันสำหรับเว็บไซต์ที่ไม่มีคุณลักษณะการสำรองข้อมูลอัตโนมัติ

เข้าสู่เวิร์กโฟลว์การสำรองข้อมูลอัตโนมัติของ Pantheon

เรารู้ว่าสิ่งนี้เป็นไปได้โดยใช้เครื่องมือต่างๆ เช่น Terminus, Bash และ Linux cronjobs หลังจากปรึกษาหารือกันสักพัก เราก็เริ่มหาวิธีแก้ไขเพื่อทำให้กระบวนการสำรองข้อมูลของ Pantheon เป็นไปโดยอัตโนมัติสำหรับไซต์ Pantheon ที่ไม่ได้ชำระเงิน

การแก้ไขปัญหา

เราสร้างสคริปต์ทุบตีที่ทำงานทุกวันเพื่อสำรองข้อมูลสำหรับเว็บไซต์ Pantheon ทั้งหมดโดยไม่มีคุณสมบัติการสำรองข้อมูลอัตโนมัติ

นอกจากนี้ ข้อความแจ้งเตือนจะถูกส่งไปยังช่องทาง Slack ของเราเพื่อแจ้งให้เราทราบเกี่ยวกับข้อผิดพลาดหรือปัญหาที่อาจเกิดขึ้น

ความต้องการ

คุณจะต้องมีสภาพแวดล้อมและเครื่องมือเฉพาะเพื่อใช้โซลูชันนี้ ตรวจสอบให้แน่ใจว่าได้ตั้งค่ารายการเหล่านี้แล้ว

  • เซิร์ฟเวอร์ Ubuntu ที่มีการเข้าถึง SSH : จำเป็นต้องมีการปรับแต่งเซิร์ฟเวอร์ในระดับสูงเพื่อติดตั้งเครื่องมือบางอย่างและแก้ไขปัญหาที่อาจเกิดขึ้น เราใช้ Ubuntu แต่คุณสามารถใช้รสชาติ Linux ที่คุณต้องการได้
  • Terminus : นี่คือเครื่องมือ Pantheon CLI อย่างเป็นทางการ จำเป็นต้องติดตั้งบนเซิร์ฟเวอร์ Ubuntu ของคุณ
  • แอป Slack : เป็นทางเลือก แต่จำเป็นต้องเริ่มการแจ้งเตือนหลังจากเรียกใช้การสำรองข้อมูล ทำตามบทช่วยสอนนี้เพื่อกำหนดค่า นอกจากนี้ อย่าลืมเพิ่มแอปในช่องที่คุณต้องการส่งการแจ้งเตือน

การเขียนสคริปต์

จำเป็นต้องเขียนสคริปต์โดยใช้ไวยากรณ์ bash เนื่องจากเราจำเป็นต้องตรวจสอบเงื่อนไขและรันคำสั่ง Linux และ Terminus

สคริปต์ทุบตีสำรอง

สคริปต์ทุบตีนี้วนซ้ำอาร์เรย์ของตัวระบุสตริงเว็บไซต์และใช้คำสั่ง 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 ประกอบด้วยไฟล์สามไฟล์

  • รหัส : เวอร์ชันใดก็ตามที่ควบคุมและคอมมิตผ่าน Site Dashboard การเปลี่ยนแปลงรหัส SFTP ที่ไม่มีข้อผูกมัดจะไม่ได้รับการสำรองข้อมูล
  • ไฟล์ : รูปภาพและเนื้อหาที่จัดเก็บไว้ในเส้นทางอัปโหลดมาตรฐาน wp-content/uploads สำหรับ WordPress และ sites/all/default/files สำหรับ Drupal
  • ฐานข้อมูล : เป็นการถ่ายโอนข้อมูล MySQL ของฐานข้อมูลของไซต์ของคุณ

การสำรองข้อมูลจะสำเร็จเมื่อไฟล์ทั้งสามนี้พร้อมสำหรับการดาวน์โหลด

อย่างไรก็ตาม บางครั้งไฟล์เหล่านี้บางไฟล์ไม่ได้ถูกสร้างขึ้นเนื่องจาก Terminus ล้มเหลวในบางจุดของกระบวนการสำรองข้อมูล

สคริปต์ใช้คำสั่ง 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 คุณยังสามารถใช้ endpoint 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 เป็นส่วนสำคัญของกระบวนการสำรองข้อมูลอัตโนมัติ ทำตามขั้นตอนต่อไปเพื่อตั้งค่า เข้าถึงเซิร์ฟเวอร์ของคุณโดยใช้ SHH และเรียกใช้คำสั่ง crontab -e เพื่อเปิดไฟล์กำหนดค่า cronjob

ไฟล์ crontab ประกอบด้วยคำสั่ง หนึ่งคำสั่งต่อบรรทัด ซึ่งดำเนินการโดยอัตโนมัติตามเวลาที่กำหนดโดยห้าฟิลด์แรกของแต่ละบรรทัดคำสั่ง แต่ละคำสั่งภายในไฟล์ crontab ต้องประกอบด้วยหนึ่งบรรทัด แม้ว่าบรรทัดนั้นจะยาวมากก็ตาม ไฟล์ crontab ไม่รู้จักการขึ้นบรรทัดใหม่

หากคุณต้องการความช่วยเหลือในการสร้างคำสั่ง cron และกำหนดค่าไวยากรณ์สำหรับกำหนดการ ตัวสร้าง crontab นี้สามารถช่วยได้

บรรทัด cron ของคุณต้องมี

  • คำสั่งเพื่อเข้าถึงโฟลเดอร์ที่มีสคริปต์อยู่
  • คำสั่งเพื่อดำเนินการสคริปต์

จุดประสงค์ของตัวแปร 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

ตอนนี้เราไม่จำเป็นต้องสำรองข้อมูลทั้งหมดด้วยตนเองเหมือนเมื่อก่อน เนื่องจากกระบวนการนี้เป็นไปโดยอัตโนมัติทั้งหมด นอกจากนี้ เรายังประหยัดเวลาสำหรับขั้นตอนการทำงานประจำวันของเรา