Script di backup automatizzato per siti Web ospitati da Pantheon

Pubblicato: 2023-03-28

DigiSavvy ospita molti siti Web su Pantheon. I siti su un piano a pagamento hanno i backup automatici abilitati, ma i siti che non sono ancora su un piano a pagamento non hanno questa funzione; questo è il cuore del problema che stiamo risolvendo. Pertanto, avevamo bisogno di creare uno script che eseguisse backup giornalieri per quei siti Web che non dispongono della funzione di backup automatico.

Entra nel flusso di lavoro Automatizza i backup di Pantheon

Sapevamo che questo era possibile utilizzando un mix di strumenti come Terminus, Bash e Linux cronjobs. Dopo alcune discussioni, abbiamo iniziato a lavorare su una soluzione per automatizzare il processo di backup di Pantheon per i siti Pantheon non a pagamento.

La soluzione

Abbiamo creato uno script bash che viene eseguito quotidianamente per eseguire un backup per tutti i siti Web Pantheon senza una funzione di backup automatico.

Inoltre, viene inviato un messaggio di notifica al nostro canale Slack per informarci su possibili errori o problemi.

Requisiti

Avrai bisogno di un ambiente e di strumenti specifici per implementare questa soluzione. Assicurati di impostare questi elementi.

  • Un server Ubuntu con accesso SSH : è necessario un alto livello di personalizzazione del server per installare alcuni strumenti e risolvere eventuali problemi. Usiamo Ubuntu, ma puoi usare il tuo gusto Linux preferito.
  • Terminus : questo è lo strumento CLI ufficiale di Pantheon. Deve essere installato sul tuo server Ubuntu.
  • App Slack : facoltativa ma necessaria per attivare la notifica dopo l'esecuzione dei backup. Segui questo tutorial per configurarlo. Inoltre, ricorda di aggiungere l'app al canale a cui desideri inviare la notifica.

Scrivere le sceneggiature

Gli script devono essere scritti usando la sintassi bash è necessario perché abbiamo bisogno di fare alcuni controlli condizionali ed eseguire alcuni comandi Linux e Terminus.

Lo script bash di backup

Questo script bash itera su una serie di identificatori di stringhe di siti Web e utilizza il comando Terminus terminus backup:create per creare un backup per ciascuno. L'opzione --keep-for stabilisce il periodo di conservazione, in giorni, per conservare il backup.

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

La struttura del comando Terminus in genere include <site>.<env> che determina il sito e l'ambiente di destinazione su cui eseguire.

Nota che i simboli <> fanno parte dell'esempio e non dovrebbero essere inclusi nei tuoi comandi Terminus.

Inoltre, Terminus deve essere autenticato con un token macchina prima di utilizzare qualsiasi comando. Potrebbe anche essere necessario configurare l'accesso tramite chiave SSH per eseguire istruzioni remote.

Nel nostro caso, gli script che abbiamo implementato per automatizzare il processo di backup di Pantheon non erano ospitati su di esso ma su un server diverso. Pertanto, abbiamo dovuto configurare l'accesso tramite chiave SSH.

Controllo dello stato del backup

Abbiamo scritto un altro script bash per controllare lo stato di tutti i backup creati dallo script di backup.

Ci sono due array definiti nello script, uno per gli identificatori di stringa dei siti web di cui è stato eseguito il backup e l'altro per ciascuna parte di un singolo backup.

Ogni backup Pantheon comprende tre file.

  • Codice : qualsiasi versione controllata e confermata tramite la dashboard del sito. Non viene eseguito il backup delle modifiche SFTP non salvate al codice.
  • File : immagini e risorse memorizzate nel percorso di caricamento standard wp-content/uploads per WordPress e sites/all/default/files per Drupal.
  • Database : è un dump MySQL del DB del tuo sito.

Un backup ha esito positivo quando questi tre file sono disponibili per il download.

Tuttavia, a volte alcuni di questi file non vengono creati perché Terminus non è riuscito a un certo punto del processo di backup.

Lo script utilizza il comando Terminus terminus backup:get per verificare l'esistenza di questi tre file. Lo stato del backup verrà considerato non riuscito se manca uno di questi tre file.

Il risultato di ogni controllo del backup viene salvato in un file denominato backups_results.txt . backups_results.txt contiene una rappresentazione di stringa di un oggetto JSON. Questo oggetto ha una voce per ogni sito Web di cui è stato eseguito il 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

Notifica di rallentamento: facoltativo

Infine, abbiamo creato un file PHP per inviare una notifica utilizzando l'API Slack. Innanzitutto, la stringa all'interno di "backups_results.txt" viene estratta utilizzando la funzione file_get_contents() e convertita in una variabile PHP valida utilizzando la funzione json_decode() . Questa variabile aiuterà a impostare la logica necessaria per creare il messaggio Slack. Il codice itera il sito web overreach e crea una notifica per ciascuno di essi. Il messaggio varierà a seconda dello stato dell'ultimo backup.

Il messaggio viene inviato a un canale Slack specifico utilizzando l'endpoint chat.postMessage . Puoi anche utilizzare l'endpoint conversations.list per trovare l'ID del canale in cui desideri inviare il messaggio.

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

Impostazione del cronjob

Il cronjob è una parte importante del processo di automazione del backup. Segui i passaggi successivi per configurarlo. Accedi al tuo server usando SHH ed esegui il comando crontab -e per aprire il file di configurazione di cronjob.

Un file crontab è costituito da comandi, un comando per riga, che vengono eseguiti automaticamente all'ora specificata dai primi cinque campi di ciascuna riga di comando. Ogni comando all'interno di un file crontab deve essere costituito da una riga, anche se tale riga è molto lunga. Il file crontab non riconosce i ritorni a capo aggiuntivi.

Se hai bisogno di aiuto per generare il tuo comando cron e configurare la sintassi per la pianificazione, allora questo generatore di crontab può aiutarti.

La tua riga cron deve contenere

  • Un comando per accedere alla cartella in cui risiedono gli script
  • Un comando per eseguire gli script.

Lo scopo della variabile PATH è di far sapere a crontab dove si trovano le librerie negli script, ad esempio Terminus.

Questo è un esempio della riga che abbiamo aggiunto al nostro file crontab del 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

Ora non abbiamo bisogno di eseguire tutti i backup manualmente come prima perché il processo è completamente automatizzato. Inoltre, risparmiamo un po' di tempo per il nostro flusso di lavoro quotidiano.