Pantheon がホストする Web サイトの自動バックアップ スクリプト

公開: 2023-03-28

DigiSavvy は、Pantheon で多くの Web サイトをホストしています。 有料プランのサイトでは自動バックアップが有効になっていますが、まだ有料プランに含まれていないサイトにはこの機能がありません。 これが私たちが解決しようとしている問題の核心です。 したがって、自動バックアップ機能を持たない Web サイトの毎日のバックアップを実行するスクリプトを作成する必要がありました。

Pantheon バックアップの自動化ワークフローに入る

これは、Terminus、Bash、Linux cronjobs などのツールを組み合わせて使用​​することで可能になることがわかっていました。 いくつかの議論の後、無料の Pantheon サイトの Pantheon バックアップ プロセスを自動化するソリューションに取り組み始めました。

ソリューション

自動バックアップ機能なしですべての Pantheon Web サイトのバックアップを作成するために、毎日実行される bash スクリプトを作成しました。

また、通知メッセージが Slack チャネルに送信され、考えられるエラーや問題について通知されます。

要件

このソリューションを実装するには、特定の環境とツールが必要です。 これらの項目を必ず設定してください。

  • SSH アクセスを備えた Ubuntu サーバー: いくつかのツールをインストールし、考えられる問題を解決するには、高レベルのサーバーのカスタマイズが必要です。 Ubuntu を使用していますが、好みの Linux フレーバーを使用できます。
  • Terminus : これは公式の Pantheon CLI ツールです。 Ubuntu サーバーにインストールする必要があります。
  • Slack App : オプションですが、バックアップの実行後に通知を送信するために必要です。 このチュートリアルに従って構成してください。 また、通知を送信するチャネルにアプリを追加することを忘れないでください。

スクリプトの作成

いくつかの条件付きチェックを行い、いくつかの Linux および Terminus コマンドを実行する必要があるため、スクリプトは bash 構文を使用して作成する必要があります。

バックアップ bash スクリプト

この bash スクリプトは、一連の Web サイト文字列識別子を繰り返し処理し、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 バックアップ プロセスを自動化するために実装したスクリプトは、Pantheon ではなく、別のサーバーでホストされていました。 したがって、SSH キー アクセスを設定する必要がありました。

バックアップ状態の確認

バックアップ スクリプトによって作成されたすべてのバックアップのステータスをチェックするために、別の bash スクリプトを作成しました。

スクリプトには 2 つの配列が定義されています。1 つはバックアップされた Web サイトの文字列識別子用で、もう 1 つは単一のバックアップの各部分用です。

すべての Pantheon バックアップは 3 つのファイルで構成されます。

  • コード: サイト ダッシュボードを介して管理およびコミットされたすべてのバージョン。 コードに対するコミットされていない SFTP の変更はバックアップされません。
  • Files : 標準のアップロード パスwp-content/uploads (WordPress の場合) およびsites/all/default/files Drupal の場合) に保存された画像とアセット。
  • Database : サイトの DB の MySQL ダンプです。

これら 3 つのファイルがダウンロード可能になると、バックアップは成功です。

ただし、Terminus がバックアップ プロセスのある時点で失敗したために、これらのファイルの一部が作成されないことがあります。

このスクリプトは、Terminus コマンドのterminus backup:getを使用して、これら 3 つのファイルの存在を確認します。 これら 3 つのファイルのいずれかが欠落している場合、バックアップ ステータスは失敗と見なされます。

各バックアップ チェックの結果は、 backups_results.txtというファイルに保存されます。 backups_results.txtは、JSON オブジェクトの文字列表現が含まれています。 このオブジェクトには、バックアップされた各 Web サイトのエントリがあります。

 #!/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 通知 – オプション

最後に、Slack API を使用して通知を送信するための PHP ファイルを作成しました。 まず、「backups_results.txt」内の文字列がfile_get_contents()関数を使用して取得され、関数json_decode()を使用して有効な PHP 変数に変換されます。 この変数は、Slack メッセージの作成に必要なロジックを設定するのに役立ちます。 このコードは、オーバーリーチ Web サイトを反復し、それぞれの通知を作成します。 メッセージは、最後のバックアップのステータスによって異なります。

メッセージは、エンドポイントchat.postMessageを使用して特定の Slack チャネルに送信されます。 エンドポイントのconversations.listを使用して、メッセージの送信先のチャネル ID を見つけることもできます。

 <?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 ファイルは、各コマンド ラインの最初の 5 つのフィールドで指定された時間に自動的に実行される、1 行に 1 つのコマンドで構成されるコマンドで構成されます。 crontab ファイル内の各コマンドは、その行が非常に長い場合でも、1 行で構成する必要があります。 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

プロセスが完全に自動化されているため、以前のようにすべてのバックアップを手動で作成する必要はありません。 また、毎日のワークフローの時間を節約できます。