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 環境。