Script de respaldo automatizado para sitios web alojados en Pantheon

Publicado: 2023-03-28

DigiSavvy aloja muchos sitios web en Pantheon. Los sitios en un plan pago tienen habilitadas las copias de seguridad automáticas, pero los sitios que aún no están en un plan pago no tienen esta función; este es el corazón del problema que estamos resolviendo. Por lo tanto, necesitábamos crear un script que ejecutara copias de seguridad diarias para aquellos sitios web que no tienen la función de copia de seguridad automática.

Ingrese al flujo de trabajo de Automatizar copias de seguridad de Pantheon

Sabíamos que esto era posible usando una combinación de herramientas como Terminus, Bash y cronjobs de Linux. Después de un poco de discusión, comenzamos a trabajar en una solución para automatizar el proceso de copia de seguridad de Pantheon para los sitios de Pantheon que no son de pago.

La solución

Creamos un script bash que se ejecuta diariamente para hacer una copia de seguridad de todos los sitios web de Pantheon sin una función de copia de seguridad automática.

Además, se envía un mensaje de notificación a nuestro canal de Slack para informarnos sobre posibles errores o problemas.

Requisitos

Necesitará un entorno y herramientas específicos para implementar esta solución. Asegúrese de configurar estos elementos.

  • Un servidor Ubuntu con acceso SSH : se necesita un alto nivel de personalización del servidor para instalar algunas herramientas y resolver posibles problemas. Usamos Ubuntu, pero puede usar su sabor de Linux preferido.
  • Terminus : esta es la herramienta CLI oficial de Pantheon. Necesita ser instalado en su servidor Ubuntu.
  • Aplicación Slack : opcional pero necesaria para activar la notificación después de ejecutar las copias de seguridad. Sigue este tutorial para configurarlo. Además, recuerda agregar la aplicación al canal donde deseas enviar la notificación.

Escribiendo los guiones

Los scripts deben escribirse utilizando la sintaxis bash porque necesitamos realizar algunas comprobaciones condicionales y ejecutar algunos comandos de Linux y Terminus.

El script bash de copia de seguridad

Este script bash itera sobre una serie de identificadores de cadenas de sitios web y utiliza el comando Terminus terminus backup:create para crear una copia de seguridad para cada uno. La opción --keep-for establece el período de retención, en días, para conservar la copia de seguridad.

 #!/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 estructura de comandos de Terminus generalmente incluye <site>.<env> que determina el sitio de destino y el entorno en el que se ejecutará.

Tenga en cuenta que los símbolos <> son parte del ejemplo y no deben incluirse en los comandos de Terminus.

Además, Terminus debe autenticarse con un token de máquina antes de usar cualquier comando. Es posible que también deba configurar el acceso a la clave SSH para ejecutar instrucciones remotas.

En nuestro caso, los scripts que implementamos para automatizar el proceso de copia de seguridad de Pantheon no estaban alojados en él sino en un servidor diferente. Por lo tanto, tuvimos que configurar el acceso a la clave SSH.

Comprobación del estado de la copia de seguridad

Escribimos otro script bash para comprobar el estado de todas las copias de seguridad creadas por el script de copia de seguridad.

Hay dos matrices definidas en el script, una para los identificadores de cadena de los sitios web respaldados y la otra para cada parte de una sola copia de seguridad.

Cada copia de seguridad de Pantheon consta de tres archivos.

  • Código : cualquier versión controlada y confirmada a través del panel del sitio. No se realiza una copia de seguridad de los cambios SFTP no confirmados en el código.
  • Archivos : imágenes y recursos almacenados en la ruta de carga estándar wp-content/uploads para WordPress y sites/all/default/files para Drupal.
  • Base de datos : es un volcado de MySQL de la base de datos de su sitio.

Una copia de seguridad es exitosa cuando estos tres archivos están disponibles para descargar.

Sin embargo, a veces algunos de estos archivos no se crean porque Terminus falló en algún momento del proceso de copia de seguridad.

El script utiliza el comando Terminus terminus backup:get para verificar la existencia de estos tres archivos. El estado de la copia de seguridad se considerará fallido si falta alguno de estos tres archivos.

El resultado de cada comprobación de copia de seguridad se guarda en un archivo llamado backups_results.txt . El backups_results.txt contiene una representación de cadena de un objeto JSON. Este objeto tiene una entrada para cada sitio web respaldado.

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

Notificación de holgura: opcional

Por último, creamos un archivo PHP para enviar una notificación utilizando la API de Slack. Primero, la cadena dentro de 'backups_results.txt' se extrae usando la función file_get_contents() y se convierte en una variable PHP válida usando la función json_decode() . Esta variable ayudará a configurar la lógica necesaria para crear el mensaje de Slack. El código itera el sitio web de extralimitación y crea una notificación para cada uno. El mensaje variará según el estado de su última copia de seguridad.

El mensaje se envía a un canal de Slack específico mediante el extremo chat.postMessage . También puede usar la conversations.list del punto final para encontrar el ID del canal al que desea enviar el mensaje.

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

Configurando el cronjob

El cronjob es una gran parte del proceso de automatización de copias de seguridad. Siga los siguientes pasos para configurarlo. Acceda a su servidor usando SHH y ejecute el comando crontab -e para abrir el archivo de configuración de cronjob.

Un archivo crontab consta de comandos, un comando por línea, que se ejecutan automáticamente en el momento especificado por los primeros cinco campos de cada línea de comando. Cada comando dentro de un archivo crontab debe constar de una línea, incluso si esa línea es muy larga. El archivo crontab no reconoce retornos de carro adicionales.

Si necesita ayuda para generar su comando cron y configurar la sintaxis para la programación, entonces este generador crontab puede ayudar.

Su línea cron debe contener

  • Un comando para acceder a la carpeta donde viven los scripts.
  • Un comando para ejecutar los scripts.

El propósito de la variable PATH es permitir que crontab sepa dónde se encuentran las bibliotecas en los scripts, por ejemplo, Terminus.

Este es un ejemplo de la línea que agregamos a nuestro archivo crontab de servidor.

 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

Ahora no necesitamos hacer todas las copias de seguridad manualmente como antes porque el proceso está completamente automatizado. Además, ahorramos algo de tiempo para nuestro flujo de trabajo diario.