シェルスクリプトでWordPressをバックアップする

3か月ほどRaspberryPiでWordPressサーバを稼働させていて、未だにバックアップを取っていなかったので、バックアップを行います。WordPressのバックアップを行うプラグインも多々あるようですが、勉強のためシェルスクリプト(bashスクリプト)で作ってみました。

バックアップは、mysqlのダンプをmysqldumpで、WordPressのコンテンツをtarで取得して、圧縮して保存、さらに世代管理します。
同じシェルでリストアを行なえるよう、オプションで機能を選択できるようにしています。ログはloggerコマンドを使って、rsyslogに出力します。

シェルスクリプト

12行~23行(# Command)
コマンドの定義です。環境に合わせてコマンドをフルパスで設定します。

25行~36行(# Setting)
ディレクトリやデータベースの設定です。以下の変数を設定します。
wp_dir : WordPressのデータがあるディレクトリ
bak_dir: バックアップの保存先となるディレクトリ
dbuser : mysqlのrootユーザ
dbpass : mysqlのrootユーザパスワード
dbname : データベース名
age : 世代管理数

38行~46行 “usage_exit”
オプションが誤っていた場合の処理を行う関数です。コマンドの例を表示して終了します。

48行~52行 “error_exit”
エラーメッセージを表示して、戻り値1で終了します。

54行~59行 “failback”
エラー発生時にシェル実行前の状態に戻す関数です。
sav_dirに退避していた実行前のバックアップファイルを元の場所に戻します。

61行~67行
オプションの種類を識別します。

77行~106行
バックアップ処理です。
ディレクトリを作成した後、旧ファイルの退避、データベースのダンプ、WordPressファイルのアーカイブ、世代管理処理を行っています。

109行~126行
リストア処理です。必要なファイル・ディレクトリのチェックを行った後、WordPressファイルのリストア、データベースのリストアを行なっています。

128行
{}で囲まれたスクリプト内での標準出力、標準エラー出力を、loggerコマンドでrsyslogdに出力します。

バックアップの実行

バックアップする場合は、任意の場所にスクリプトを置いて、以下のコマンドを実行します。。

$ sudo ./wp_backup.sh -b

※ “-b” は省略可能です。

Ansible Playbookでセットアップ

上記シェルスクリプトでバックアップできますが、cronで定期的に稼働させたり、ログの書式や出力先の設定も行いたいので、AnsibleのPlaybookでセットアップします。

8行~9行
バックアップを行うスクリプト「wp_backup.sh 」を実行ユーザーのホームディレクトリに配置します。

11行~12行
rsyslogの設定ファイル「wp_backup.rsyslog.conf」をrsyslogの設定ディレクトリに配置します。

14行~15行
設定反映のため、rsyslogdを再起動します。

17行~18行
シェルスクリプトが毎週月曜、AM3:10に稼働するよう、rootユーザーのcron設定を行います。

rsyslog設定ファイルは以下の通り。

1行目
templateでログの書式を定義しています。

2行目
ユーザー定義のファシリティ「local0」でログを受信した際の、出力先ファイル名とテンプレートを指定します。

Ansibleサーバに上記ファイルを配置し、ansible-playbookコマンドを実行してセットアップします。

ansible-playbook wp_backup.sh_setup.yml -K

これで、毎週月曜、AM3:00にシェルスクリプトが稼働し、bak_dirで指定されたディレクトリにバックアップが取得され、10世代まで保存されるようになります。

Ansible Playbookでバックアップ

bak_dirをNFS領域にすれば他サーバへバックアップできますが、私の自宅には常時稼働している他のサーバはないので、週次バックアップとは別に以下のようなplaybookを随時実行して、Ansibleサーバにバックアップを取得しています。

リストア

リストアしたい場合は、wp_backup.shのbak_dirに指定したディレクトリに、リストアしたいバージョンの”mysql.dump.gz”と”wordpress_files.tar.gz”を置いて、以下のコマンドを実行します。

$ sudo ./wp_backup.sh -r

※ “-b” は省略可能です。

リストアもplaybook化しましたが、ごくローカルな内容だったので割愛。

参考

データベースのバックアップ
シェルの入出力制御あれこれ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*