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

# 📘 BookStack de-ta バックアップ

— 手動バックアップから cron・外部退避まで(検証付き)—


🧭 はじめに

本記事では、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 が同日付で揃えば成功。


☁️ ④ 外部媒体へのコピー(推奨)

Lightsail 内だけのバックアップは不十分。
インスタンス削除・ディスク破損には無力。

💻 ローカルPCへコピー(最小構成)

rsync -av lightsail:/var/backups/bookstack ./bookstack_backup

☁️ S3 へコピー(発展)

aws s3 sync /var/backups/bookstack s3://your-bucket/bookstack

S3 を使う場合は バージョニング暗号化 も検討すると安心。


✅ まとめ:バックアップ完了の判定基準

以下が 同一日付で揃っていれば完全バックアップ

bookstackdb_YYYY-MM-DD.sql(.gz)
bookstack_uploads_YYYY-MM-DD.tar.gz
bookstack.env.YYYY-MM-DD

この3点があれば、BookStackはいつでも完全復旧可能。


🏁 おわりに

BookStackは 文章中心で軽量・バックアップしやすい設計になっている。

だからこそ、

  • 正しく対象を理解し
  • 確認可能な形で
  • 自動化する

この3点を押さえることで、 安心して「知識を書く」ことに集中できる環境が完成する。

このマニュアルが、その土台になれば幸い。