WordPress 自動備份腳本


前言:

這篇文章提供一套可長期穩定使用的 WordPress 備份方案,並將原本的雲端上傳方式升級為更可靠的工具。


✅ 為什麼改用 rclone?

rclone 是目前主流的雲端同步工具,適合用在自動備份場景:

  • 支援多種雲端(Google Drive / S3 / Dropbox)
  • 穩定且持續維護
  • 內建 retry(自動重試)
  • 支援大檔案
  • 可搭配 cron 長期運行
  • 支援依時間自動清理舊備份

🛠️ 初始化設定(只需一次)

rclone config

依照指示完成雲端授權即可。


📦 完整備份腳本(rclone 版本)

#!/bin/bash

# ============================================
# WordPress 自動備份工具(rclone 穩定版)
# ============================================

BACKUP_DIR="/var/backups/wordpress"
WEB_ROOT="/var/www/html/wordpress"
DB_NAME="wordpress"
DB_USER=""
DB_PASS=""
KEEP_DAYS=7
RCLONE_REMOTE="gdrive:wordpress-backup"
LOG_FILE="/var/log/wp-backup.log"

DATE=$(date +%Y%m%d-%H%M%S)
START_TIME=$(date +%s)
BACKUP_FILE="wordpress-$DATE.tar.gz"

mkdir -p "$BACKUP_DIR"
mkdir -p "$(dirname "$LOG_FILE")"

echo "===============================" >> "$LOG_FILE"
echo "📦 [$(date '+%Y-%m-%d %H:%M:%S')] 開始備份 WordPress" >> "$LOG_FILE"

# =========================
# 1️⃣ 資料庫備份
# =========================
mysqldump -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" > "$BACKUP_DIR/db-$DATE.sql" 2>>"$LOG_FILE"
if [ $? -ne 0 ]; then
  echo "❌ 資料庫備份失敗" >> "$LOG_FILE"
  exit 1
fi

# =========================
# 2️⃣ 壓縮檔案
# =========================
tar -czf "$BACKUP_DIR/$BACKUP_FILE" "$WEB_ROOT" "$BACKUP_DIR/db-$DATE.sql" >>"$LOG_FILE" 2>&1

if [ $? -ne 0 ]; then
  echo "❌ 壓縮失敗" >> "$LOG_FILE"
  exit 1
fi

rm "$BACKUP_DIR/db-$DATE.sql"

# 檢查檔案存在
if [ ! -f "$BACKUP_DIR/$BACKUP_FILE" ]; then
  echo "❌ 備份檔不存在" >> "$LOG_FILE"
  exit 1
fi

SIZE=$(du -h "$BACKUP_DIR/$BACKUP_FILE" | awk '{print $1}')
echo "✅ 備份完成:$BACKUP_DIR/$BACKUP_FILE$SIZE)" >> "$LOG_FILE"

# =========================
# 3️⃣ 刪除本地舊備份
# =========================
find "$BACKUP_DIR" -type f -mtime +$KEEP_DAYS -name "*.tar.gz" -delete >>"$LOG_FILE" 2>&1
echo "🧹 已刪除超過 $KEEP_DAYS 天的本地備份" >> "$LOG_FILE"

# =========================
# 4️⃣ 上傳到雲端(rclone)
# =========================
if command -v rclone >/dev/null 2>&1; then
  echo "☁️ 上傳至雲端(rclone)..." >> "$LOG_FILE"

  SUCCESS=0

  for i in {1..3}; do
    rclone copy "$BACKUP_DIR/$BACKUP_FILE" "$RCLONE_REMOTE" \
      --transfers=1 \
      --checkers=2 \
      --log-file="$LOG_FILE" \
      --log-level ERROR \
      && SUCCESS=1 && break

    echo "⚠️ 第 $i 次上傳失敗,5秒後重試..." >> "$LOG_FILE"
    sleep 5
  done

  if [ $SUCCESS -eq 1 ]; then
    echo "✅ 上傳成功" >> "$LOG_FILE"

    # =========================
    # 5️⃣ 刪除雲端舊備份
    # =========================
    rclone delete "$RCLONE_REMOTE" \
      --min-age ${KEEP_DAYS}d \
      --include "wordpress-*.tar.gz" \
      --log-file="$LOG_FILE" \
      --log-level ERROR

    echo "🧹 已刪除雲端 $KEEP_DAYS 天前備份" >> "$LOG_FILE"

  else
    echo "❌ 上傳失敗(已重試3次)" >> "$LOG_FILE"
  fi

else
  echo "⚠️ 未安裝 rclone,略過雲端備份" >> "$LOG_FILE"
fi

# =========================
# 6️⃣ 記錄時間
# =========================
END_TIME=$(date +%s)
DURATION=$((END_TIME - START_TIME))

echo "⏱️ 備份耗時:${DURATION} 秒" >> "$LOG_FILE"
echo "🎉 完成於 $(date '+%Y-%m-%d %H:%M:%S')" >> "$LOG_FILE"
echo "===============================" >> "$LOG_FILE"
echo "" >> "$LOG_FILE"

exit 0

🧠 重點說明

🔹 雲端路徑設定

RCLONE_REMOTE="gdrive:wordpress-backup"
  • gdrive:rclone 設定的 remote 名稱
  • wordpress-backup:雲端資料夾

🔹 自動重試機制

for i in {1..3}; do
  • 最多重試 3 次
  • 避免網路不穩導致備份失敗

🔹 雲端自動清理

rclone delete --min-age 7d
  • 只保留最近 N 天備份
  • 不會誤刪新檔案

🎯 總結

這個版本已經具備:

  • ✅ 自動備份(檔案 + DB)
  • ✅ 壓縮與紀錄
  • ✅ 雲端上傳(穩定)
  • ✅ 自動清理(本地 + 雲端)
  • ✅ retry 機制
  • ✅ 適合 cron 長期執行

👉 可以直接用在 production 環境。


📖 後記