メインコンテンツへスキップ

BookStack データのバックアップ方法

🧭 はじめに

本記事では、BookStack を安全に運用するためのバックアップ方法を、 手動 → 自動(cron) という段階構成で整理する。

特に重視するポイントは以下の3点:

  • どのコマンドを実行するのか
  • 実行結果が正しいかをどう確認するか
  • どこで失敗しやすいか

について解説する。


📦 BookStackにおけるバックアップの考え方

📌 バックアップ対象の全体像

BookStackの完全バックアップには、必ず以下3点が必要

  1. データベース(記事本文・構造・履歴)
  2. アップロードファイル(画像・添付)
  3. 設定ファイル(.env)

この3点のうち1つでも欠けると、完全復旧はできない。
特に .env は再生成できないため最重要。


🧪 ① 事前確認:サイズを把握する

🗄 データベースのサイズ確認

mysql -u bookstackuser -p -e "
SELECT table_schema AS db,
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS size_mb
FROM information_schema.tables
WHERE table_schema = 'bookstackdb'
GROUP BY table_schema;
"

✔ 正常な結果例

db          size_mb
bookstackdb 43.59

数十MB程度なら極めて健全。
文章中心のBookStackでは、記事数が多くてもDBは小さくなる。


📁 uploads(添付ファイル)のサイズ確認

du -sh /var/www/BookStack/storage/uploads

✔ 正常な結果例

40K /var/www/BookStack/storage/uploads

画像・PDFを使っていなければ 数KB〜数MB が普通。


🛠 ② 手動バックアップ(初回・検証用)

🗄 データベースのバックアップ

sudo mkdir -p /var/backups/bookstack

sudo mysqldump -u bookstackuser -p bookstackdb \
  | sudo tee /var/backups/bookstack/bookstackdb_$(date +%F).sql > /dev/null

✔ 成功確認

ls -lh /var/backups/bookstack
-rw-r--r-- 1 root root 20M bookstackdb_2025-12-27.sql

ファイルが存在し、サイズが極端に小さくなければOK。

内容確認(破損チェック)

head -n 5 /var/backups/bookstack/bookstackdb_2025-12-27.sql
-- MariaDB dump ...
-- Host: localhost    Database: bookstackdb

MariaDB dump と Database 名が出ていれば正常。


📁 uploads のバックアップ

sudo tar czf /var/backups/bookstack/bookstack_uploads_$(date +%F).tar.gz \
  /var/www/BookStack/storage/uploads

✔ 確認

ls -lh /var/backups/bookstack

⚙️ .env のバックアップ(最重要)

sudo cp /var/www/BookStack/.env \
  /var/backups/bookstack/bookstack.env.$(date +%F)

.env が無いと DB があっても復旧できない。
必ずバックアップ対象に含める。


⏱ ③ cron による自動バックアップ設定

📄 バックアップスクリプト作成

sudo nano /usr/local/bin/bookstack_backup.sh
#!/bin/bash
set -e

DATE=$(date +%F)
BACKUP_DIR=/var/backups/bookstack
APP_DIR=/var/www/BookStack
DB_NAME=bookstackdb
DB_USER=bookstackuser

mkdir -p "$BACKUP_DIR"

# DB
mysqldump -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" \
  | gzip > "$BACKUP_DIR/bookstackdb_${DATE}.sql.gz"

# uploads
tar czf "$BACKUP_DIR/bookstack_uploads_${DATE}.tar.gz" \
  "$APP_DIR/storage/uploads"

# env
cp "$APP_DIR/.env" "$BACKUP_DIR/bookstack.env.${DATE}"

# 世代管理(14日)
find "$BACKUP_DIR" -type f -mtime +14 -delete
sudo chmod +x /usr/local/bin/bookstack_backup.sh

🕒 cron 登録(毎日 03:30)

sudo crontab -e
30 3 * * * DB_PASSWORD=<DBのパスワード> /usr/local/bin/bookstack_backup.sh

cron は OS のタイムゾーン依存。
date で JST か UTC かを必ず確認する。


🔍 cron 動作確認(即時)

sudo DB_PASSWORD=<DBのパスワード> /usr/local/bin/bookstack_backup.sh
ls -lh /var/backups/bookstack

.sql.gz / uploads / .env が同日付で揃えば成功。