🌱やまとトロー流 WordPressをやさしく守る シンプルなバックアップ&リストア設計(Shell編)

こんにちは、やまとトローです^^

今日は、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にも応用できそうです🌾)

🍃 おわりに

派手さはありませんが、
静かに、確実に守ってくれる構成です。

失敗したときも、
「なにが起きたか」がちゃんと分かる。

そんな やさしい設計を目指しました。

どなたかの安心につながれば、
とてもうれしいです^^

よかったらシェアしてね!

コメント

コメントする

目次