WEBサイト制作

シェルスクリプトを利用したWordPressのバックアップ

WordPressのバックアップのために、よく利用されている「BackWPup」プラグインがあります。
簡単な設定で利用できますので大変便利なのですが、ファイル容量やDB容量が増えてくると時々止まることがあることと、wp-cronで実行しますので、サーバ負荷が心配になってきます。

wp-cronを止めてサーバのcronで動作させれば良いのですが、プラグインだと中身がよくわかっておらず、やはり動作が気になりますので、シェルスクリプト(bash)で実現してみました。

事前作業:SSH認証用の鍵を作成

バックアップ用サーバにはSSH接続することを想定しています。鍵認証であればパスワードを入力する必要はありませんので、まず事前にSSH認証用の鍵を作成します。

鍵作成

ssh-keygenコマンドを実行すると、.sshディレクトリの下に秘密鍵(id_rsa)と公開鍵(id_rsa.pub)のペアが作成されます。
秘密鍵(id_rsa)は機密情報ですので、ファイルパーミッションは最初から600になっています。

バックアップサーバに公開鍵を配置

バックアップ先サーバの「.ssh/authorized_keys」ファイルに「id_rsa.pub」の内容を追加します。

バックアップサーバにSSH接続

初めてSSH接続する際には、プロンプト画面が出ますので、一回だけ手動でSSH接続します。
そうすると、「.ssh/known_hosts」に、バックアップサーバの情報が書かれますので、次回からは自動的にアクセスできるようになります。

バックアップスクリプト作成

設定

まずは、スクリプト中で利用する変数の設定です。

それぞれの環境に合わせてください。「dest_ip」はホスト名でも設定可能です。

WordPressファイルのコピー

作業用に、「workdir_{日付}」というディレクトリを作成します。さらに、その下に「wordpress」というディレクトリを作成します。
WordPressのファイル一式をコピーします。

普通にコピーするとファイルの属性を引き継げなかったため、「shopt -s dotglob」を実行しています。

コピーしたファイルのうち、バックアップ不要なファイル/ディレクトリは削除します。

データベースのエクスポート

WordPressのデータベースをエクスポートし圧縮します。
データベースのホスト、名前、ユーザー名、パスワードは、wp-config.phpファイルを参照しています。

ファイルとデーターベースを一まとめにする

WordPressファイル一式とデータベースを一まとめにして、backupディレクトリに、.tar.gz形式で出力します。

バックアップサーバにコピー

バックアップサーバに接続してコピーします。他でも使いまわせるように、関数化しています。
事前に準備しておいた鍵を利用して、鍵認証でSSH接続しますので、パスワード入力は必要ありません。

作業用ディレクトリの削除

作業用ディレクトリを削除します。
ローカルにバックアップファイルを残さない場合は、そのファイルも削除します。

ローカルの過去のファイルを削除

ローカルにバックアップファイルを残す設定をしている場合、残すファイル数を超えた分は日付が古いものから削除します。他でも使いまわせるように、関数化しています。

リモートの過去のバックアップファイルを削除

バックアップサーバにSSH接続して、ローカルと同様に、残すファイル数を超えた分は日付が古いものから削除します。

リモートサーバで実行するスクリプトを、いったん「delete_remote_files.sh」というファイルに出力したうえで、そのスクリプトをSSH接続にインプットしています。

エラーメールを送信

処理途中でエラーが発生した場合は、指定されたメールアドレスにエラーメールを送信します。

全体

スクリプト全体です。
「/home/user/scripts」ディレクトリに、「wordpress_backup.sh」というファイル名で作成しました。

cron設定

最後に、cronで自動起動する設定をします。

毎週日曜日の午前3時にバックアップする設定です。
また、wp-cron.phpを完全に止めてしまうと、悪影響がある可能性がありますので、10分おきに動かすようにしておきます。

wp-config.phpファイルを編集して、wp-cronを止めておきます。
「define(‘DB_COLLATE’, ”);」の下あたりに記述すると良いでしょう。