こんにちは、やまとトローです^^
今日は、WordPressのバックアップとリストアを
「できるだけシンプルに、長く使える形」でまとめてみました。
昔、SolarisやAIXの時代に
先輩から
「設定と処理を分けると、壊れにくくて美しい」
と教えてもらったことがあります。
さらに最近では、
大工の石山さんから
普通はできてあたりまえ
トラブル時を考えるのが、本当のやさしさ
という言葉を教えてもらいました。
今回はその考え方を、
Linux × WordPress の世界で、
今の環境でも使いやすい形に落とし込んでみました🌿
目次
🌿 設計の考え方(とても大切)
今回のポイントは、この3つです👇
✨ 設定と処理を分離する
✨ 構成が一目でわかる
✨ 異常が起きたとき、原因が分かる
「シンプルで、壊れにくく、迷わない」
そんな設計を大切にしています^^
📁 全体構成(とてもシンプル)
wp-backup/
├─ config.sh ← ★設定ファイル(ここだけ編集)
├─ wp_backup.sh ← バックアップ実行
├─ wp_restore.sh ← リストア実行
└─ README.md ←(あったら親切)
👉
普段さわるのは config.sh だけ。
スクリプト本体は、なるべく触らない設計です。
🗂 バックアップ保存先とログ構成
/backup
├─ daily/ ← WordPressファイル
│ ├─ wp_20260118_0300.tar.gz
│ └─ wp_20260117_0300.tar.gz
│
├─ db/ ← データベース
│ ├─ db_20260118_0300.sql.gz
│ └─ db_20260117_0300.sql.gz
│
└─ log/ ← 実行ログ
└─ backup.log
役割はこんな感じです👇
- 🗃 daily/
WordPress本体(themes / plugins / uploads 含む) - 🗄 db/
mysqldumpしたデータベース - 📝 log/
成功も失敗も、静かに残る記録
→ あとから原因をたどれる安心感
⚙️ ① 設定ファイル(config.sh)
ここだけ、環境に合わせて編集します。
#!/bin/bash
# ==============================
# WordPress Backup Config
# ==============================
# WordPress
WP_DIR="/var/www/html/wordpress"
# Backup
BACKUP_DIR="/backup"
KEEP_DAYS=7
# Database
DB_NAME="wordpress"
DB_USER="wpuser"
DB_PASS="password"
# Log
LOG_FILE="${BACKUP_DIR}/log/backup.log"
💡
git管理する場合は、config.sh を .gitignore に入れるのもおすすめです。
🔁 ② バックアップ実行(wp_backup.sh)
ここでは、
「失敗したら、ちゃんと理由をログに残す」
ことを意識しています。
#!/bin/bash
set -euo pipefail
source "$(dirname "$0")/config.sh"
# エラーハンドリング
error_exit() {
echo "[ERROR] $(date '+%Y-%m-%d %H:%M:%S') : $1" >> "${LOG_FILE}"
exit 1
}
trap 'error_exit "想定外のエラーが発生しました(line: $LINENO)"' ERR
DATE=$(date +"%Y%m%d_%H%M")
mkdir -p \
"${BACKUP_DIR}/daily" \
"${BACKUP_DIR}/db" \
"${BACKUP_DIR}/log"
echo "=== Backup start : ${DATE} ===" >> "${LOG_FILE}"
# ---- DB接続チェック ----
mysql -u"${DB_USER}" -p"${DB_PASS}" -e "SELECT 1;" "${DB_NAME}" \
>/dev/null 2>>"${LOG_FILE}" \
|| error_exit "DB接続に失敗しました"
# ---- ファイルバックアップ ----
tar -czf "${BACKUP_DIR}/daily/wp_${DATE}.tar.gz" "${WP_DIR}" \
>> "${LOG_FILE}" 2>&1 \
|| error_exit "WordPressファイルのバックアップに失敗しました"
# ---- DBバックアップ ----
mysqldump -u"${DB_USER}" -p"${DB_PASS}" "${DB_NAME}" \
2>>"${LOG_FILE}" \
| gzip > "${BACKUP_DIR}/db/db_${DATE}.sql.gz" \
|| error_exit "DBバックアップに失敗しました"
# ---- 世代管理 ----
find "${BACKUP_DIR}/daily" -type f -mtime +"${KEEP_DAYS}" -delete
find "${BACKUP_DIR}/db" -type f -mtime +"${KEEP_DAYS}" -delete
echo "=== Backup end ===" >> "${LOG_FILE}"
🌱
cronに登録する場合は、
このスクリプトだけ実行すればOKです。
🔧 ③ リストア実行(wp_restore.sh)
#!/bin/bash
set -euo pipefail
source "$(dirname "$0")/config.sh"
if [ $# -ne 2 ]; then
echo "使い方:"
echo " ./wp_restore.sh wp_YYYYMMDD_HHMM.tar.gz db_YYYYMMDD_HHMM.sql.gz"
exit 1
fi
WP_BACKUP="${BACKUP_DIR}/daily/$1"
DB_BACKUP="${BACKUP_DIR}/db/$2"
echo "=== Restore start ===" >> "${LOG_FILE}"
rm -rf "${WP_DIR}"
tar -xzf "${WP_BACKUP}" -C / \
>> "${LOG_FILE}" 2>&1
gunzip < "${DB_BACKUP}" \
| mysql -u"${DB_USER}" -p"${DB_PASS}" "${DB_NAME}" \
>> "${LOG_FILE}" 2>&1
echo "=== Restore complete ===" >> "${LOG_FILE}"
🧯
「もしもの時」に、慌てず使える
シンプルさを大切にしています。
🔑 実行権限
chmod +x config.sh wp_backup.sh wp_restore.sh
🌼 運用イメージまとめ
- 🔧 設定変更 →
config.sh - 🔁 定期実行 →
wp_backup.sh - 🧯 復旧作業 →
wp_restore.sh - 🧠 昔ながらの
「設定とロジックを分ける文化」 を大切に
🌱 ちょい進化ポイント(余裕が出たら)
.my.cnfでDBパスワード非表示- rsyncで別サーバーへ二重バックアップ
- Pythonでバックアップ状況を可視化
(農業IoTにも応用できそうです🌾)
🍃 おわりに
派手さはありませんが、
静かに、確実に守ってくれる構成です。
失敗したときも、
「なにが起きたか」がちゃんと分かる。
そんな やさしい設計を目指しました。
どなたかの安心につながれば、
とてもうれしいです^^

コメント