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にオフサイト転送、⑤復元スクリプトの準備の流れで実装します。プラグイン不要で確実なバックアップ体制を構築できます。

お気軽にご相談ください

お見積りへ お問い合わせへ