Script de backup automat pentru site-urile web găzduite de Pantheon

Publicat: 2023-03-28

DigiSavvy găzduiește multe site-uri web pe Pantheon. Site-urile cu un plan plătit au backup-uri automate activate, dar site-urile care nu sunt încă într-un plan plătit nu au această caracteristică; acesta este miezul problemei pentru care rezolvăm. Astfel, trebuia să creăm un script care să execute copii de siguranță zilnice pentru acele site-uri web care nu au caracteristica de backup automată.

Intrați în fluxul de lucru Automate Pantheon backups

Știam că acest lucru este posibil folosind o combinație de instrumente precum Terminus, Bash și cronjob-uri Linux. După câteva discuții, am început să lucrăm la o soluție pentru automatizarea procesului de backup Pantheon pentru site-urile Pantheon neplătite.

Soluția

Am creat un script bash care rulează zilnic pentru a face o copie de rezervă pentru toate site-urile web Pantheon fără o funcție de backup automată.

De asemenea, un mesaj de notificare este trimis canalului nostru Slack pentru a ne informa despre posibile erori sau probleme.

Cerințe

Veți avea nevoie de un mediu și instrumente specifice pentru a implementa această soluție. Asigurați-vă că ați configurat aceste elemente.

  • Un server Ubuntu cu acces SSH : este necesar un nivel ridicat de personalizare a serverului pentru a instala unele instrumente și pentru a rezolva eventualele probleme. Noi folosim Ubuntu, dar puteți folosi aroma Linux preferată.
  • Terminus : acesta este instrumentul oficial Pantheon CLI. Trebuie să fie instalat pe serverul Ubuntu.
  • Aplicația Slack : Opțional, dar necesar pentru a declanșa notificarea după rularea copiilor de rezervă. Urmați acest tutorial pentru a-l configura. De asemenea, nu uitați să adăugați aplicația la canalul unde doriți să trimiteți notificarea.

Scrierea scenariilor

Scripturile trebuie scrise folosind sintaxa bash, deoarece trebuie să facem niște verificări condiționate și să executăm niște comenzi Linux și Terminus.

Scriptul bash de rezervă

Acest script bash iterează peste o serie de identificatori de șir de site-uri web și utilizează comanda Terminus terminus backup:create pentru a crea o copie de rezervă pentru fiecare. Opțiunea --keep-for stabilește perioada de păstrare, în zile, pentru păstrarea copiei de rezervă.

 #!/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

Structura de comandă Terminus include în mod obișnuit <site>.<env> care determină site-ul și mediul țintă împotriva cărora să se execute.

Rețineți că simbolurile <> fac parte din exemplu și nu ar trebui să fie incluse în comenzile dvs. Terminus.

De asemenea, Terminus trebuie să fie autentificat cu un token de mașină înainte de a utiliza orice comandă. De asemenea, poate fi necesar să configurați accesul cu cheia SSH pentru a executa instrucțiuni de la distanță.

În cazul nostru, scripturile pe care le-am implementat pentru a automatiza procesul de backup Pantheon nu au fost găzduite pe acesta, ci pe un alt server. Astfel, a trebuit să setăm accesul la cheia SSH.

Verificarea stării de rezervă

Am scris un alt script bash pentru a verifica starea tuturor copiilor de rezervă create de scriptul de rezervă.

Există două matrice definite în script, unul pentru identificatorii de șir de site-uri web pentru care faceți backup și celălalt pentru fiecare parte a unei singure copii de rezervă.

Fiecare backup Pantheon cuprinde trei fișiere.

  • Cod : orice versiune controlată și comisă prin intermediul Tabloului de bord al site-ului. Modificările SFTP necommitate ale codului nu sunt copiate de rezervă.
  • Fișiere : imagini și materiale stocate în calea standard de încărcare wp-content/uploads pentru WordPress și sites/all/default/files pentru Drupal.
  • Baza de date : este un dump MySQL a bazei de date a site-ului dvs.

O copie de rezervă are succes atunci când aceste trei fișiere sunt disponibile pentru descărcare.

Cu toate acestea, uneori, unele dintre aceste fișiere nu sunt create, deoarece Terminus a eșuat la un moment dat în procesul de backup.

Scriptul folosește comanda Terminus terminus backup:get to verifica existența acestor trei fișiere. Starea copiei de rezervă va fi considerată eșuată dacă lipsește oricare dintre aceste trei fișiere.

Rezultatul fiecărei verificări de rezervă este salvat într-un fișier numit backups_results.txt . backups_results.txt conține o reprezentare șir a unui obiect JSON. Acest obiect are o intrare pentru fiecare site web pentru care face backup.

 #!/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

Notificare Slack – Opțional

În cele din urmă, am creat un fișier PHP pentru a trimite o notificare folosind API-ul Slack. În primul rând, șirul din interiorul „backups_results.txt” este extras folosind funcția file_get_contents() și convertit într-o variabilă PHP validă folosind funcția json_decode() . Această variabilă va ajuta la configurarea logicii necesare pentru a crea mesajul Slack. Codul repetă site-ul web de supraatenție și creează o notificare pentru fiecare. Mesajul va varia în funcție de starea ultimei copii de rezervă.

Mesajul este trimis către un anumit canal Slack folosind punctul final chat.postMessage . De asemenea, puteți utiliza conversations.list pentru punctele finale pentru a găsi ID-ul canalului la care doriți să trimiteți mesajul.

 <?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 ); }

Configurarea cronjob-ului

Cronjob-ul este o parte importantă a procesului de automatizare a backupului. Urmați pașii următori pentru a-l configura. Accesați-vă serverul folosind SHH și rulați comanda crontab -e pentru a deschide fișierul de configurare cronjob.

Un fișier crontab constă din comenzi, o comandă pe linie, care se execută automat la momentul specificat de primele cinci câmpuri ale fiecărei linii de comandă. Fiecare comandă dintr-un fișier crontab trebuie să conțină o singură linie, chiar dacă acea linie este foarte lungă. Fișierul crontab nu recunoaște returnările de transport suplimentare.

Dacă aveți nevoie de ajutor pentru a genera comanda cron și pentru a configura sintaxa pentru program, atunci acest generator crontab vă poate ajuta.

Linia ta cron trebuie să conțină

  • O comandă pentru a accesa folderul în care trăiesc scripturile
  • O comandă pentru a executa scripturile.

Scopul variabilei PATH este de a informa crontab unde sunt situate bibliotecile în scripturi, de exemplu, Terminus.

Acesta este un exemplu de linie pe care am adăugat-o la fișierul nostru crontab pe server.

 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

Acum nu mai trebuie să facem toate copiile de rezervă manual ca înainte, deoarece procesul este complet automatizat. De asemenea, economisim timp pentru fluxul nostru zilnic de lucru.