メインコンテンツへスキップ
  1. Posts/

パスワードを自宅サーバーで管理する──Vaultwardenをセルフホストした話

mamio
著者
mamio
まみおブログへようこそ。日々の気づきから、趣味の車中泊や少しマニアックな機材のレビューまで、好きなものを自由気ままに書き留めています。

パスワードマネージャーを使っているけど「クラウドに預けるのが少し不安」「月額がもったいない」と思ったことはないだろうか。自分はそのタイプで、ずっと気になっていたのが Vaultwarden だ。

Bitwarden互換のサーバーを自分で立てて、スマホやブラウザからいつも通り使えるというもの。今回、自宅のUbuntuサーバー(ミニPC)に構築してみたので、詰まったポイントも含めて全部書く。

なぜセルフホストしたかったのか
#

  • クラウドサービスへのパスワード丸投げに漠然とした不安があった
  • 月額数百〜千数百円のランニングコストを削りたかった
  • どうせ自宅サーバーがあるなら使わないともったいない

という3つが重なったのがきっかけ。難しそうなイメージがあったけど、実際やってみたら半日もかからなかった。

全体の構成
#

スマホ・ブラウザからCloudflare Tunnelを経由して自宅サーバーに接続する構成図

ポイントは Cloudflare Tunnel を間に挟むこと。自宅ルーターのポート開放が不要で、Cloudflareが仲介してくれるのでセキュリティ的にも安心感がある。

[スマホ / ブラウザ]
        ↓ HTTPS
[Cloudflare Tunnel]  ← ルーター設定不要
[自宅ミニPC: Vaultwarden(Docker)]
[vw-data/ ← SQLiteで永続化]

必要なもの
#

  • 自宅で常時起動しているLinuxサーバー(Docker動けばなんでも可)
  • Cloudflareアカウント(無料枠でOK)
  • 独自ドメイン(Cloudflareで管理しているもの)

構築手順
#

ターミナルでdocker composeを実行している様子

1. ディレクトリ構成を作る
#

~/vaultwarden/
├── docker-compose.yml
├── .env              ← トークンとドメインを記入
├── vw-data/          ← データ永続化
├── backups/          ← 自動バックアップ先
└── scripts/
    └── backup.sh

2. docker-compose.yml
#

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    volumes:
      - ./vw-data:/data
    environment:
      DOMAIN: "https://${VW_DOMAIN}"
      SIGNUPS_ALLOWED: "true"
      WEBSOCKET_ENABLED: "true"
    networks:
      - vw_internal

  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command: tunnel --no-autoupdate run
    environment:
      TUNNEL_TOKEN: "${CLOUDFLARE_TUNNEL_TOKEN}"
    depends_on:
      - vaultwarden
    networks:
      - vw_internal

networks:
  vw_internal:
    driver: bridge

3. Cloudflare Tunnelのトークンを取得
#

  1. Cloudflare Zero Trust → Networks → Tunnels → Create a tunnel
  2. Connector type: Cloudflared → 名前をつけて作成
  3. Docker を選択 → 表示されるコマンドからトークン(eyJhA...)をコピー

4. .envを作成して起動
#

cp .env.example .env
nano .env
# CLOUDFLARE_TUNNEL_TOKEN と VW_DOMAIN を記入

docker compose up -d

5. Cloudflareでルートを登録
#

ダッシュボード → Tunnels → Edit → ルート → ルートを作成 → 公開アプリケーション

項目
サブドメイン vw
ドメイン 所有ドメイン
サービスType HTTP
URL http://vaultwarden:80

http:// を付けないとエラーになるので注意。

セキュリティ設定
#

アカウント作成後は即座にサインアップを閉じる。これをやらないと、URLを知っている人なら誰でもアカウントを作れてしまう。

# .env
SIGNUPS_ALLOWED=false
docker compose up -d

自動バックアップ
#

シールドとサーバーのバックアップ・セキュリティイメージ

毎日午前3時にtar.gz圧縮・30日保持するスクリプトをcronで登録する。

crontab -e
# 追記
0 3 * * * /home/max268/vaultwarden/scripts/backup.sh

パスワードデータが消えたら洒落にならないので、これだけは最初にやっておくことをおすすめする。

使ってみた感想
#

ブラウザ拡張(Bitwarden公式)をそのまま使える。サーバーURLを自分のドメインに変えるだけで操作感は変わらない。スマホアプリも同様で、設定画面のサーバーURLを変えるだけでデータが移行できた。

自分のサーバーにデータがあるという安心感は思ったより大きかった。クラウドサービスの障害やサービス終了を気にせずに使えるのも地味にいい。

まとめ
#

項目 結果
構築時間 約2〜3時間
月額コスト ゼロ(ドメイン代のみ)
外部アクセス Cloudflare Tunnel経由
ルーター設定 不要
バックアップ 毎日自動(30日保持)

自宅サーバーがすでにある人には特におすすめ。Cloudflare Tunnelはポート開放なしで外部公開できるので、Vaultwarden以外のサービスにも応用できる。覚えておいて損はない構成だと思う。

関連記事