Vaultwarden運用まとめ: GCP/Terraform/Tailscale/GitHub Actionsで宣言的に管理する構成
パスワードマネージャーを自前ホストするなら、Bitwarden 互換の軽量サーバー実装である Vaultwarden が定番の選択肢だ。ただ、動かすだけなら Docker Compose 一発で済むところを、ぼくのプロジェクトでは GCP + Terraform + GitHub Actions + Tailscale を組み合わせて、それなりに作り込んだ運用基盤にしている。 意識したことはいくつかあり、主には可用性・信頼性・セキュリティだ。Vaultwarden の /admin パネルは「招待リンクを見る」以外の用途では触らない。 サインアップ制限、2段階認証の許可手段、SMTP、管理パネルそのものの保護方式まで、設定はすべて環境変数・Terraform・GitHub Actions のどこかに書いてあり、git の差分として残る。この記事ではその全体像を、インフラ層 → コンテナ設定 → ネットワーク境界 → デプロイパイプライン → バックアップの順に紹介する。 全体構成 flowchart TD GHA["GitHub Actions<br/>(WIF, 承認ゲート付き)"] -->|IAPトンネル経由でデプロイ| Caddy subgraph VM["GCP e2-micro VM (asia-northeast1)"] Caddy["Caddy<br/>:80 / :443"] VW["Vaultwarden<br/>(docker internal)"] TSServe["tailscale serve<br/>tailnet経由の /admin"] Disk[("Persistent Disk<br/>SQLite / 添付 / 鍵")] Timer["systemd timer"] Caddy -->|reverse_proxy| VW Caddy -->|":8080 (127.0.0.1のみ)"| TSServe VW -.->|データ永続化| Disk Timer -->|毎日rsync| NAS end NAS[("自宅 Synology NAS")] 1. インフラ: GCPに最安構成で、しかし守るべき所は守る Terraform でプロビジョニングしているのは以下の通り(terraform/main/)。 ...