Сценарий автоматического резервного копирования для веб-сайтов, размещенных на Pantheon

Опубликовано: 2023-03-28

DigiSavvy размещает множество веб-сайтов на Pantheon. На сайтах с платным планом включено автоматическое резервное копирование, но на сайтах, которые еще не подключены к платному плану, эта функция отсутствует; это сердцевина проблемы, которую мы решаем. Таким образом, нам нужно было создать скрипт, который запускает ежедневное резервное копирование для тех веб-сайтов, которые не имеют функции автоматического резервного копирования.

Войдите в рабочий процесс автоматического резервного копирования Pantheon.

Мы знали, что это возможно, используя сочетание таких инструментов, как Terminus, Bash и Linux cronjobs. После некоторого обсуждения мы начали работать над решением для автоматизации процесса резервного копирования Pantheon для бесплатных сайтов Pantheon.

Решение

Мы создали сценарий bash, который запускается ежедневно, чтобы сделать резервную копию для всех веб-сайтов Pantheon без функции автоматического резервного копирования.

Кроме того, на наш канал Slack отправляется уведомление, чтобы сообщить нам о возможных ошибках или проблемах.

Требования

Для реализации этого решения вам понадобится определенная среда и инструменты. Обязательно настройте эти элементы.

  • Сервер Ubuntu с доступом по SSH : требуется высокий уровень настройки сервера для установки некоторых инструментов и решения возможных проблем. Мы используем Ubuntu, но вы можете использовать предпочитаемую версию Linux.
  • Terminus : это официальный инструмент командной строки Pantheon. Его необходимо установить на ваш сервер Ubuntu.
  • Приложение Slack : необязательно, но необходимо для запуска уведомления после запуска резервного копирования. Следуйте этому руководству, чтобы настроить его. Также не забудьте добавить приложение в канал, на который вы хотите отправить уведомление.

Написание сценариев

Сценарии должны быть написаны с использованием синтаксиса bash, потому что нам нужно выполнить некоторые условные проверки и выполнить некоторые команды Linux и Terminus.

Резервный 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, размещались не на нем, а на другом сервере. Таким образом, нам нужно было настроить доступ по ключу SSH.

Проверка состояния резервной копии

Мы написали еще один сценарий bash для проверки состояния всех резервных копий, созданных сценарием резервного копирования.

В сценарии определены два массива: один для строковых идентификаторов резервных копий веб-сайтов, а другой — для каждой части одной резервной копии.

Каждая резервная копия Pantheon состоит из трех файлов.

  • Код : любая версия, контролируемая и фиксируемая через панель управления сайтом. Незафиксированные изменения кода SFTP не резервируются.
  • Файлы : изображения и активы, хранящиеся по стандартному пути загрузки wp-content/uploads для WordPress и sites/all/default/files для Drupal.
  • База данных : это дамп базы данных 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-уведомление — необязательно

Наконец, мы создали файл PHP для отправки уведомления с помощью Slack API. Во-первых, строка в файле «backups_results.txt» извлекается с помощью функции file_get_contents() и преобразуется в допустимую переменную PHP с помощью функции json_decode() . Эта переменная поможет настроить логику, необходимую для создания сообщения Slack. Код перебирает веб-сайт с превышением охвата и создает уведомление для каждого из них. Сообщение будет меняться в зависимости от состояния последней резервной копии.

Сообщение отправляется на определенный канал Slack с помощью конечной точки chat.postMessage . Вы также можете использовать конечную точку conversations.list , чтобы найти идентификатор канала, на который вы хотите отправить сообщение.

 <?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 состоит из команд, по одной команде в строке, которые выполняются автоматически во время, указанное первыми пятью полями каждой командной строки. Каждая команда в файле crontab должна состоять из одной строки, даже если эта строка очень длинная. Файл crontab не распознает лишние символы возврата каретки.

Если вам нужна помощь в создании команды cron и настройке синтаксиса для расписания, вам может помочь этот генератор crontab.

Ваша строка cron должна содержать

  • Команда для доступа к папке, в которой живут скрипты
  • Команда для выполнения скриптов.

Назначение переменной PATH — сообщить crontab, где находятся библиотеки в скриптах, например, Terminus.

Это пример строки, которую мы добавили в файл 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

Теперь нам не нужно делать все резервные копии вручную, как раньше, потому что процесс полностью автоматизирован. Кроме того, мы экономим время для нашего ежедневного рабочего процесса.