ホームページやブログを定期的に自動でバックアップする方法

「ホームページの構成データを手動でバックアップするのは面倒。」

「サーバーに保存されているデータベースのバックアップも自動でできる簡単な方法はないかな~。」

ホームページやブログなどのWEBサイトの構成データや、サーバーに保存されているデータベースのデータを自動でバックアップする方法ですが、もちろんあります。

私が利用したプログラムはシェルスクリプトとCronです。
私と同じエックスサーバーをご利用の方なら難易度は低いので、興味がある方は是非トライしてみてください。

手順通りにやれば、バックアップテストも含めて10分もかからずに設定可能です。
WordPressをご利用の方でプラグインが嫌いな方でも、プラグイン無しで自動バックアップを実装することが出来ます。
ただし、ここで解説しているバックアップファイルの保存先はサーバー側になりますのでご注意ください。

実際に私が簡単に設定できているので、余計な事さえしなければ誰でもプログラミングできます。
また、私が勘違いをしてハマったポイントも押さえているので、この記事を読んでいただければ変な寄り道をしないで済むはずです。

ちなみに、この記事よりも後に書いた「 Cronを使って自作バックアップファイルをDropboxに自動転送する方法 」ではプログラムを全てphp で書いたので、そちらもご参考にしていただければと思います。

HTMLファイルなどのWEBデータをバックアップするプログラムを作る

はじめにWEBサイトを構成しているファイルをディレクトリごとバックアップするプログラムを作っちゃいましょう。
まずはWEBデータがアップロードされているサーバー上に適当なフォルダを作ってください。
私は「backup」というフォルダ名にしました。

次にその「backup」フォルダの中にバックアップファイルの保存先フォルダを作ります。
私は「backup_data」というフォルダ名にしました。

そして「backup_data」と同じ階層にテキストファイルを新規作成します。
ファイル名はなんでも良いですが、拡張子は.shにしてください。
ファイルの拡張子が表示されていない方は、拡張子を表示するようにしてください。
私は「web_backup.sh」というファイル名にしました。

「web_backup.sh」ファイルの中に以下の内容を記述してください。

#!/bin/sh
# htmlファイルやcssファイルなどのWEBデータを保存する
serverID='●●●●'
domain='●●●●'
# バックアップファイルを何日分残しておくか
period='+30'
# バックアップファイルを保存するディレクトリ
dirpath="/home/"$serverID"/"$domain"/public_html/backup/backup_data"
# バックアップ元フォルダ
backupfolder="/home/"$serverID"/"$domain"/public_html/wp"
# ファイル名を定義
backupdate=`date +%Y%m%d%H%M%S`
filename=$domain"_webbkup_$backupdate.tar.gz"
# backup実行
tar -zcvf $dirpath/$filename -C / $backupfolder
# 古いバックアップファイルを削除
find $dirpath -type f -daystart -mtime $period -exec rm {} \;
# 実行権限を与えるためにweb_backup.shのパーミッションを700に変更する。
Code language: PHP (php)

エックスサーバーを利用されている方は記述内の「serverID」と「domain」をご自身のものに変更してください。
「dirpath」や「backupfolder」のパスはご自身の環境に合わせて変更してください。
変更を保存してアップロードが完了したら、「web_backup.sh」のパーミッションを700に変更してください。

データベースをバックアップするプログラムを作る

次にデータベースバックアップするプログラムを作ります。
先ほど作成したshファイルと同じ場所にテキストファイルを作りましょう。
これもファイル名はなんでも良いですが、拡張子は.shにしてください。
私は「database_backup.sh」というファイル名にしました。

「database_backup.sh」の中に以下の内容を記述してください。

#!/bin/sh
# データベースを保存する
serverID='●●●●'
domain='●●●●'
# バックアップファイルを何日分残しておくか
period='+10'
# バックアップファイルを保存するディレクトリ
dirpath="/home/"$serverID"/"$domain"/public_html/backup/backup_data"
# ファイル名を定義
backupdate=`date +%Y%m%d%H%M%S`
filename=$domain"_dbbkup_$backupdate.sql"
# 指定したDBのスキーマおよびデータをすべて吐き出す
USER='●●●●'
PASSWORD='●●●●'
HOST='●●●●'
DBNAME='●●●●'
mysqldump -u$USER -p$PASSWORD -h$HOST $DBNAME > $dirpath/$filename
# バックアップファイルのパーミッション変更
chmod 700 $dirpath/$filename
# 古いバックアップファイルを削除
find $dirpath -type f -name "*.sql" -mtime $period -exec rm {} \;
# 実行権限を与えるためにdatabase_backup.shのパーミッションを700に変更する。
Code language: PHP (php)

先ほどと同じように、エックスサーバーを利用されている方は記述内の「serverID」と「domain」をご自身のものに変更してください。
さらに今回は「USER」「PASSWORD」「HOST」「DBNAME」もご自身のものに変更してください。
「dirpath」のパスはご自身の環境に合わせて変更してください。
変更を保存してアップロードが完了したら、「database_backup.sh」のパーミッションを700に変更してください。

Cronの設定をしてバックアッププログラムを自動的に実行させる

サーバーにログインをしてCronの設定をしましょう。
エックスサーバーならサーバーパネルからCron設定をすることが出来ます。
先に「web_backup.sh」のバックアップテストから始めましょう。
以下のようにCronの設定をしてください。

この通りに設定してもCronが実行されない方は、PCに表示されている時間とCronが基準にしている時間に誤差があるかもしれません。JST Clock – NICTなどで時間を確認してから再度設定してください。
実行できてもプログラムがきちんと動いていないような内容のメールが来ている方は、何か余計なことをしているかもしれません。
もう一度この記事を見て確認してください。
成功すればサーバーから以下のようなメールが届きます。

次に「database_backup.sh」のバックアップテストです。
「web_backup.sh」のバックアップテストのCron設定とやることは変わりません。
注意するところはコマンドに入力するファイル名を「web_backup.sh」から「
database_backup.sh 」に変更しておくことぐらいです。

こちらはプログラムが成功してもメールが届かないので、サーバー側にバックアップファイルが作られているかいないかで成否を判断します。

それぞれのバックアップテストに問題がなければ、後は好きな実行時間を設定してください。
ちなみに私のCron設定は次の通りです。

設定 web_backup.sh database_backup.sh
30 30
3 3
* *
* *
曜日 0 *

3:30に実行設定している理由は、そのあたりの時間帯は訪問者も少なくてサーバーへの負荷が少ないからです。
「web_backup.sh」の曜日を0にしているのは、0=SUNDAYというCronのルールに従っている事と、WEBデータのバックアップファイルはサイズが多くなるので、頻度を低めに週一で実行させたいからです。

私がハマったこと

上記の手順通りにすれば問題なく動くはずですが、余計なことをしてしまうとハマってしまうので注意が必要です。
私が一番ハマってしまった所はコマンドの記述です。

私は以前PHPをCronで実行したことがあって、その時は実行するファイルのパスの前に「/usr/bin/php7.2」という記述をしたのです。
だから今回も同様に「/usr/bin/php7.2 /home/poppink/pikopiko.blog/public_html/backup/web_backup.sh」としたのですが、このように書いてしまうとCron結果の通知アドレス宛にshファイルの内容だけが送られてきて、肝心のシェルスクリプトが実行されませんでした。
「/usr/bin/php7.2」のような記述は余計なものなので書かないようにしてください。

誤って独自ドメインを削除した場合にバックアップデータはどうなる?

この場合はバックアップデータも消えます。
このようなリスクを回避するにはバックアップファイルを別のサーバーに移す事が大事です。

私はその作業を自動でしてくれるプログラムを作りたかったのですが、次々に問題が発生して心が折れたので無理でした。
WordPressをお使いの方はプラグインに使い勝手の良いバックアッププログラムがあるので、そちらのご利用をおススメします。
実はこのサイトもこの記事を書き終わった後に、WordPressのプラグインでバックアップをするように変更しました(笑)。

レンタルサーバーが凍結されたときはバックアップデータにもアクセスできなくなるのでは?

その通りです。
だから、時々ダウンロードをしてください。
手動でするのが面倒かもしれませんが、リスク回避のためには仕方ありません。

リスク回避のためにバックアップデータを他のサーバーに保存したい。できれば自動で

私もそうしたくて、バックアップファイルをメールで送信しようとしましたが、ファイルサイズが大きすぎて遅れませんでした。
php.iniの設定をいじれば何とかなるのかもしれませんが、レンタルサーバー会社からしかられるリスクの方が高そうだったのであきらめました。

DropBoxに保存する方法も検討しましたが、難しくて私には無理でした。
WordPressをご利用の方で、バックアップファイルをメールで送りたい方やDropBoxに保存したい方は、プラグインを使ったほうが確実です。


プログラムの事を最深部まで理解していなくても、正しい手順と正しい記述さえできていればバックアッププログラムを自動で実行させるのはそう難しくありません。
Let’s try!です。

以上、HTMLファイルとDBのデータを自動的にバックアップする方法でした。