Script de backup automatizado para sites hospedados no Pantheon

Publicados: 2023-03-28

DigiSavvy hospeda muitos sites no Pantheon. Sites com plano pago têm backups automáticos ativados, mas sites que ainda não têm plano pago não têm esse recurso; este é o cerne do problema que estamos resolvendo. Assim, precisávamos criar um script que executasse backups diários para os sites que não possuem o recurso de backup automático.

Entre no fluxo de trabalho Automatizar backups do Pantheon

Sabíamos que isso era possível usando uma combinação de ferramentas como Terminus, Bash e cronjobs do Linux. Após alguma discussão, começamos a trabalhar em uma solução para automatizar o processo de backup do Pantheon para sites Pantheon não pagos.

A solução

Criamos um script bash que é executado diariamente para fazer backup de todos os sites do Pantheon sem um recurso de backup automático.

Além disso, uma mensagem de notificação é enviada ao nosso canal Slack para nos informar sobre possíveis erros ou problemas.

Requisitos

Você precisará de algum ambiente e ferramentas específicas para implementar esta solução. Certifique-se de configurar esses itens.

  • Um servidor Ubuntu com acesso SSH : é necessário um alto nível de personalização do servidor para instalar algumas ferramentas e resolver possíveis problemas. Usamos o Ubuntu, mas você pode usar seu sabor Linux preferido.
  • Terminus : esta é a ferramenta oficial do Pantheon CLI. Ele precisa ser instalado no seu servidor Ubuntu.
  • Aplicativo Slack : opcional, mas necessário para disparar a notificação após a execução dos backups. Siga este tutorial para configurá-lo. Além disso, lembre-se de adicionar o aplicativo ao canal para onde deseja enviar a notificação.

Escrevendo os roteiros

Os scripts precisam ser escritos usando a sintaxe bash porque precisamos fazer algumas verificações condicionais e executar alguns comandos do Linux e do Terminus.

O script bash de backup

Esse script bash itera sobre uma matriz de identificadores de cadeia de sites e usa o comando Terminus terminus backup:create para criar um backup para cada um. A opção --keep-for estabelece o período de retenção, em dias, para reter o 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

A estrutura do comando Terminus geralmente inclui <site>.<env> determinando o site de destino e o ambiente a ser executado.

Observe que os símbolos <> fazem parte do exemplo e não devem ser incluídos nos comandos do Terminus.

Além disso, o Terminus deve ser autenticado com um token de máquina antes de usar qualquer comando. Você também pode precisar configurar o acesso à chave SSH para executar instruções remotas.

No nosso caso, os scripts que implementamos para automatizar o processo de backup do Pantheon não estavam hospedados nele, mas em um servidor diferente. Assim, tivemos que configurar o acesso à chave SSH.

Verificando o estado do backup

Escrevemos outro script bash para verificar o status de todos os backups criados pelo script de backup.

Existem duas matrizes definidas no script, uma para os identificadores de cadeia de sites de backup e outra para cada parte de um único backup.

Cada backup do Pantheon é composto por três arquivos.

  • Código : qualquer versão controlada e confirmada por meio do painel do site. As alterações de SFTP não confirmadas no código não têm backup.
  • Arquivos : imagens e recursos armazenados no caminho de upload padrão wp-content/uploads para WordPress e sites/all/default/files para Drupal.
  • Banco de dados : é um despejo MySQL do banco de dados do seu site.

Um backup é bem-sucedido quando esses três arquivos estão disponíveis para download.

No entanto, às vezes alguns desses arquivos não são criados porque o Terminus falhou em algum ponto do processo de backup.

O script usa o comando Terminus terminus backup:get para verificar a existência desses três arquivos. O status do backup será considerado falhado se algum desses três arquivos estiver ausente.

O resultado de cada verificação de backup é salvo em um arquivo chamado backups_results.txt . O backups_results.txt contém uma representação de string de um objeto JSON. Este objeto tem uma entrada para cada site de 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ção do Slack – Opcional

Por fim, criamos um arquivo PHP para enviar uma notificação usando a API do Slack. Primeiro, a string dentro de 'backups_results.txt' é extraída usando a função file_get_contents() e convertida em uma variável PHP válida usando a função json_decode() . Essa variável ajudará a configurar a lógica necessária para criar a mensagem do Slack. O código itera o site de overreach e cria uma notificação para cada um. A mensagem irá variar dependendo do status de seu último backup.

A mensagem é enviada para um canal Slack específico usando o terminal chat.postMessage . Você também pode usar o endpoint conversations.list para localizar o ID do canal para o qual deseja enviar a mensagem.

 <?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 o cronjob

O cronjob é uma grande parte do processo de automação de backup. Siga as próximas etapas para configurá-lo. Acesse seu servidor usando SHH e execute o comando crontab -e para abrir o arquivo de configuração do cronjob.

Um arquivo crontab consiste em comandos, um comando por linha, que são executados automaticamente no horário especificado pelos primeiros cinco campos de cada linha de comando. Cada comando dentro de um arquivo crontab deve consistir em uma linha, mesmo que essa linha seja muito longa. O arquivo crontab não reconhece retornos de carro extras.

Se você precisar de ajuda para gerar seu comando cron e configurar a sintaxe para o agendamento, este gerador de crontab pode ajudar.

Sua linha cron deve conter

  • Um comando para acessar a pasta onde estão os scripts
  • Um comando para executar os scripts.

O objetivo da variável PATH é permitir que o crontab saiba onde as bibliotecas estão localizadas nos scripts, por exemplo, Terminus.

Este é um exemplo da linha que adicionamos ao nosso arquivo crontab do 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

Agora não precisamos fazer todos os backups manualmente como antes porque o processo é totalmente automatizado. Além disso, economizamos algum tempo para o nosso fluxo de trabalho diário.