2026年6月26日
2026年6月26日
WordPressのバックアップを自動化する方法【WP-CLI・rsync・クラウド保存】
はじめに
WordPressサイトの運用において、定期的なバックアップは最も重要なタスクの一つです。しかし手動バックアップは忘れがちで、いざという時に最新のバックアップがないことが多々あります。本記事では WP-CLI・シェルスクリプト・rclone を組み合わせて、完全自動化されたバックアップシステムを構築する方法を解説します。
症状・原因
- ハッキング・サーバー障害・誤操作でサイトのデータが失われた
- バックアップを取り忘れていて古いデータしか復元できない
- バックアップがサーバー上にしかなく、サーバー全体が障害になった時に使えない
- バックアップファイルが蓄積してサーバーのディスク容量を圧迫している
- バックアップを復元したことがなく、実際に使えるか検証していない
解決手順
ステップ1:WP-CLI と tar で手動バックアップを実行する
# WP-CLI でデータベースをエクスポートする
wp --path=/var/www/html db export \
/tmp/wordpress-db-$(date +%Y%m%d-%H%M%S).sql
# または mysqldump を直接使用する
mysqldump -u wordpress_user -p \
--single-transaction \
--quick \
--lock-tables=false \
wordpress_db > /tmp/wordpress-db-$(date +%Y%m%d-%H%M%S).sql
# WordPress ファイル全体を tar で圧縮する
tar -czf /tmp/wordpress-files-$(date +%Y%m%d-%H%M%S).tar.gz \
--exclude='/var/www/html/wp-content/cache' \
--exclude='/var/www/html/wp-content/upgrade' \
/var/www/html/
# DB と ファイルをひとつのアーカイブにまとめる
BACKUP_DATE=$(date +%Y%m%d-%H%M%S)
BACKUP_DIR="/backup/wordpress"
mkdir -p "$BACKUP_DIR"
wp --path=/var/www/html db export "$BACKUP_DIR/db-$BACKUP_DATE.sql"
tar -czf "$BACKUP_DIR/files-$BACKUP_DATE.tar.gz" \
-C /var/www html/
# バックアップファイルの確認
ls -lh "$BACKUP_DIR/"
ステップ2:日付付きファイル名と7世代ローテーションのシェルスクリプト
#!/bin/bash
# /opt/scripts/wp-backup.sh
# WordPress 完全バックアップスクリプト(7世代ローテーション)
# ========== 設定 ==========
WP_PATH="/var/www/html"
BACKUP_DIR="/backup/wordpress"
KEEP_DAYS=7 # 保持する世代数(日数)
DATE=$(date +%Y%m%d-%H%M%S)
BACKUP_NAME="wp-backup-$DATE"
LOG_FILE="/var/log/wp-backup.log"
# ========== 関数定義 ==========
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# ========== バックアップ実行 ==========
log "バックアップ開始: $BACKUP_NAME"
# バックアップディレクトリを作成
mkdir -p "$BACKUP_DIR"
# 1. データベースのバックアップ
log "データベースをエクスポートしています..."
wp --path="$WP_PATH" --allow-root db export \
"$BACKUP_DIR/$BACKUP_NAME.sql"
if [ $? -ne 0 ]; then
log "エラー: データベースのエクスポートに失敗しました"
exit 1
fi
# 2. ファイルのバックアップ(キャッシュと不要ファイルを除外)
log "ファイルをアーカイブしています..."
tar -czf "$BACKUP_DIR/$BACKUP_NAME.tar.gz" \
--exclude="$WP_PATH/wp-content/cache" \
--exclude="$WP_PATH/wp-content/upgrade" \
--exclude="$WP_PATH/wp-content/backups" \
"$WP_PATH/" 2>/dev/null
if [ $? -ne 0 ]; then
log "エラー: ファイルのアーカイブに失敗しました"
exit 1
fi
# 3. バックアップサイズを記録
SQL_SIZE=$(du -sh "$BACKUP_DIR/$BACKUP_NAME.sql" | cut -f1)
TAR_SIZE=$(du -sh "$BACKUP_DIR/$BACKUP_NAME.tar.gz" | cut -f1)
log "バックアップ完了: DB=$SQL_SIZE, Files=$TAR_SIZE"
# 4. 古いバックアップを削除(7日以上前)
log "$KEEP_DAYS 日以上前のバックアップを削除しています..."
find "$BACKUP_DIR" -name "wp-backup-*.sql" \
-mtime +$KEEP_DAYS -delete
find "$BACKUP_DIR" -name "wp-backup-*.tar.gz" \
-mtime +$KEEP_DAYS -delete
log "バックアップスクリプト完了"
ステップ3:rclone でクラウドストレージにバックアップを転送する
# rclone のインストール
curl https://rclone.org/install.sh | sudo bash
# rclone の設定(Google Drive の例)
rclone config
# → n(新しいリモートを追加)
# → 名前: gdrive
# → ストレージタイプ: drive(Google Drive)
# → 設定に従って OAuth 認証を完了する
# 設定をテストする
rclone ls gdrive:wordpress-backups/
# バックアップスクリプトに rclone 転送を追加する
# /opt/scripts/wp-backup.sh に追記
#!/bin/bash
# rclone アップロード設定(wp-backup.sh に追記する部分)
RCLONE_REMOTE="gdrive" # rclone のリモート名
REMOTE_DIR="wordpress-backups" # クラウド上の保存先ディレクトリ
# アップロード先の設定例
# Google Drive: gdrive:wordpress-backups
# S3: s3:my-bucket/wordpress-backups
# Backblaze B2: b2:my-bucket/wordpress-backups
# クラウドへアップロードする
log "クラウドへアップロードしています..."
rclone copy "$BACKUP_DIR/$BACKUP_NAME.sql" \
"$RCLONE_REMOTE:$REMOTE_DIR/" \
--log-level ERROR
rclone copy "$BACKUP_DIR/$BACKUP_NAME.tar.gz" \
"$RCLONE_REMOTE:$REMOTE_DIR/" \
--log-level ERROR
if [ $? -eq 0 ]; then
log "クラウドへのアップロード完了"
else
log "警告: クラウドへのアップロードに失敗しました(ローカルバックアップは保持)"
fi
# クラウド上の古いファイルも削除する(30日以上前)
rclone delete "$RCLONE_REMOTE:$REMOTE_DIR/" \
--min-age 30d \
--log-level ERROR
# バックアップ一覧を確認
rclone ls "$RCLONE_REMOTE:$REMOTE_DIR/" | tail -10
ステップ4:crontab でバックアップを毎日自動実行する
# スクリプトに実行権限を付与する
chmod +x /opt/scripts/wp-backup.sh
# crontab を編集する
crontab -e
# 以下を追記する(毎日午前2時に実行)
# 0 2 * * * /opt/scripts/wp-backup.sh >> /var/log/wp-backup.log 2>&1
# 週次でフルバックアップ、日次で差分バックアップの例
# 0 2 * * 0 /opt/scripts/wp-full-backup.sh # 毎週日曜日にフルバックアップ
# 0 2 * * 1-6 /opt/scripts/wp-diff-backup.sh # 月〜土は差分バックアップ
# crontab の確認
crontab -l
# バックアップが実行されているか確認(次の実行まで待てない場合)
sudo run-parts --test /etc/cron.daily
# または手動実行
/opt/scripts/wp-backup.sh
# ログを確認する
tail -f /var/log/wp-backup.log
ステップ5:バックアップの検証と復元手順のテスト
# ========== バックアップの整合性確認 ==========
# 1. データベースバックアップの検証(WP-CLI)
wp --path=/var/www/html db check
# OK なら正常
# SQL ファイルの構文チェック
mysql --user=wordpress_user --password=secret \
--execute="SELECT 1;" wordpress_db
mysqlcheck -u wordpress_user -p wordpress_db
# 2. tar アーカイブの整合性チェック
tar -tzf /backup/wordpress/wp-backup-20260516-020000.tar.gz \
> /dev/null && echo "OK" || echo "アーカイブが破損しています"
# ========== 復元手順(本番環境で実行する前に必ずテスト環境で確認) ==========
# ステップA: バックアップファイルを解凍する
RESTORE_DIR="/tmp/wp-restore"
mkdir -p "$RESTORE_DIR"
tar -xzf /backup/wordpress/wp-backup-20260516-020000.tar.gz \
-C "$RESTORE_DIR"
# ステップB: データベースを復元する
# 既存のテーブルを全て削除してから復元する
wp --path=/var/www/html db reset --yes
wp --path=/var/www/html db import \
/backup/wordpress/wp-backup-20260516-020000.sql
# ステップC: ファイルを上書きコピーする
rsync -av --delete \
"$RESTORE_DIR/var/www/html/" \
/var/www/html/
# ステップD: パーミッションを修正する
chown -R www-data:www-data /var/www/html/
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
chmod 600 /var/www/html/wp-config.php
# ステップE: キャッシュをクリアして動作確認
wp --path=/var/www/html cache flush
wp --path=/var/www/html rewrite flush
curl -s -o /dev/null -w "%{http_code}" https://example.com
# 200 が返れば復元成功
注意事項
- 3-2-1 バックアップルール: 3つのコピー(本番・ローカル・クラウド)、2種類のメディア、1つはオフサイト(クラウド)に保存するのが理想です。
- バックアップの定期テスト: 月1回程度、テスト環境でバックアップからの復元を実際に試してください。使えないバックアップは意味がありません。
- wp-config.php の保護: バックアップには DB パスワードが含まれます。暗号化(GPG など)してクラウドに保存することを推奨します。
まとめ
WordPress のバックアップ自動化は「WP-CLI でのエクスポート→シェルスクリプトで自動化→rclone でクラウド転送→cron でスケジュール→復元テスト」の5ステップで実現できます。3-2-1 ルールに従ったバックアップ体制を整えることで、どんな障害からも迅速に復旧できます。関連記事:WooCommerceにカスタム商品タイプを作成する方法