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サーバーが変わるので、データ移行はできない。
いったんエクスポートして、新サーバーで同名アカウントを作ってインポートし直す。