Tech

【OSSでWiki構築】第10回:データ保全・バックアップ編

公開

【OSSでWiki構築】連載記事一覧
第1回
第2回:環境構築編
第3回:環境構築編 トラブルシューティング
第4回:Google OAuth編
第5回:Google OAuth編 トラブルシューティング
第6回:アクセス制御編
第7回:アクセス制御編 トラブルシューティング
第8回:日本語対応編
第9回:日本語対応編 トラブルシューティング
第10回:データ保全・バックアップ編 ※本記事


1. はじめに

この記事は、運用中のOutline Wikiのデータを保護するための「バックアップとリストア(復旧)」の手順、およびその自動化についてまとめたものです。
Docker環境におけるデータ永続化の仕組みを理解し、万が一のデータ消失時にも迅速に復旧できる体制を整えることを目的としています。

ステップ1: データ保存場所(Dockerボリューム)の特定

まず、バックアップすべき「守るべきデータ」の実体がどこにあるかを特定します。

1-1. ボリュームの確認

Dockerでは、コンテナが削除されてもデータが消えないよう、「ボリューム」という仕組みでデータを永続化しています。
以下のコマンドで、現在稼働しているボリュームの一覧を確認します。

docker volume ls

【確認結果】: outline-wiki-project_postgres_data という名前のボリュームが確認できました。ここにWikiの全データ(記事、ユーザー情報など)が格納されています。

1-2. 物理的な保存場所の確認

以下のコマンドで、ボリュームの実体がPC上のどこにあるかを確認します。

docker volume inspect outline-wiki-project_postgres_data

【確認結果】: "Mountpoint": "/var/lib/docker/volumes/..." というパスが確認できました。このディレクトリ内のデータを守ることが、バックアップの核心です。

ステップ2: 手動バックアップとリストア(破壊と再生の検証)

実際にデータを退避(バックアップ)し、意図的に環境を破壊した後、元通りに復旧できるかを検証しました。

2-1. バックアップ(データの書き出し)

稼働中のデータベースコンテナから、全データをSQLファイルとして書き出します。

docker exec -t outline-wiki-project-db-1 pg_dumpall -c -U outline > dump.sql

【コマンドの解説】

  • docker exec ...: 稼働中のコンテナ(db-1)の中でコマンドを実行せよ。
  • pg_dumpall: PostgreSQLの全データをダンプ(書き出し)せよ。
  • c: データを復元する前に、既存のデータベースをクリア(Clean)する命令を含めよ。
  • U outline: ユーザー名 outline として実行せよ。
  • > dump.sql: 出てきたデータを dump.sql というファイルに保存せよ。

2-2. 破壊(データの消去)

バックアップが取れたことを確認した後、コンテナとボリュームを削除し、データを完全に消去しました。

docker compose down --volumes

以下のコマンドで、データ保管庫(ボリューム)が実際に消去されたかを確認します。

docker volume ls

【検証結果】:

  1. docker volume ls のリストから outline-wiki-project_postgres_data が消えていることを確認しました。
  2. ブラウザでアクセスすると、Wikiが初期化状態(ようこそ画面)に戻っていることを確認しました。

2-3. リストア(データの復旧)

空っぽの状態のデータベースに、バックアップファイルを流し込みます。

  1. データベースコンテナだけを先に起動します(アプリからの干渉を防ぐため)。 docker compose up -d db
  2. データを流し込みます。 cat dump.sql | docker exec -i outline-wiki-project-db-1 psql -U outline
  3. 全てのコンテナを起動します。 docker compose up -d

【検証結果】: 復旧後、消えたはずのコレクションや記事データが完全に元通りになっていることを確認しました。

ステップ3: バックアップの自動化(スクリプト化)

手動での手順をワンクリックで実行できるよう、シェルスクリプトを作成しました。

3-1. backup.sh の作成

プロジェクトフォルダ内に以下のスクリプトを作成し、実行権限(chmod +x backup.sh)を付与しました。

#!/bin/bash
BACKUP_DIR="./backups"
DATE=$(date +"%Y%m%d_%H%M%S")
FILENAME="outline_backup_$DATE.sql"

mkdir -p $BACKUP_DIR
echo "Starting backup: $FILENAME ..."
docker exec -t outline-wiki-project-db-1 pg_dumpall -c -U outline > "$BACKUP_DIR/$FILENAME"
echo "Backup completed successfully!"

【検証結果】: ./backup.sh を実行するだけで、backupsフォルダ内に日付入りのバックアップファイルが自動生成されることを確認しました。

3-2. 定期実行の自動化(Cronの設定)

※本項目は設計上の手順であり、実機での長期稼働確認は行っていませんが、Linux/Unix系システムの標準的な機能を利用するため、以下の設定で動作すると推測されます。

毎日決まった時間にバックアップを自動実行するために、cron(クーロン)を利用します。

  1. crontab -e コマンドでスケジュール設定を開きます。
  2. 以下のように記述することで、毎日深夜3時にバックアップが実行されるはずです。 # 毎日深夜3:00に実行(パスは環境に合わせて変更) 0 3 * * * /Users/username/path/to/outline-project/backup.sh

まとめ

Dockerボリュームの仕組みを理解し、バックアップとリストアの実践を通じて、データ消失リスクへの具体的な対抗策を確立しました。また、スクリプト化により運用コストを最小限に抑える仕組みも整いました。


前の記事:第9回:日本語対応編 トラブルシューティング
次の記事:準備中

【OSSでWiki構築】連載記事一覧
第1回
第2回:環境構築編
第3回:環境構築編 トラブルシューティング
第4回:Google OAuth編
第5回:Google OAuth編 トラブルシューティング
第6回:アクセス制御編
第7回:アクセス制御編 トラブルシューティング
第8回:日本語対応編
第9回:日本語対応編 トラブルシューティング
第10回:データ保全・バックアップ編 ※本記事