概要
稼働中のWordPressサイトを、安全かつ軽量に自動バックアップしたい場合、KUSANAGI + WP-CLI + cron の組み合わせが非常に有効です。
プラグインも使う必要はありません。
もちろん契約しているサーバーにもスナップショットなどバックアップサービスは多いですが、念には念を入れたい方はcronで自動設定してしまうのが一番楽です。
今回のバックアップは、データベースとファイル全体を1日1度、そして3日経ったら自動削除、という構成です。
スケジュールや自動削除の日にちを変えたい方は、数字を変えるだけでカスタムできます。
サーバー内でやると大容量サイトでも、長くても20分かからない程度で終わってしまいます。
本記事では、
•プラグインに依存しない
•サーバー内完結
•DB+ファイル両方をバックアップ
•世代管理あり(自動削除)
という実運用向け構成を紹介します。
⸻
前提環境
•サーバー:KUSANAGI
•CMS:WordPress
•プロファイル名:〇〇〇〇(ここはご自身のものを入れてください。)
•DocumentRoot:
/home/kusanagi/〇〇〇〇/DocumentRoot
•バックアップ保存先:
/home/kusanagi/〇〇〇〇/_backup/
⸻
バックアップ構成
まずはバックアップ先のフォルダと実行スクリプトファイルを作ります。
構成は以下のとおりです。
今回はドキュメントルートではなく、プロファイル直下に作っています。
/home/kusanagi/〇〇〇〇/_backup/
_backup/ ├─ db/ (DBバックアップフォルダ) ├─ files/ (ファイルバックアップフォルダ) ├─ logs/ (実行ログフォルダ) └─ scripts/ └─ backup_daily.sh(スクリプトファイル)
このように作ってみてください。
バックアップ方針
DB
•WP-CLIで wp-config.php からDB情報を取得
•mysqldump + gzip
•出力形式
site_db_YYYY-MM-DD_HHMMSS.sql.gz
ファイル
•DocumentRoot全体を tar.gz
•キャッシュ系ディレクトリは除外(膨大な容量になるので)
•出力形式
site_files_YYYY-MM-DD_HHMMSS.tar.gz
世代管理ポリシー
•DBバックアップ:3日分
•ファイルバックアップ:3日分
•ログ:7日分
容量節約を最優先し、find -mtime で自動削除。
バックアップスクリプト例
backup_daily.sh ファイルの中身は以下です。
〇〇〇〇にご自身のプロファイル名を入れて、そのままターミナルで入力してください。
#!/usr/bin/env bash
set -euo pipefail
PROFILE="〇〇〇〇"
DOCROOT="/home/kusanagi/${PROFILE}/DocumentRoot"
BKROOT="/home/kusanagi/${PROFILE}/_backup"
DBDIR="${BKROOT}/db"
FILESDIR="${BKROOT}/files"
LOGDIR="${BKROOT}/logs"
WPCLI="/opt/kusanagi/php/bin/php /opt/kusanagi/bin/wp"
umask 077
mkdir -p "${DBDIR}" "${FILESDIR}" "${LOGDIR}"
TS="$(date +%F_%H%M%S)"
LOG="${LOGDIR}/backup_${TS}.log"
{
echo "[${TS}] backup start"
DB_NAME="$(sudo -u kusanagi -- ${WPCLI} config get DB_NAME --path="${DOCROOT}")"
DB_USER="$(sudo -u kusanagi -- ${WPCLI} config get DB_USER --path="${DOCROOT}")"
DB_PASS="$(sudo -u kusanagi -- ${WPCLI} config get DB_PASSWORD --path="${DOCROOT}")"
DB_HOST="$(sudo -u kusanagi -- ${WPCLI} config get DB_HOST --path="${DOCROOT}")"
DB_OUT="${DBDIR}/site_db_${TS}.sql.gz"
mysqldump --single-transaction --quick --skip-lock-tables \
-h "${DB_HOST}" -u "${DB_USER}" -p"${DB_PASS}" "${DB_NAME}" \
| gzip -c > "${DB_OUT}"
FILE_OUT="${FILESDIR}/site_files_${TS}.tar.gz"
tar -C "${DOCROOT}" \
--exclude='./wp-content/cache' \
-czf "${FILE_OUT}" .
find "${DBDIR}" -type f -mtime +3 -name '*.sql.gz' -delete
find "${FILESDIR}" -type f -mtime +3 -name '*.tar.gz' -delete
find "${LOGDIR}" -type f -mtime +7 -name 'backup_*.log' -delete
echo "[${TS}] backup end"
} >> "${LOG}" 2>&1
手動テスト
/home/kusanagi/〇〇〇〇/_backup/scripts/backup_daily.sh
•DB / files の両方が生成されることを確認
•gzip / tar は高負荷のため数十分かかる場合あり(ターミナルは動いてないように見えるけど正常)
動いてるか状況確認したい場合は
ps aux | egrep 'tar|mysqldump|gzip'
などで確認できます。
終わると
[root@v〇〇-〇〇-〇〇-〇〇-vir ~]#
みたく通常表示に戻ります。
FTPなどで直接フォルダ内をみて、バックアップファイルができているか確認もしてみてください。
cron設定
手動でのバックアップテストが無事成功したら
次はいよいよcron(自動設定)のコマンドを入れていきます。
同じくターミナルでそのまま入れてください
crontab -e
次はviモードでの入力になります。
0 15 * * * /home/kusanagi/〇〇〇〇/_backup/scripts/backup_daily.sh
viモードで保存して終了するには以下のコマンドを打ってください。
Esc
:wq
Enter
•毎日15時に実行(ここは任意の時間にしてください。アクセスの少ない時間帯など)
cron動作確認
systemctl status crond
active (running) であれば問題なし。
まとめ
•KUSANAGI環境では WP-CLI + cron が最小構成で強力
•プラグイン不要、サーバー内完結
•世代管理まで含めて実運用向け
WordPressは多くのプラグインがあるので便利ですが、一つ一つ入れていくといつの間にか数が増えて重くなったり、必要じゃない機能があったりアップデートも多かったりと、手間がかかることも多いです。
この方法であれば、カスタム度も高く、軽い上に手間もかかりません。
良かったら参考にしてくださいませ。

コメント