2026年5月30日
2026年5月30日
WordPressの自動バックアップをサーバーで設定する方法【cron・rsync】
はじめに
プラグインに頼らず、サーバーのcronとシェルスクリプトでWordPressの自動バックアップを実装することで、プラグイン障害時にもバックアップが機能し、柔軟な世代管理とリモートストレージへの転送が可能になります。
症状・原因
バックアップに問題が起きる主なケース:
- バックアッププラグインが重くてサイトが遅い
- バックアップファイルがサーバー上にのみ保存されている
- 世代管理がなく古いバックアップが残り続ける
- バックアップの復元手順が不明確
解決手順
ステップ1:バックアップスクリプトを作成する
#!/bin/bash
# /opt/scripts/wp-backup.sh
set -euo pipefail
# 設定
SITE_ROOT="/var/www/html"
BACKUP_ROOT="/var/backups/wordpress"
DB_NAME="wordpress_db"
DB_USER="wp_user"
DB_PASS="secret_password"
KEEP_DAYS=14 # 保持する世代数(日)
# タイムスタンプ
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="${BACKUP_ROOT}/${DATE}"
mkdir -p "${BACKUP_DIR}"
echo "[$(date)] バックアップ開始: ${DATE}"
# 1. データベースバックアップ
echo " → DBダンプ中..."
mysqldump \
--user="${DB_USER}" \
--password="${DB_PASS}" \
--single-transaction \
--quick \
--add-drop-table \
"${DB_NAME}" | gzip > "${BACKUP_DIR}/db.sql.gz"
echo " → DB完了: $(du -sh "${BACKUP_DIR}/db.sql.gz" | cut -f1)"
# 2. ファイルバックアップ(wp-contentのみ)
echo " → ファイルバックアップ中..."
tar -czf "${BACKUP_DIR}/wp-content.tar.gz" \
--exclude="${SITE_ROOT}/wp-content/cache" \
--exclude="${SITE_ROOT}/wp-content/upgrade" \
"${SITE_ROOT}/wp-content"
echo " → ファイル完了: $(du -sh "${BACKUP_DIR}/wp-content.tar.gz" | cut -f1)"
# 3. wp-config.phpをバックアップ
cp "${SITE_ROOT}/wp-config.php" "${BACKUP_DIR}/wp-config.php"
# 4. バックアップ情報を記録
cat > "${BACKUP_DIR}/info.json" <<EOF
{
"date": "${DATE}",
"db_name": "${DB_NAME}",
"site_root": "${SITE_ROOT}",
"wp_version": "$(wp --path="${SITE_ROOT}" core version 2>/dev/null || echo 'unknown')"
}
EOF
echo " → バックアップ完了: ${BACKUP_DIR}"
echo " → 合計サイズ: $(du -sh "${BACKUP_DIR}" | cut -f1)"
# 5. 古いバックアップを削除(KEEP_DAYS日以上前)
echo " → 古いバックアップを削除中..."
find "${BACKUP_ROOT}" -maxdepth 1 -type d -mtime +${KEEP_DAYS} -exec rm -rf {} \;
echo " → 残存バックアップ数: $(ls -d "${BACKUP_ROOT}"/[0-9]* 2>/dev/null | wc -l)"
echo "[$(date)] バックアップ完了"
ステップ2:スクリプトを実行可能にしてテストする
# スクリプトに実行権限を付与
chmod +x /opt/scripts/wp-backup.sh
# テスト実行
/opt/scripts/wp-backup.sh
# バックアップが作成されたか確認
ls -lh /var/backups/wordpress/
# DB復元テスト(別の場所で試す)
gunzip -c /var/backups/wordpress/20240101_020000/db.sql.gz | \
mysql -u wp_user -p wordpress_db_test
ステップ3:cronで自動実行する
# crontabを編集
crontab -e
# 毎日午前2時にバックアップ実行
0 2 * * * /opt/scripts/wp-backup.sh >> /var/log/wp-backup.log 2>&1
# 毎週日曜日の午前3時にフルバックアップ
0 3 * * 0 /opt/scripts/wp-backup-full.sh >> /var/log/wp-backup-full.log 2>&1
# cronが動いているか確認
systemctl status cron # Debian/Ubuntu
systemctl status crond # CentOS/RHEL
# ログを確認
tail -f /var/log/wp-backup.log
ステップ4:Amazon S3にバックアップをアップロードする
# AWS CLIをインストール
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o awscliv2.zip
unzip awscliv2.zip && sudo ./aws/install
# AWS認証設定
aws configure
# バックアップスクリプトに追記
S3_BUCKET="my-wordpress-backups"
S3_PREFIX="production"
# S3にアップロード
aws s3 sync "${BACKUP_DIR}" \
"s3://${S3_BUCKET}/${S3_PREFIX}/${DATE}/" \
--storage-class STANDARD_IA # 低頻度アクセスで安価
# S3の古いファイルを30日後に削除するライフサイクルルール
aws s3api put-bucket-lifecycle-configuration \
--bucket "${S3_BUCKET}" \
--lifecycle-configuration file://lifecycle.json
# lifecycle.json
# {
# "Rules": [{
# "Status": "Enabled",
# "Prefix": "production/",
# "Expiration": {"Days": 30}
# }]
# }
ステップ5:バックアップから復元する
#!/bin/bash
# /opt/scripts/wp-restore.sh
BACKUP_DATE="${1:-}" # 引数: 20240101_020000
if [ -z "${BACKUP_DATE}" ]; then
echo "使い方: $0 <バックアップ日時>"
echo "利用可能なバックアップ:"
ls /var/backups/wordpress/
exit 1
fi
BACKUP_DIR="/var/backups/wordpress/${BACKUP_DATE}"
SITE_ROOT="/var/www/html"
echo "復元を開始: ${BACKUP_DATE}"
# DBを復元
echo "→ DBを復元中..."
gunzip -c "${BACKUP_DIR}/db.sql.gz" | mysql -u wp_user -p wordpress_db
# ファイルを復元
echo "→ wp-contentを復元中..."
tar -xzf "${BACKUP_DIR}/wp-content.tar.gz" -C /
# パーミッションを修正
chown -R www-data:www-data "${SITE_ROOT}/wp-content"
find "${SITE_ROOT}/wp-content" -type f -exec chmod 644 {} \;
find "${SITE_ROOT}/wp-content" -type d -exec chmod 755 {} \;
echo "復元完了!"
注意事項
- バックアップスクリプトにDBパスワードを直接記載する場合は、ファイルのパーミッションを
700にしてください - バックアップ後は定期的に復元テストを実施し、バックアップが正常に動作していることを確認してください
- S3などのオフサイトへのコピーが推奨です(サーバー障害時の備え)
まとめ
サーバーでの自動バックアップは、①シェルスクリプトでmysqldumpとtar.gzによるバックアップ作成、②findコマンドで世代管理、③cronで毎日自動実行、④AWS S3にオフサイト転送、⑤復元スクリプトの準備の流れで実装します。プラグイン不要で確実なバックアップ体制を構築できます。