はじめに
Vaultwarden は便利ですが、壊れたときに復元できないと意味がありません。
構築自体の手順は ラズパイでVaultwardenをdocker上でホストしてパスワード管理をやってみる を参照し、この記事ではバックアップと復元に絞って解説します。
この記事では、Docker + MariaDB で運用している Vaultwarden を前提に、
- 何をバックアップすればよいか
- どう復元するか
- 復元後に何を確認するか
を、実運用向けのランブックとしてまとめます。
先に結論: Vaultwarden 復元の必須対象は 2 つ
ttionya/vaultwarden-backup を使う前提なら、Vaultwarden 復元の必須対象は次の 2 つです。
vaultwarden-backupが作成したバックアップ zip- 環境変数(
.envなど)
restore サブコマンドが DB と data をまとめて復元してくれるため、Vaultwarden 専用の復元だけを考えるなら手動の DB ダンプ復元は必須ではありません。
一方で、私の環境では他サービスも同居しているため、運用上は MariaDB 全体のダンプも別途取得しています。
前提構成
vaultwardenコンテナmysql(MariaDB)コンテナvaultwarden-backup(ttionya/vaultwarden-backup)rcloneでクラウドへ退避
例として以下のような構成を想定します。
services:
mysql:
image: mariadb:latest
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: vaultwarden
MYSQL_USER: vaultwarden
MYSQL_PASSWORD: ${MYSQL_VAULTWARDEN_PASS}
vaultwarden:
image: vaultwarden/server:1.35.0
environment:
DOMAIN: https://vault.example.com
DATABASE_URL: mysql://vaultwarden:${MYSQL_VAULTWARDEN_PASS}@mysql/vaultwarden
SIGNUPS_ALLOWED: "false"
volumes:
- ./data/vaultwarden:/data
vaultwarden-backup:
image: ttionya/vaultwarden-backup:latest
environment:
DB_TYPE: mysql
MYSQL_HOST: mysql
MYSQL_PASSWORD: ${MYSQL_VAULTWARDEN_PASS}
CRON: "0 * * * *"
volumes:
- ./data/vaultwarden:/bitwarden/data
- ./data/vaultwarden-rclone-data:/config
バックアップの取り方
1. Vaultwarden バックアップ zip を定期作成
vaultwarden-backup コンテナの CRON で zip を作成し、rclone 経由でクラウドへ退避します。
2. クラウドへ二次退避(rclone)
rclone copy ./data/vaultwarden-rclone-data gdrive:vaultwarden-rclone-data
運用では、ローカル保存だけで終わらせず、別障害ドメイン(クラウド)へ退避しておくのが安全です。
3. (任意)MariaDB 全体ダンプを取得
Vaultwarden 復元だけなら不要ですが、他サービス同居環境では保険として有効です。
docker exec mysql mariadb-dump --all-databases -u root > ./data/db_backup/backup$(date +%F).sql
rclone copy ./data/db_backup gdrive:db_backup
復元手順(ランブック)
ここからが本番です。必ずテスト環境で一度検証してから本番適用してください。
参考: ローカル運用スクリプト(
scripts/vaultwarden-restore.sh)
手順 1. 復元対象ファイルを取得
rclone copy gdrive:vaultwarden-rclone-data ./data/vaultwarden-rclone-data --progress
手順 2. 必要な環境変数を復元
MYSQL_ROOT_PASSWORDMYSQL_VAULTWARDEN_PASSDOMAIN- SMTP/SSO など運用に必要な値
.env が再現できていないと、DB 接続やログイン周りで失敗します。
手順 3. Vaultwarden / MySQL を起動
docker compose up -d mysql vaultwarden
必要なら vaultwarden-backup も起動します。
docker compose up -d vaultwarden-backup
ttionya/vaultwarden-backup を使った restore(実運用準拠)
私の環境では ttionya/vaultwarden-backup の restore サブコマンドを使い、次の 2 ステップで復元しています。
1. バックアップ zip をクラウドから取得
docker run --rm -it \
-v "$DATA_DIR":/bitwarden/data/ \
-v "$CONFIG_DIR":/config/ \
-v "$WORK_DIR":/tmp \
ttionya/vaultwarden-backup:latest \
rclone copy BitwardenBackup:BitwardenBackup/"$BACKUP_FILE" /tmp
2. restore で DB + data を復元
docker run --rm -it \
-v "$DATA_DIR":/bitwarden/data/ \
-v "$CONFIG_DIR":/config/ \
-v "$WORK_DIR":/bitwarden/restore/ \
--net=app_default \
-e DB_TYPE=mysql \
-e MYSQL_HOST=mysql \
-e MYSQL_PASSWORD="${MYSQL_VAULTWARDEN_PASS}" \
ttionya/vaultwarden-backup:latest restore \
--zip-file "/bitwarden/restore/$BACKUP_FILE"
restore が DB と data を復元するため、Vaultwarden 専用の復元では追加の DB ダンプリストアは不要です。
復元後チェック(必須)
- 管理画面/通常ログインができる
- 既存の保管庫アイテム数が期待値と一致
- 添付ファイルが開ける
- SMTP 通知が送れる
- SSO を使っている場合は SSO ログインできる
ここを確認せずに「復元完了」と判断しないのが大事です。
よくある失敗
.envの値が不足していて起動はするが認証で失敗- DB は復元できたが
./data/vaultwardenが古く添付が欠落 - 復元後に backup ジョブが止まっている
運用のコツ
- 月 1 回は復元テストを行う
- バックアップファイル名は日付 + 種別で統一
- 「取得手順」ではなく「復元手順」を優先してドキュメント化
バックアップは「あること」より、戻せること が価値です。