縦ぽん!!

このサイト(と仕事でWordPressで構築したサイト)のバックアップはBackWPupで行い、作成されたバックアップファイルはSyugarSyncを経由してローカルのHDDにコピーするようにしていたのだが、ひと月ほど前からSugarSyncの5GBトライアルサービス終了の案内が届くようになったこともあり、思い切ってBackWPupの設定を見直し、一連の処理を自動化するようにしてみた。

自動化の流れはだいたいこのようになる。

  1. BackWPupのバックアップファイル保存先をDropboxに設定し、WordPressのcronでスケジュール化する。
  2. Dropboxに保存されたバックアップファイルをローカルにコピーし、簡易世代管理を行うPowerShellスクリプトを作成する。
  3. PorerShellのスクリプトをWindowsのログイン時に動作させる。

日常的に使うWindowsパソコンがあれば、サイトのバックアップと世代管理をほとんど意識することなく行えるのがポイントだろうか。万が一サイト側でトラブルが起こり、データが消失したとしても数世代のバックアップが残っている状態なら最悪の事態は避けられそうだ。

仮に数日程度パソコンを使用しない日があったとしても、バックアップファイルはDropboxに残ることになるので多少は安心できるのでないだろうか。というわけで、簡単ではあるがBackWPupとDropbox、PowerShellスクリプトを使用したWordPressのバックアップの自動化の手順を説明してみたいと思う。あらかじめお断りしておくが、以下の説明の内容は全て無保証だ。特にPowerShellスクリプトではファイルの削除操作が含まれるため、設定を誤って大事なファイルを削除してしまうことも考えられる。取扱いについては十分ご注意いただきたい。

BackWPupの設定

私の稚拙な説明より先人のサイトの記事の方がわかりやすいだろうということで、BackWPupのインストールや基本的な設定については割愛する。
設定のポイントは以下の通りだ。

  • 「一般」タブの「アーカイブ名」:%Y-%m-%d_wp_*_backwpup
  • 「宛先:Dropbox」タブの「ファイルを削除」:0

「一般」タブの「アーカイブ名」は後述のPoweShellスクリプトで簡易世代管理を行う際にバックアップファイル名でソートするためにアーカイブ名の先頭に日付を設定するようにする。それ以外は基本的に任意の文字列で問題ないが、複数のWordPressのバックアップを取る場合はアスタリスクのところをサイト名などに置き換えると良いだろう。
「宛先:Dropbox」タブの「ファイルを削除」はゼロにすることでBackWPup側からバックアップファイルの操作は行わない。バックアップファイルの削除はPoweShellスクリプトで行うからだ。

ただし、Dropboxにあるファイルを削除するPowerShellスクリプトが実行されないとバックアップファイルはフォルダの空き容量を食いつぶすまで増え続ける可能性はある。
もし、Dropboxの空き容量が心配なら任意の世代のファイル以上を作成しないようにしても良いだろう。

PowerShellスクリプトによる簡易世代管理

バックアップ処理の胆となるPowerShellのスクリプトだが、正直なところPowerShellのスクリプトを記述する機会がほとんどないため、あまり出来の良いスクリプトではないと思う。一応、私の環境で問題なく動作しているものだが、サイトへ掲載するために多少記述を変更している個所があるため、正常に動作しない可能性もある。もし、おかしな点があればフィードバックしていただけると助かります。

# クラウド共有のバックアップファイルをローカルにコピー
# ローカルのバックアップファイルを最新ファイルから所定数を保存し、古いものから自動的に破棄する

# phase1. 初期設定

$cloudFiles = "(Dropboxフォルダのパス)\*_wp_*_backwpup.zip"
$backupPath = "(バックアップファイル保存先のローカルフォルダのパス)"
$saveCnt = (保存するバックアップファイルの数)

#
# phase2. バックアップファイルをクラウド共有からローカルにコピー(強制的に上書き)
#

Copy-Item $cloudFiles $backupPath -Force

# phase3. ファイル名を降順にソートし、古いバックアップを削除

$FileList = Get-ChildItem $backupPath *wp_*_backwpup.zip | ForEach-Object { $_.Fullname } | Sort-Object -Descending

$cnt = 0

foreach ($FileItem in $FileList)
{
	$cnt++
	if ( $cnt -gt $saveCnt )
	{
		Remove-Item $FileItem
	}
}

# phase4. クラウド共有のバックアップファイルを削除

Remove-Item $cloudFiles

簡単なコメントがあるのでスクリプトの詳細は割愛するが、6行目から8行目までを各自の環境に合わせて変更し、6行目と18行目に記述してあるバックアップファイル名をBackWPupで設定したアーカイブ名に合わせてワイルドカードによる記述をするだけでよい。

もし、複数のサイトのバックアップを行う場合はファイル名で降順にソートされた結果から保存するファイルが決定されるのでバックアップファイル数は注意したほうがよいだろう。

タスクスケジュールでのPowerShellスクリプトの実行

完成したPowerShellのスクリプトを単体で実行し、問題が無いようであれば、あとはタスクスケジュールでPowerShellのスクリプトを実行するようにすればいい。
作成するタスクスケジュールはトリガをユーザーのログオン時にすれば良いだけなので、設定はそれほど難しくないだろう。

ポイントは「最上位の特権で実行する」ようにすることと、実行するプログラムの引数に「-executionpolicy unrestricted」と「-inputformat none」を与えることだろうか。
引数については、前者は実行するPowerShellスクリプトのポリシーを「制限なし」にするもので、後者は「PowerShellの不具合」を回避するためのおまじないと思っていただければよいだろう。

ちなみにタスクスケジュールの設定だが、サーバーなど常時稼働しているパソコンがあるなら定刻に動作するようにしても良いだろうし、そのほうが理想だろう。だが、一般的に常時稼働しているパソコンを所有している個人はそう多くないだろうということで、ここではパソコンを起動してログオンしたタイミングでバックアップを行うよう手順としてまとめてある。

バックアップを自動化するメリット

せっかく苦労して育て上げたサイトのデータを不慮の事故で失うという最悪のシナリオを避けるために、やはりバックアップは重要だろう。そのバックアップをなるべく手間をかけずに行うにはやはり自動化するのが一番だ。

関連する記事