Script de sauvegarde automatisé pour les sites Web hébergés par Pantheon

Publié: 2023-03-28

DigiSavvy héberge de nombreux sites Web sur Pantheon. Les sites sur un plan payant ont des sauvegardes automatiques activées, mais les sites qui ne sont pas encore sur un plan payant n'ont pas cette fonctionnalité ; c'est le cœur du problème que nous résolvons. Ainsi, nous devions créer un script qui exécute des sauvegardes quotidiennes pour les sites Web qui ne disposent pas de la fonction de sauvegarde automatique.

Entrez dans le flux de travail des sauvegardes automatisées du Panthéon

Nous savions que cela était possible en utilisant une combinaison d'outils tels que Terminus, Bash et les cronjobs Linux. Après quelques discussions, nous avons commencé à travailler sur une solution pour automatiser le processus de sauvegarde Pantheon pour les sites Pantheon non payants.

La solution

Nous avons créé un script bash qui s'exécute quotidiennement pour effectuer une sauvegarde de tous les sites Web Pantheon sans fonction de sauvegarde automatique.

De plus, un message de notification est envoyé à notre canal Slack pour nous informer d'éventuelles erreurs ou problèmes.

Exigences

Vous aurez besoin d'un environnement et d'outils spécifiques pour mettre en œuvre cette solution. Assurez-vous de configurer ces éléments.

  • Un serveur Ubuntu avec accès SSH : un haut niveau de personnalisation du serveur est nécessaire pour installer certains outils et résoudre les éventuels problèmes. Nous utilisons Ubuntu, mais vous pouvez utiliser votre version Linux préférée.
  • Terminus : il s'agit de l'outil CLI officiel de Pantheon. Il doit être installé sur votre serveur Ubuntu.
  • Application Slack : facultative mais nécessaire pour déclencher la notification après l'exécution des sauvegardes. Suivez ce tutoriel pour le configurer. N'oubliez pas non plus d'ajouter l'application au canal sur lequel vous souhaitez envoyer la notification.

Ecrire les scripts

Les scripts doivent être écrits en utilisant la syntaxe bash car nous devons effectuer des vérifications conditionnelles et exécuter certaines commandes Linux et Terminus.

Le script bash de sauvegarde

Ce script bash itère sur un tableau d'identificateurs de chaînes de sites Web et utilise la commande Terminus terminus backup:create pour créer une sauvegarde pour chacun. L'option --keep-for établit la période de rétention, en jours, pour conserver la sauvegarde.

 #!/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 structure de commande Terminus inclut généralement <site>.<env> déterminant le site cible et l'environnement à exécuter.

Notez que les symboles <> font partie de l'exemple et ne doivent pas être inclus dans vos commandes Terminus.

De plus, Terminus doit être authentifié avec un jeton de machine avant d'utiliser une commande. Vous devrez peut-être également configurer un accès par clé SSH pour exécuter des instructions à distance.

Dans notre cas, les scripts que nous avons implémentés pour automatiser le processus de sauvegarde de Pantheon n'étaient pas hébergés dessus mais sur un serveur différent. Ainsi, nous avons dû mettre en place un accès par clé SSH.

Vérification de l'état de la sauvegarde

Nous avons écrit un autre script bash pour vérifier l'état de toutes les sauvegardes créées par le script de sauvegarde.

Deux tableaux sont définis dans le script, l'un pour les identificateurs de chaîne des sites Web sauvegardés et l'autre pour chaque partie d'une seule sauvegarde.

Chaque sauvegarde Pantheon comprend trois fichiers.

  • Code : toute version contrôlée et validée via le tableau de bord du site. Les modifications SFTP non validées du code ne sont pas sauvegardées.
  • Fichiers : images et actifs stockés dans le chemin de téléchargement standard wp-content/uploads pour WordPress et sites/all/default/files pour Drupal.
  • Database : est un dump MySQL de la base de données de votre site.

Une sauvegarde est réussie lorsque ces trois fichiers sont disponibles au téléchargement.

Cependant, certains de ces fichiers ne sont parfois pas créés car Terminus a échoué à un moment donné du processus de sauvegarde.

Le script utilise la commande Terminus terminus backup:get pour vérifier l'existence de ces trois fichiers. L'état de la sauvegarde sera considéré comme ayant échoué si l'un de ces trois fichiers est manquant.

Le résultat de chaque vérification de sauvegarde est enregistré dans un fichier nommé backups_results.txt . Le backups_results.txt contient une représentation sous forme de chaîne d'un objet JSON. Cet objet a une entrée pour chaque site Web sauvegardé.

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

Notification de mou – Facultatif

Enfin, nous avons créé un fichier PHP pour envoyer une notification à l'aide de l'API Slack. Tout d'abord, la chaîne à l'intérieur de 'backups_results.txt' est extraite à l'aide de la fonction file_get_contents() et convertie en une variable PHP valide à l'aide de la fonction json_decode() . Cette variable aidera à configurer la logique nécessaire pour créer le message Slack. Le code itère le site Web d'overreach et crée une notification pour chacun. Le message variera en fonction de l'état de sa dernière sauvegarde.

Le message est envoyé à un canal Slack spécifique à l'aide du point de terminaison chat.postMessage . Vous pouvez également utiliser le point de terminaison conversations.list pour trouver l'ID de canal auquel vous souhaitez envoyer le message.

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

Mise en place du cronjob

Le cronjob est une grande partie du processus d'automatisation de la sauvegarde. Suivez les étapes suivantes pour le configurer. Accédez à votre serveur à l'aide de SHH et exécutez la commande crontab -e pour ouvrir le fichier de configuration cronjob.

Un fichier crontab se compose de commandes, une commande par ligne, qui s'exécutent automatiquement à l'heure spécifiée par les cinq premiers champs de chaque ligne de commande. Chaque commande dans un fichier crontab doit consister en une ligne, même si cette ligne est très longue. Le fichier crontab ne reconnaît pas les retours chariot supplémentaires.

Si vous avez besoin d'aide pour générer votre commande cron et configurer la syntaxe de la planification, ce générateur de crontab peut vous aider.

Votre ligne cron doit contenir

  • Une commande pour accéder au dossier où vivent les scripts
  • Une commande pour exécuter les scripts.

Le but de la variable PATH est de faire savoir à crontab où se trouvent les bibliothèques dans les scripts, par exemple, Terminus.

Ceci est un exemple de la ligne que nous avons ajoutée à notre fichier crontab de serveur.

 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

Maintenant, nous n'avons plus besoin de faire toutes les sauvegardes manuellement comme avant car le processus est entièrement automatisé. De plus, nous gagnons du temps pour notre flux de travail quotidien.