使用 Docker 部署 Bitwarden 第三方开源后端 vaultwarden

注意
本文最后更新于 2022-01-10,文中内容可能已过时。

最近无聊, 搞搞密码管理器, 在自己的服务器上存密码. (好像还是第一次使用 Docker)

Bitwarden 是一个开源的密码管理器, 而 vaultwarden 是一个调用 Bitwarden API 实现的第三方服务端, 据说能够使用 Bitwarden 的付费内容, 而且资源占用更少.

为了方便, 这里使用 Docker 部署 vaultwarden.

一般来说都能够安装 Docker, 装不了升级一下内核(或者砸了服务器重买一个).

yum -y install docker-ce

直接用 root 比较方便, 因为 docker 运行也需要 root 权限组.

docker version

检查是否安装成功.

Docker compose 是一个运行多个 Docker 容器的工具, 非常方便.

在 release 里下载对应的二进制文件, 然后拷贝到任意一个 bin 目录下, 给可执行权限就行了.

docker-compose version

检查是否安装成功.

在某个目录下新建文件 docker-compose.yml, 输入以下内容:

version: '3'
services:
vaultwarden:
	image: vaultwarden/server:latest
	restart: always
	ports:
	+ "3080:80"
	+ "3012:3012"
	environment:
	DOMAIN: 'https://bitwarden.example.com/'
	SIGNUPS_ALLOWED: 'true'
	WEBSOCKET_ENABLED: 'true'
	volumes:
	+ ./data:/data

解释一下, image 是镜像名, 后面指定版本, ports 是本机和 docker 的端口映射, 这里表示将 docker 的 80 端口映射到本机的 3080 端口, 将 docker 的 3012 端口映射到本机的 3012 端口(3012 是 Bitwarden 的 websocket 默认端口). 环境里的 WEBSOCKET_ENABLED 是设置启用 ws. DOMAIN 是部署的域名(可以通过这个域名访问网页端, 这个域名也是各个客户端链接到服务器的凭证). SIGNUPS_ALLOWED 是允许注册(相当于服务器部署后, 可以注册多个帐号, 每个帐号都可以保存各自的数据, 所以先要开放注册, 自己一个人用的话注册完了以后就可以关了). volumes 是将 docker 中的 /data 目录实际存储在 ./data (当前目录下的 data 文件夹).

然后启动容器, 在 docker-compose.yml 所在目录运行命令:

docker-compose up -d

Bitwarden 是存密码等重要信息的, 所以需要 SSL. 先给域名搞一个证书, 然后添加 Nginx 配置如下:

 Define the server IP and ports here.
upstream bitwardenrs-default { server 127.0.0.1:3080; }
upstream bitwardenrs-ws { server 127.0.0.1:3012; } 

 Redirect HTTP to HTTPS
server {
	listen 80;
	server_name bitwarden.example.com;
	return 301 https://$host$request_uri;
} 

server {
	listen 443 ssl http2;
	server_name bitwarden.example.com;

	 SSL
	ssl_certificate /etc/ssl/fullchain.pem;
	ssl_certificate_key /etc/ssl/privkey.pem;
	ssl_trusted_certificate /etc/ssl/chain.pem;

	client_max_body_size 128M;

	location / {
	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://bitwardenrs-default;
	}

	location /notifications/hub/negotiate {
	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://bitwardenrs-default;
	}

	location /notifications/hub {
	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header Connection $http_connection;
	proxy_set_header X-Real-IP $remote_addr;

	proxy_pass http://bitwardenrs-ws;
	}
}

把证书和服务器名称换一下就行了, 如果映射的端口不一样的话也记得换一下.


然后访问 bitwarden.example.com 就可以注册了使用了.