如何通过 Docker 部署 vaultwarden(bitwarden_rs)密码管理器

安装 docker & compose

安装 docker:

1
curl -fsSL https://get.docker.com | sh

安装 docker-compose:

1
2
3
4
5
# 下载可执行文件
curl -L "https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/bin/docker-compose

# 赋予执行权限:
chmod +x /usr/bin/docker-compose

拉取并配置 Vaultwarden

选择一个目标目录,然后创建 docker-compose.yml 文件,并将以下内容写入文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
version: "3.9"
services:
  bitwarden:
    image:  vaultwarden/server:latest
    container_name: bitwardenrs
    restart: always
    ports:
        - "127.0.0.1:8882:80"
    volumes:
      - /opt/data:/data
    environment:
      WEBSOCKET_ENABLED: "true"
      SIGNUPS_ALLOWED: "true"
      WEB_VAULT_ENABLED: "true"
  • restart: always 表示主机重启或者程序崩溃后,自动重启服务,这个很重要;
  • “127.0.0.1:8882:80” 表示将主服务的地址映射到本地的 8882 端口;
  • SIGNUPS_ALLOWED:是否允许注册新用户,先设置为允许,等注册完成后再按需关闭;
  • WEB_VAULT_ENABLED:是否允许 Web 页面访问,我们需要通过 Web 端注册账户,先设置为开启,后续按需关闭。

保存后,运行 docker-compose up -d 命令以拉取镜像并部署应用。完成部署后,执行 netstat -lntp 命令。如果该命令显示 8882 端口上正在运行 docker-proxy 服务,则说明应用已经成功启动:

1
tcp   0  0 127.0.0.1:8882  0.0.0.0:*   LISTEN   757/docker-proxy
2024 年更新记录

最新的 vaultwarden 取消了单独的通知端口,因此删除了 3012 端口映射:

1
2
3
4
     ports:
         - "127.0.0.1:8882:80"
-        - "127.0.0.1:3012:3012"
     volumes:

通过 acme.sh 配置证书

这里我们使用 acme.sh 快速生成 Let’s Encrypt 证书,并通过 cron 自动实现续签。

首先,安装 acme.sh,并将证书签发机构设置为 Let’s Encrypt:

1
2
3
4
5
6
# 安装 acme.sh
curl https://get.acme.sh | sh
# 安装 socat 小型 Http 服务,这里给出 Debian 系的安装命令,其他系统请自行查阅
apt install socat
# 设定签发机构(这里是通过 root 用户安装的,请根据自己情况选择路径)
/root/.acme.sh/acme.sh --set-default-ca --server letsencrypt

然后执行以下命令签发证书:

1
2
3
4
5
6
7
/root/.acme.sh/acme.sh --cron --home "/root/.acme.sh" &> /dev/null

# 签发证书
/root/.acme.sh/acme.sh --issue --insecure -d "${domain}" --standalone -k ec-256 --force; 

# 将证书安装到目标目录
/root/.acme.sh/acme.sh --installcert -d "${domain}" --fullchainpath /${path-to}/ca.crt --keypath /${path-to}/ca.key --ecc --force;
  • 请注意,将 ${path-to} 替换为您自己生成证书的路径;
  • 请注意,将 ${domain} 替换为您自己的域名。

在证书安装成功后,我们可以配置 cron 以实现自动续签。这里,我们可以创建一个名为 ssl_update.sh 的 shell 脚本,内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/usr/bin/env bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

systemctl stop nginx &> /dev/null
sleep 1
"/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" &> /dev/null
"/root/.acme.sh"/acme.sh --installcert -d "${domain}" --fullchainpath /${path-to}/ca.crt --keypath /${path-to}/ca.key --ecc
sleep 1
systemctl start nginx &> /dev/null
  • 请注意,将 ${path-to} 替换为您自己生成证书的路径;
  • 请注意,将 ${domain} 替换为您自己的域名;
  • 警告
    该脚本中通过 systemctl 控制启停 Nginx,是因为它占用了 80 端口,原因上文说过了。如果您的其他进程占用 80 端口而非 Nginx,需要将这里改为启停您自己的服务。

接下来,执行 crontab -e 命令,并为上述脚本设置定时运行任务:

1
0 3 * * 0 bash /${path-to}/ssl_update.sh
  • 请注意,将 ${path-to} 替换为您自己的脚本路径;

至此,域名的证书就配置完成了。

配置 Nginx 反向代理

创建 Vaultwarden 的 Nginx 配置文件,并在 server{} 块中添加以下内容:

首先,设置监听端口,并配置域名与 SSL,然后再设置 Vaultwarden 和通知模块的反向代理。完整配置如下:

需要 nginx 版本为 v1.29.0+

 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
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      "";
}
server{
    # 监听端口设置
    listen 443 ssl http2;
    # 证书设置
    ssl_certificate       /${path-to}/ca.crt;
    ssl_certificate_key   /${path-to}/ca.key;
    ssl_protocols         TLSv1.3;
    ssl_ciphers           TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    # 监听域名设置
    server_name ${domain};

    # 反向代理配置
    location / {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        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://127.0.0.1:8882/;
    }
}
  • 请注意,将 ${path-to} 替换为您上文配置的证书路径;
  • 请注意,将 ${domain} 替换为您自己的域名。

最后,保存配置文件并重启 Nginx。

2024 年更新记录

最新的 vaultwarden 取消了单独的通知端口,需要删除通知路径,同时为根目录配置 websocket:

1
2
3
4
5
+map $http_upgrade $connection_upgrade {
+    default upgrade;
+    ''      "";
+}
 server{
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
     location / {
+        proxy_http_version 1.1;
+        proxy_set_header Upgrade $http_upgrade;
+        proxy_set_header Connection $connection_upgrade;  
+        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_set_header Host $http_host;
+        proxy_set_header X-Forwarded-Proto $scheme;       
         proxy_pass http://127.0.0.1:8882/;
     }
-    location /notifications/hub {
-        proxy_pass http://127.0.0.1:3012;
-        proxy_set_header Upgrade $http_upgrade;
-        proxy_set_header Connection "upgrade";
-    }
-    location /notifications/hub/negotiate {
-        proxy_pass http://127.0.0.1:8882;
-    }
 }

注册并使用

打开浏览器,访问我们之前设置的域名,然后注册账号并登录,这样我们就可以使用自建的 Web 应用了:

Vaultwarden
Vaultwarden Login

Vaultwarden 私服支持对接 Bitwarden 官方的客户端。为了使该服务更具可用性,我们建议使用 Bitwarden 官方的浏览器插件和移动应用程序来连接我们自建的服务。这里以浏览器插件的配置为例:

bitwarden-client

下载并安装浏览器插件后,点击左上角的齿轮图标,然后在“自定义环境”一栏中输入之前配置的域名。完成输入后,点击保存并成功登录账户,就能畅快使用了。

写在最后

作为一位资深的 1Password 用户,我曾经被它精美的用户界面所吸引,同时也因为它支持丰富的密码种类而一直坚持使用。

1Password-UI

然而,随着成家的压力越来越大,开源节流已经成为了我的生活首要任务,再精美的 UI 也得被迫放弃了,因此这里截个图留个念。

0%