ARTICLE

Vaultwarden のバックアップ復元手順を実運用ベースでまとめる

はじめに

Vaultwarden は便利ですが、壊れたときに復元できないと意味がありません。

構築自体の手順は ラズパイでVaultwardenをdocker上でホストしてパスワード管理をやってみる を参照し、この記事ではバックアップと復元に絞って解説します。

この記事では、Docker + MariaDB で運用している Vaultwarden を前提に、

  • 何をバックアップすればよいか
  • どう復元するか
  • 復元後に何を確認するか

を、実運用向けのランブックとしてまとめます。

先に結論: Vaultwarden 復元の必須対象は 2 つ

ttionya/vaultwarden-backup を使う前提なら、Vaultwarden 復元の必須対象は次の 2 つです。

  1. vaultwarden-backup が作成したバックアップ zip
  2. 環境変数(.env など)

restore サブコマンドが DB と data をまとめて復元してくれるため、Vaultwarden 専用の復元だけを考えるなら手動の DB ダンプ復元は必須ではありません。
一方で、私の環境では他サービスも同居しているため、運用上は MariaDB 全体のダンプも別途取得しています。

前提構成

  • vaultwarden コンテナ
  • mysql(MariaDB)コンテナ
  • vaultwarden-backupttionya/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_PASSWORD
  • MYSQL_VAULTWARDEN_PASS
  • DOMAIN
  • 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-backuprestore サブコマンドを使い、次の 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 ダンプリストアは不要です。

復元後チェック(必須)

  1. 管理画面/通常ログインができる
  2. 既存の保管庫アイテム数が期待値と一致
  3. 添付ファイルが開ける
  4. SMTP 通知が送れる
  5. SSO を使っている場合は SSO ログインできる

ここを確認せずに「復元完了」と判断しないのが大事です。

よくある失敗

  • .env の値が不足していて起動はするが認証で失敗
  • DB は復元できたが ./data/vaultwarden が古く添付が欠落
  • 復元後に backup ジョブが止まっている

運用のコツ

  • 月 1 回は復元テストを行う
  • バックアップファイル名は日付 + 種別で統一
  • 「取得手順」ではなく「復元手順」を優先してドキュメント化

バックアップは「あること」より、戻せること が価値です。

関連記事