利用docker自建bitwarden(vaultwarden)

互联网时代密码的重要程度应该不需要赘述了吧。几年前,最初听说有种软件专门用来做密码管的时候,第一个蹦出来的概念是,为啥需要这种玩意儿?

是时候祭出xkcd经典图啦!

password_strength_https://xkcd.com/936/

使用windows下的docker

配合wsl2下的ubuntu使用,并在docker选项中的distro选中安装的ubuntu。

要在ubuntu命令行里docker compose up -d启动。

主要是vwdata位置的写法比较特别,详见下文。

使用openwrt下的docker

也是在命令行中docker compose up -d启动。使用esir-lean的固件,已经内置了docker-compose了,非常方便。

docker-compose.yml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
version: '3'

services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: always
environment:
- WEBSOCKET_ENABLED=true # Enable WebSocket notifications.
- VIRTUAL_HOST=xx.abc.com
volumes:
#- vwdata:/data #linux下
- /mnt/c/Users/xxx/vwdata:/data #windows-wsl2-docker下

nginx-proxy:
image: jwilder/nginx-proxy
restart: always
ports:
- 80:80
- 443:443
environment:
- HSTS=off
volumes:
- certs:/etc/nginx/certs:ro
- vhost.d:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro
depends_on:
- vaultwarden
volumes:
vwdata:
certs:
vhost.d:
html:

docker compose up -d

卷名的形成

后生成的vloumes,将以docker-compose.yml所在的文件夹命名,比如所在文件夹名字为vaultwarden,那么生成的volumes就会是vaultwarden_certs等等。转移yml文件位置后,要确保文件夹的名称不变。

vwdata 储存bitwarden中的各站点数据

certs 储存nginx证书

vhost.d 储存站点nginx配置

vhost文件的写法(解决/notifications/hub should be proxied to the websocket server问题)

每个app下environment中的VIRTUAL_HOST赋予了这个app域名

nginx config 中的访问地址应为http://容器名:端口

在vhost.d文件夹下建立xx.abc.com的同名文件,在其中加入:

old version:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
client_max_body_size 128M;

#location / {
# proxy_pass http://vaultwarden:80;
# 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;
#}

location /notifications/hub {
proxy_pass http://vaultwarden:3012;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

location /notifications/hub/negotiate {
proxy_pass http://vaultwarden:80;
}

我注释掉了官方写法其中的一部分,不改会报错,根路径本来就会转发向80端口吧。。。

When your container exposes only one port, nginx-proxy will default to this port, else to port 80.

new version:

新版的官方转发规则用了upstream的写法,比较麻烦,懒得研究相应的docker-nginx的写法了,期待大神补充

ref:

Home · nginx-proxy/nginx-proxy Wiki (github.com)

Old version of nginx proxy example · dani-garcia/vaultwarden Wiki (github.com)

new version of nginx proxy example · dani-garcia/vaultwarden Wiki (github.com)

Enabling WebSocket notifications

Docker Nginx Proxy: how to route traffic to different container using path and not hostname - Stack Overflow