Pantheon 호스팅 웹사이트를 위한 자동 백업 스크립트

게시 됨: 2023-03-28

DigiSavvy는 Pantheon에서 많은 웹사이트를 호스팅합니다. 유료 플랜의 사이트에는 자동 백업이 활성화되어 있지만 아직 유료 플랜이 아닌 사이트에는 이 기능이 없습니다. 이것이 우리가 해결하려는 문제의 핵심입니다. 따라서 자동 백업 기능이 없는 웹사이트에 대해 매일 백업을 실행하는 스크립트를 만들어야 했습니다.

Pantheon 백업 자동화 작업 흐름 시작

Terminus, Bash 및 Linux cronjob과 같은 도구를 함께 사용하면 이것이 가능하다는 것을 알았습니다. 약간의 논의 후 우리는 무료 Pantheon 사이트에 대한 Pantheon 백업 프로세스를 자동화하는 솔루션 작업을 시작했습니다.

해결책

자동 백업 기능 없이 모든 Pantheon 웹사이트를 백업하기 위해 매일 실행되는 bash 스크립트를 만들었습니다.

또한 가능한 오류나 문제에 대해 알려주는 알림 메시지가 Slack 채널로 전송됩니다.

요구 사항

이 솔루션을 구현하려면 특정 환경과 도구가 필요합니다. 이러한 항목을 설정해야 합니다.

  • SSH 액세스 권한이 있는 Ubuntu 서버 : 일부 도구를 설치하고 가능한 문제를 해결하려면 높은 수준의 서버 사용자 지정이 필요합니다. 우리는 Ubuntu를 사용하지만 선호하는 Linux 버전을 사용할 수 있습니다.
  • Terminus : 공식 Pantheon CLI 도구입니다. Ubuntu 서버에 설치해야 합니다.
  • Slack 앱 : 선택 사항이지만 백업 실행 후 알림을 실행하는 데 필요합니다. 이 자습서를 따라 구성하십시오. 또한 알림을 보내려는 채널에 앱을 추가해야 합니다.

스크립트 작성

일부 조건부 확인을 수행하고 일부 Linux 및 Terminus 명령을 실행해야 하기 때문에 bash 구문을 사용하여 스크립트를 작성해야 합니다.

백업 bash 스크립트

이 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 백업 프로세스를 자동화하기 위해 구현한 스크립트는 Pantheon이 아닌 다른 서버에서 호스팅되었습니다. 따라서 SSH 키 액세스를 설정해야 했습니다.

백업 상태 확인

백업 스크립트에 의해 생성된 모든 백업의 상태를 확인하기 위해 또 다른 bash 스크립트를 작성했습니다.

스크립트에는 두 개의 배열이 정의되어 있습니다. 하나는 백업된 웹사이트 문자열 식별자용이고 다른 하나는 단일 백업의 각 부분용입니다.

모든 Pantheon 백업은 세 개의 파일로 구성됩니다.

  • 코드 : 사이트 대시보드를 통해 제어되고 커밋된 모든 버전. 코드에 대한 커밋되지 않은 SFTP 변경 사항은 백업되지 않습니다.
  • 파일 : WordPress의 경우 표준 업로드 경로 wp-content/uploads 및 Drupal의 경우 sites/all/default/files 에 저장된 이미지 및 자산.
  • Database : 사이트 DB의 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

Slack 알림 - 선택 사항

마지막으로 Slack API를 사용하여 알림을 보내는 PHP 파일을 만들었습니다. 먼저 file_get_contents() 함수를 사용하여 'backups_results.txt' 내부의 문자열을 가져오고 json_decode() 함수를 사용하여 유효한 PHP 변수로 변환합니다. 이 변수는 Slack 메시지를 생성하는 데 필요한 논리를 설정하는 데 도움이 됩니다. 이 코드는 overreach 웹 사이트를 반복하고 각각에 대한 알림을 생성합니다. 메시지는 마지막 백업 상태에 따라 달라집니다.

메시지는 엔드포인트 chat.postMessage 사용하여 특정 Slack 채널로 전송됩니다. 엔드포인트 conversations.list 사용하여 메시지를 보낼 채널 ID를 찾을 수도 있습니다.

 <?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 파일은 각 명령줄의 처음 5개 필드에 지정된 시간에 자동으로 실행되는 명령(줄당 하나의 명령)으로 구성됩니다. crontab 파일 내의 각 명령은 해당 줄이 매우 긴 경우에도 한 줄로 구성되어야 합니다. crontab 파일은 추가 캐리지 리턴을 인식하지 않습니다.

cron 명령을 생성하고 일정 구문을 구성하는 데 도움이 필요한 경우 이 crontab 생성기가 도움이 될 수 있습니다.

cron 줄에는 다음이 포함되어야 합니다.

  • 스크립트가 있는 폴더에 액세스하는 명령
  • 스크립트를 실행하는 명령입니다.

PATH 변수의 목적은 스크립트에서 라이브러리가 있는 위치(예: Terminus)를 crontab에 알리는 것입니다.

이것은 서버 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

이제 프로세스가 완전히 자동화되어 이전처럼 모든 백업을 수동으로 수행할 필요가 없습니다. 또한 일상적인 작업 흐름을 위해 시간을 절약합니다.