それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

vaultwardenを起動して使う。( bitwarden互換サーバー)

Bitwarden互換サーバー vaultwarden

昔は、bitwarden_rs という名前だったらしい。

bitwardenのセルフホストのDockerはMSSQLだとかDotNetが含まれていて、とてもヘビィ級なセットで、バックアップも大変だったので、軽量だったらいいなと思ってた。

Rustで書き直しされた互換サーバー vaultwardenがあった。

docker-compose.yml

version: '3'

services:
  bitwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    ports:
      - '127.0.0.1:11080:80'
      - '127.0.0.1:11081:3012'
    volumes:
      - /var/www/virtualhosts/vw.example.com/vaultwarden/vw-data:/data
    restart: unless-stopped
    environment:
      TZ: Asia/Tokyo
      DOMAIN: https://vw.example.co/
      WEBSOCKET_ENABLED: 'true'
      ADMIN_TOKEN: ___XXXX__
      SMTP_HOST: smtp.example.com.tld
      SMTP_FROM: vaultwarden@example.tld
      SMTP_PORT: 465
      SMTP_SSL: 'false'
      SMTP_EXPLICIT_TLS: 'true'
      SMTP_USERNAME: service@example.tld
      SMTP_PASSWORD: __pass__

nginx でリバプロ

nginx でリバプロしてあげれば快適

# vim: ft=nginx ts=2 sw=2 sts=2


upstream vaultwarden-default {
  zone vaultwarden-default 64k;
  server 127.0.0.1:11080;
  keepalive 2;
}
upstream vaultwarden-ws {
  zone vaultwarden-ws 64k;
  server 127.0.0.1:11081;
  keepalive 2;
}

server {

  server_name  vw.example.com;


  listen 443 ssl http2;
  ssl_certificate_key /etc/letsencrypt/live/$server_name/privkey.pem;
  ssl_certificate /etc/letsencrypt/live/$server_name/fullchain.pem;

  if ($scheme = http) {
    return 301 https://$server_name$request_uri;
  }

  location = /robots.txt { return 200 "User-agent: *\nDisallow: /\n"; }
  add_header  X-Robots-Tag "noindex, nofollow, nosnippet, noarchive";

  root /var/www/virtualhosts/$http_host/public;
  client_max_body_size 128M;

  add_header  X-Robots-Tag "noindex, nofollow, nosnippet, noarchive";
  location / {
    proxy_http_version 1.1;
    proxy_set_header "Connection" "";
    proxy_set_header Host $http_host;
    proxy_set_header Forwarded $remote_addr;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For   $remote_addr;
    proxy_set_header X-Forwarded-Host  $server_name;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass http://vaultwarden-default;
  }
  location /notifications/hub/negotiate {
    proxy_http_version 1.1;
    proxy_set_header "Connection" "";

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    proxy_pass http://vaultwarden-default;
  }
  location /notifications/hub {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Forwarded $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host  $server_name;
    proxy_set_header X-Forwarded-Proto $scheme;

    proxy_pass http://vaultwarden-ws;
  }
}

ちょっとカスタマイズ。

起動と終了と環境変数を使ってカスタマイズを掛けた

├── docker
│   ├── docker-compose.tmpl
│   ├── docker-compose.yml
│   └── envs
├── vaultwarden.sh

環境変数

設定の環境変数と、起動の環境変数を分けて、ファイルに保存するように書き換えた。 docker-compose の起動をするときによくやるあれデスね。

docker/envs

ROCKET_WORKERS=8
WEBSOCKET_ENABLED=true
TZ=$TZ
WEBSOCKET_ENABLED='true'
ADMIN_TOKEN=___SECRET___
SMTP_HOST=smtp.example.com
SMTP_FROM=vaultwarden@example.com
SMTP_PORT=465
SMTP_SSL='false'
SMTP_EXPLICIT_TLS='true'
SMTP_USERNAME=service@example.com
SMTP_PASSWORD=__pass__
docker-compose.tmpl
version: '3'

services:
  bitwarden:
    image: ${IMAGE}
    container_name: ${NAME}
    ports:
      - '${PORT_PUBLISH_HTTP}:80'
      - '${PORT_PUBLISH_WEBSOCKET}:3012'
    volumes:
      - '${VOLUME}:/data'
    restart: unless-stopped
    env_file: $ENV_FILE

vaultwarden.sh 起動&更新用スクリプト

#!/usr/bin/env bash
## : vim

cd $( dirname $( realpath $0 ) )
DIR=$(pwd)
IMAGE=vaultwarden/server:latest
NAME=vaultwarden
base_dir=$DIR
data_dir=$DIR/vw-data
PORT_PUBLISH_HTTP=334334
PORT_PUBLISH_WEBSOCKET=334335
## ENV
ENV_FILE=$base_dir/docker/envs
## vol
VOLUME=$data_dir


function stop(){
  cd $DIR/docker
  docker-compose down
}
function build(){
  cd $DIR/docker
  export PORT_PUBLISH_WEBSOCKET
  export ENV_FILE
  export PORT_PUBLISH_HTTP
  export VOLUME
  export IMAGE
  export NAME
  cat docker-compose.tmpl | envsubst | tee docker-compose.yml > /dev/null
  docker-compose pull
}
function start(){
  cd $DIR/docker
  docker-compose up -d
}

function main(){
  echo $1
  case $1 in
    build*)
      build;
      ;;
    stop*)
      stop;
      ;;
    start|*)
      stop
      build
      start
      ;;
  esac

}

軽量互換サーバーの良さ。

Rustで書き直しされていて、とても軽量だし設定もシンプルでいい。

互換サーバーなので全機能が開放されていてちょっと素敵。個人で使うにはこっちのほうが管理が楽だし。いいかも

ただし、本家の正統bitwardenにあるような定期的なバックアップとか全然ないから注意。

バックアップ

sqliteをバックアップとっておけばだいたい片付きそう。

めちゃくちゃ楽ちんなのかも。

データ移行

バックエンドのSQLサーバーが変わるので、データ移行はできない。

いったんエクスポートして、新サーバーで同名アカウントを作ってインポートし直す。