注:筆者は韓国在住のため、本文には韓国特有の文脈が含まれることがあります。

Fly.ioという会社は、Dockerイメージさえ用意すれば、簡単にDockerイメージを特定の国などにデプロイできる機能を提供しています。

(登録完了後)fly.tomlというファイルを適切に作成し、

bash
flyctl deploy

と入力するだけで、よろしくやってくれてイメージをサーバーにアップロードしてくれ、DNS、HTTPS設定、IP発行、モニタリング(Grafana)設定などをやってくれます。

さらに、数クリックでScale-upも行えます。自分でセットアップしてもよいのですが、結構面倒な作業を多く肩代わりしてくれて便利です。

また、フリーティアでも以下のようなスペックが提供されます。

とはいえフリーティアなので、スペックはそれほど余裕があるわけではありません。 そのため、「データ管理が重要なのでクラウドサービスを利用したいが、それほど多くのコンピューティングリソースを使わない」アプリケーションの利用が向いています。

そういった用途にぴったりのパスワードマネージャー、Vaultwardenをインストールする方法を紹介します。

VaultWarden(Bitwarden互換サーバー)

Bitwardenはパスワードマネージャーで、Webブラウザ、Windows、iOS、Androidアプリなどを通じて、複数のデバイスでパスワードを共有できるようにしてくれます。

Chromeをお使いの方は、「Chromeの自動入力」機能をイメージしていただくと分かりやすいです。

Bitwardenはそれに加えてOTP機能をサポートしており、

赤いボタンを押すと、Google OTPアプリを開かなくても認証できます!

パスワードジェネレーターや、

各サイトの設定に合わせて適切なパスワードを設定できます。

Organization(組織)設定によるパスワード共有機能なども提供します。

一緒に開発をしている際に、Slack Webhook URLや環境変数、開発DBのIDおよびパスワードなどを共有する必要があるときに便利です。

それ以外にも、漏洩したDBの中に自分のパスワードと一致するものがあるか、再利用されているパスワードがあるかなどのセキュリティ監査機能や、エンドツーエンド暗号化を利用した機微なデータの送信機能であるSEND機能なども提供します。

ただ、Bitwardenはオープンソースなので、パスワードサーバーをSelf-hostingできるものの、プロダクションレベルで高可用性を確保するためには高いスペックと多くの設定が要求されます。(Bitwarden Install Docs

256MB RAMで動かすにはスペックが…

こうした問題を解決するため、Bitwarden Clientと互換性がありながらスペックを抑え、DatabaseもSQLiteを使うことで、Docker Imageひとつだけでもサーバーを起動できるVaultwarden というプロジェクトがあります。

公式サーバーが2GB RAMを要求するのに対し、こちらのサーバーはIdle状態のときに約100MBのメモリしか使わないので、Fly.ioを利用してデプロイすれば手軽に利用できます!

Vaultwardenデプロイ後にGrafanaで確認したRAM使用量

次のステップに従って、Vaultwardenサーバーをデプロイしてみましょう。

  1. Fly.io Docs(Link )に従って、ご自分のOSに合ったflyctlをインストールし、ログインまで進めます。
  2. シェルで任意のフォルダを1つ作成し(私の場合は~/flyio/vaultwardenというフォルダで作業しました)、そのフォルダへ移動します。 3 . 以下のコマンドを入力してfly.tomlという設定ファイルを作成します。このとき、app-nameはお好みに合わせて修正してください。入力時にRegionを選択するウィンドウが出るので、私は最も近いTokyo(nrt)リージョンを選択しました。
bash
flyctl launch --name app-name --image vaultwarden/server:latest --no-deploy
  1. 以下のコマンドを入力して、データを永続的に保存するためのVolumeを作成します。Volumeは、コンテナが落ちてもファイルが消えないように保存できるSSDのようなものとお考えください。アプリ名は3で設定したapp名と合わせ、Regionも同じく最も近いTokyo(nrt)リージョンを選びましょう。
bash
flyctl volumes create vaultwarden_data --size 1 --app app-name
  1. 以下のコマンドを使って、アプリケーション起動時に注入されるAdmin Token Secretsを作成します。ADMIN_TOKENは管理者ページに入るためのパスワードのようなものとお考えください。 漏洩しないよう別途のパスワードを作成し、初期セットアップのためadminページに入れるようこのSecrets値を追加します。
bash
flyctl secrets set ADMIN_TOKEN=abc123456 
  1. フォルダにあるfly.tomlファイルを、以下のファイルを参考に修正します。 既存ファイルから[env]部分、[mounts]部分、[[services]]->internal_port部分を修正すればOKです。
yml
app = "app-name"
kill_signal = "SIGINT"
kill_timeout = 5
processes = []

[env]
  ROCKET_PORT = 8080

[experimental]
  allowed_public_ports = []
  auto_rollback = true

[mounts]
  destination = "/data"
  source = "vaultwarden_data"

[[services]]
  http_checks = []
  internal_port = 8080
  processes = ["app"]
  protocol = "tcp"
  script_checks = []
  [services.concurrency]
    hard_limit = 25
    soft_limit = 20
    type = "connections"

  [[services.ports]]
    force_https = true
    handlers = ["http"]
    port = 80

  [[services.ports]]
    handlers = ["tls", "http"]
    port = 443

  [[services.tcp_checks]]
    grace_period = "1s"
    interval = "15s"
    restart_limit = 0
    timeout = "2s"
  1. 該当フォルダで以下のコマンドを実行してアプリをデプロイします。
bash
flyctl deploy
  1. デプロイ後、以下のコマンドを入力してWebページにアクセスします。その後、アカウント作成を押してアカウントの作成とマスターパスワードの作成を進めます。
bash
flyctl open
  1. (Optional) その後、以下のコマンドで管理画面に入り、上で生成したADMIN_TOKENでログインします。必要な設定があれば設定します。私の場合は新規登録を不可にし、招待機能をオフにしました。
bash
flyctl open /admin
  1. その後Bitwardenクライアントをダウンロードし、左上の矢印をクリックして、デプロイしたアプリケーションのアドレスを入力します。app-name.fly.dev、または先ほどアクセスしたWebページを入力すればOKです。

おめでとうございます! ここまで来られたら、セットアップ完了です!

これからは、なかなか便利なパスワードマネージャーをお使いいただけます。

Appendix 1. OTPはどのように追加しますか? ID/Password追加時に、以下のようなTOTP欄に

上記のようなSecret Keyを入力すればOKです。

Appendix 2. すでに使っているGoogleパスワードは使えませんか?

A. 可能です!

Googleパスワードマネージャーからパスワードをエクスポートしたあと、

Vaultwardenウェブコンソール -> ログイン -> ツール -> データのインポートを行えば、Chromeで使っていたパスワードをそのまま使えます。