Automatisiertes Sicherungsskript für von Pantheon gehostete Websites

Veröffentlicht: 2023-03-28

DigiSavvy hostet viele Websites auf Pantheon. Bei Websites mit einem kostenpflichtigen Plan sind automatische Backups aktiviert, aber Websites, die noch keinen kostenpflichtigen Plan haben, verfügen nicht über diese Funktion. Das ist der Kern des Problems, das wir lösen. Daher mussten wir ein Skript erstellen, das tägliche Backups für Websites ausführt, die nicht über die automatische Backup-Funktion verfügen.

Geben Sie den Arbeitsablauf für automatisierte Pantheon-Sicherungen ein

Wir wussten, dass dies mit einer Mischung aus Tools wie Terminus, Bash und Linux-Cronjobs möglich ist. Nach einigen Diskussionen begannen wir mit der Arbeit an einer Lösung zur Automatisierung des Pantheon-Backup-Prozesses für nicht bezahlte Pantheon-Sites.

Die Lösung

Wir haben ein Bash-Skript erstellt, das täglich ausgeführt wird, um ein Backup für alle Pantheon-Websites ohne automatische Backup-Funktion zu erstellen.

Außerdem wird eine Benachrichtigung an unseren Slack-Kanal gesendet, um uns über mögliche Fehler oder Probleme zu informieren.

Anforderungen

Sie benötigen eine bestimmte Umgebung und Tools, um diese Lösung zu implementieren. Stellen Sie sicher, dass Sie diese Elemente einrichten.

  • Ein Ubuntu-Server mit SSH-Zugriff : Es ist ein hohes Maß an Serveranpassung erforderlich, um einige Tools zu installieren und mögliche Probleme zu lösen. Wir verwenden Ubuntu, aber Sie können Ihre bevorzugte Linux-Variante verwenden.
  • Terminus : Dies ist das offizielle Pantheon-CLI-Tool. Es muss auf Ihrem Ubuntu-Server installiert werden.
  • Slack-App : Optional, aber notwendig, um die Benachrichtigung auszulösen, nachdem die Backups ausgeführt wurden. Befolgen Sie dieses Tutorial, um es zu konfigurieren. Denken Sie auch daran, die App dem Kanal hinzuzufügen, an den Sie die Benachrichtigung senden möchten.

Schreiben der Skripte

Die Skripte müssen mit Bash-Syntax geschrieben werden, da wir einige bedingte Prüfungen durchführen und einige Linux- und Terminus-Befehle ausführen müssen.

Das Backup-Bash-Skript

Dieses Bash-Skript iteriert über ein Array von Website-String-IDs und verwendet den Terminus-Befehl terminus backup:create , um für jede eine Sicherung zu erstellen. Die Option --keep-for legt den Aufbewahrungszeitraum in Tagen fest, um die Sicherung aufzubewahren.

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

Die Terminus-Befehlsstruktur enthält normalerweise <site>.<env> um die Zielsite und -umgebung zu bestimmen, für die ausgeführt werden soll.

Beachten Sie, dass die Symbole <> Teil des Beispiels sind und nicht in Ihren Terminus-Befehlen enthalten sein sollten .

Außerdem muss Terminus mit einem Maschinentoken authentifiziert werden, bevor ein Befehl verwendet werden kann. Möglicherweise müssen Sie auch den SSH-Schlüsselzugriff einrichten, um Remote-Anweisungen auszuführen.

In unserem Fall wurden die Skripte, die wir zur Automatisierung des Pantheon-Backup-Prozesses implementiert haben, nicht darauf gehostet, sondern auf einem anderen Server. Daher mussten wir den SSH-Schlüsselzugriff einrichten.

Überprüfung des Backup-Status

Wir haben ein weiteres Bash-Skript geschrieben, um den Status aller vom Backup-Skript erstellten Backups zu überprüfen.

Im Skript sind zwei Arrays definiert, eines für die String-IDs der gesicherten Websites und das andere für jeden Teil eines einzelnen Backups.

Jedes Pantheon-Backup besteht aus drei Dateien.

  • Code : alle Versionen, die über das Site-Dashboard kontrolliert und übertragen werden. Nicht festgeschriebene SFTP-Änderungen am Code werden nicht gesichert.
  • Dateien : Bilder und Assets, die im Standard-Upload-Pfad wp-content/uploads für WordPress und sites/all/default/files für Drupal gespeichert sind.
  • Datenbank : ist ein MySQL-Dump der Datenbank Ihrer Website.

Eine Sicherung ist erfolgreich, wenn diese drei Dateien zum Download verfügbar sind.

Manchmal werden einige dieser Dateien jedoch nicht erstellt, weil Terminus an einem bestimmten Punkt des Sicherungsvorgangs fehlgeschlagen ist.

Das Skript verwendet den Terminus-Befehl terminus backup:get , um die Existenz dieser drei Dateien zu überprüfen. Der Sicherungsstatus gilt als fehlgeschlagen, wenn eine dieser drei Dateien fehlt.

Das Ergebnis jeder Backup-Prüfung wird in einer Datei namens backups_results.txt gespeichert. Die backups_results.txt enthält eine Zeichenfolgendarstellung eines JSON-Objekts. Dieses Objekt hat einen Eintrag für jede gesicherte Website.

 #!/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-Benachrichtigung – Optional

Zuletzt haben wir eine PHP-Datei erstellt, um eine Benachrichtigung über die Slack-API zu senden. Zuerst wird der String in der 'backups_results.txt' mit der Funktion file_get_contents() gezogen und mit der Funktion json_decode() in eine gültige PHP-Variable konvertiert. Diese Variable hilft beim Einrichten der Logik, die zum Erstellen der Slack-Nachricht erforderlich ist. Der Code iteriert die Overreach-Website und erstellt für jede eine Benachrichtigung. Die Meldung variiert je nach Status der letzten Sicherung.

Die Nachricht wird mit dem Endpunkt chat.postMessage an einen bestimmten Slack-Kanal gesendet. Sie können auch die Endpunkt- conversations.list verwenden, um die Kanal-ID zu finden, an die Sie die Nachricht senden möchten.

 <?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 einrichten

Der Cronjob ist ein großer Teil des Backup-Automatisierungsprozesses. Befolgen Sie die nächsten Schritte, um es einzurichten. Greifen Sie mit SHH auf Ihren Server zu und führen Sie den Befehl crontab -e aus, um die Cronjob-Konfigurationsdatei zu öffnen.

Eine crontab-Datei besteht aus Befehlen, ein Befehl pro Zeile, die automatisch zu dem Zeitpunkt ausgeführt werden, der in den ersten fünf Feldern jeder Befehlszeile angegeben ist. Jeder Befehl innerhalb einer crontab-Datei muss aus einer Zeile bestehen, auch wenn diese Zeile sehr lang ist. Die Crontab-Datei erkennt keine zusätzlichen Wagenrückläufe.

Wenn Sie Hilfe beim Generieren Ihres Cron-Befehls und beim Konfigurieren der Syntax für den Zeitplan benötigen, kann Ihnen dieser Crontab-Generator helfen.

Ihre Cron-Zeile muss enthalten

  • Ein Befehl für den Zugriff auf den Ordner, in dem sich die Skripts befinden
  • Ein Befehl zum Ausführen der Skripts.

Der Zweck der PATH-Variablen besteht darin, crontab mitzuteilen, wo sich die Bibliotheken in den Skripten befinden, z. B. Terminus.

Dies ist ein Beispiel für die Zeile, die wir unserer Server-crontab-Datei hinzugefügt haben.

 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

Jetzt müssen wir nicht mehr wie früher alle Backups manuell erstellen, da der Prozess vollständig automatisiert ist. Außerdem sparen wir etwas Zeit für unseren täglichen Arbeitsablauf.