Zautomatyzowany skrypt kopii zapasowej dla witryn hostowanych przez Pantheon

Opublikowany: 2023-03-28

DigiSavvy obsługuje wiele stron internetowych w Pantheonie. Witryny objęte płatnym planem mają włączone automatyczne tworzenie kopii zapasowych, ale witryny, które nie są jeszcze objęte płatnym planem, nie mają tej funkcji; to jest sedno problemu, który rozwiązujemy. Dlatego musieliśmy stworzyć skrypt, który uruchamia codzienne kopie zapasowe dla tych witryn, które nie mają funkcji automatycznego tworzenia kopii zapasowych.

Przejdź do przepływu pracy Automatyzacja tworzenia kopii zapasowych Pantheon

Wiedzieliśmy, że jest to możliwe przy użyciu kombinacji narzędzi, takich jak Terminus, Bash i Linux cronjobs. Po krótkiej dyskusji rozpoczęliśmy prace nad rozwiązaniem automatyzującym proces tworzenia kopii zapasowych Pantheon dla niepłatnych witryn Pantheon.

Rozwiązanie

Stworzyliśmy skrypt bash, który działa codziennie, aby wykonać kopię zapasową wszystkich witryn Pantheon bez funkcji automatycznego tworzenia kopii zapasowych.

Ponadto na nasz kanał Slack wysyłane jest powiadomienie, aby poinformować nas o możliwych błędach lub problemach.

Wymagania

Do wdrożenia tego rozwiązania potrzebne będzie określone środowisko i narzędzia. Pamiętaj o skonfigurowaniu tych elementów.

  • Serwer Ubuntu z dostępem SSH : do zainstalowania niektórych narzędzi i rozwiązania ewentualnych problemów potrzebny jest wysoki poziom dostosowania serwera. Używamy Ubuntu, ale możesz użyć preferowanej wersji Linuksa.
  • Terminus : to jest oficjalne narzędzie Pantheon CLI. Musi być zainstalowany na twoim serwerze Ubuntu.
  • Aplikacja Slack : opcjonalna, ale niezbędna do uruchomienia powiadomienia po uruchomieniu kopii zapasowych. Postępuj zgodnie z tym samouczkiem, aby go skonfigurować. Pamiętaj też o dodaniu aplikacji do kanału, na który chcesz wysłać powiadomienie.

Pisanie skryptów

Skrypty muszą być napisane przy użyciu składni bash, ponieważ musimy wykonać pewne kontrole warunkowe i wykonać niektóre polecenia Linuksa i Terminusa.

Kopia zapasowa skryptu bash

Ten skrypt bash iteruje po tablicy identyfikatorów ciągów witryn internetowych i używa polecenia Terminus terminus backup:create aby utworzyć kopię zapasową dla każdego z nich. Opcja --keep-for określa okres przechowywania w dniach przechowywania kopii zapasowej.

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

Struktura poleceń Terminusa zazwyczaj obejmuje <site>.<env> określanie miejsca docelowego i środowiska do wykonania.

Zauważ, że symbole <> są częścią przykładu i nie powinny być uwzględniane w komendach Terminusa.

Ponadto Terminus musi zostać uwierzytelniony za pomocą tokena maszyny przed użyciem jakiegokolwiek polecenia. Może być również konieczne skonfigurowanie dostępu do klucza SSH w celu wykonywania zdalnych instrukcji.

W naszym przypadku skrypty, które zaimplementowaliśmy w celu zautomatyzowania procesu tworzenia kopii zapasowej Pantheon, nie były hostowane na tym serwerze, ale na innym serwerze. W związku z tym musieliśmy skonfigurować dostęp do klucza SSH.

Sprawdzanie stanu kopii zapasowej

Napisaliśmy inny skrypt bash, aby sprawdzić stan wszystkich kopii zapasowych utworzonych przez skrypt kopii zapasowej.

W skrypcie zdefiniowane są dwie tablice, jedna dla identyfikatorów ciągów stron internetowych, których kopie zapasowe są tworzone, a druga dla każdej części pojedynczej kopii zapasowej.

Każda kopia zapasowa Pantheon składa się z trzech plików.

  • Kod : dowolna wersja kontrolowana i zatwierdzana za pośrednictwem pulpitu nawigacyjnego witryny. Niezatwierdzone zmiany kodu SFTP nie są uwzględniane w kopii zapasowej.
  • Pliki : obrazy i zasoby przechowywane w standardowej ścieżce przesyłania wp-content/uploads dla WordPress i sites/all/default/files dla Drupala.
  • Baza danych : to zrzut MySQL bazy danych Twojej witryny.

Tworzenie kopii zapasowej kończy się pomyślnie, gdy te trzy pliki są dostępne do pobrania.

Czasami jednak niektóre z tych plików nie są tworzone, ponieważ Terminus zawiódł w pewnym momencie procesu tworzenia kopii zapasowej.

Skrypt używa polecenia Terminus terminus backup:get aby sprawdzić istnienie tych trzech plików. Stan kopii zapasowej zostanie uznany za zakończony niepowodzeniem, jeśli brakuje któregokolwiek z tych trzech plików.

Wynik każdego sprawdzenia kopii zapasowej jest zapisywany w pliku o nazwie backups_results.txt . Plik backups_results.txt zawiera ciąg reprezentujący obiekt JSON. Ten obiekt ma wpis dla każdej strony internetowej z kopią zapasową.

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

Powiadomienie o luzie — opcjonalne

Na koniec stworzyliśmy plik PHP do wysyłania powiadomień za pomocą Slack API. Najpierw ciąg znaków wewnątrz pliku „backups_results.txt” jest pobierany za pomocą funkcji file_get_contents() i konwertowany na prawidłową zmienną PHP za pomocą funkcji json_decode() . Ta zmienna pomoże skonfigurować logikę potrzebną do stworzenia wiadomości Slack. Kod iteruje witrynę typu overreach i tworzy powiadomienie dla każdej z nich. Komunikat będzie się różnić w zależności od stanu ostatniej kopii zapasowej.

Wiadomość jest wysyłana do określonego kanału Slack za pomocą punktu końcowego chat.postMessage . Możesz także skorzystać z conversations.list punktu końcowego, aby znaleźć identyfikator kanału, do którego chcesz wysłać wiadomość.

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

Konfigurowanie cronjoba

Cronjob to duża część procesu automatyzacji tworzenia kopii zapasowych. Wykonaj kolejne kroki, aby go skonfigurować. Uzyskaj dostęp do swojego serwera za pomocą SHH i uruchom polecenie crontab -e , aby otworzyć plik konfiguracyjny cronjob.

Plik crontab składa się z poleceń, po jednym w każdym wierszu, które są wykonywane automatycznie w czasie określonym w pierwszych pięciu polach każdego wiersza poleceń. Każde polecenie w pliku crontab musi składać się z jednej linii, nawet jeśli ta linia jest bardzo długa. Plik crontab nie rozpoznaje dodatkowych znaków powrotu karetki.

Jeśli potrzebujesz pomocy w generowaniu polecenia cron i konfigurowaniu składni harmonogramu, ten generator crontab może pomóc.

Twoja linia cron musi zawierać

  • Polecenie dostępu do folderu, w którym znajdują się skrypty
  • Polecenie wykonania skryptów.

Celem zmiennej PATH jest poinformowanie crontab, gdzie w skrypcie znajdują się biblioteki, na przykład Terminus.

To jest przykład linii, którą dodaliśmy do naszego pliku crontab serwera.

 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

Teraz nie musimy wykonywać wszystkich kopii zapasowych ręcznie, jak wcześniej, ponieważ proces jest w pełni zautomatyzowany. Oszczędzamy też trochę czasu na codzienną pracę.