跳至正文
首页 » 使用 Docker 搭建 Bitwarden 私有化密码库

使用 Docker 搭建 Bitwarden 私有化密码库

为保障账户,防止个别网站数据泄露后其他账户遭到撞库,推荐每个账户使用不同的密码,并且大量使用随机密码。但这样大量不同的账户密码很难记,我之前使用 Nexcloud 中的 Password 插件进行记录。最近插件引用的网址过期很久也没有更新,这让我对其后续维护产生了担心,而且在 Nextcloud 中复用过多功能也增加维护风险,遂找到 Bitwarden 作为替代。

Bitwarden 提供了安装脚本可以很方便的实现证书申请、服务部署的工作。本文使用 Bitwarden 的第三方替代 vaultwarden,他兼容官方服务接口,使用 Rust 重写。相较于原版,Vaultwarden 效率更高,占用内存更小,同时将各个服务集成在一个容器内,部署和维护更新更加方便。Vaultwarden 更新频率很高,与 Bitwarden 官方客户端兼容良好。

容器配置

首先下载最新版本 Bitwarden,将其中 version_number 替换为最新的版本号,可以参照 Releases

docker pull vaultwarden/server:latest
docker run -d --name vaultwarden -v /app/vaultwarden/:/data/ -p 8900:80 vaultwarden/server:latest

这里使用 Nginx 反向代理的方案,所以将部署在 8900 端口。数据本地保存在 /app/vaultwarden,方便后续备份和迁移。

此时已经可以通过 <host-ip>:8900 访问服务了,但是无法注册用户。

Nginx 反向代理

Bitwarden 要求使用 https 访问,这需要拥有一个域名。在域名解析服务中增加记录,将域名指向服务器。

将下面文件保存为 /etc/nginx/sites-available/vault,其中 vaultwarden.example.tld 替换为实际域名。

# 'upstream' 指令确保你有一个 http/1.1 连接
# 这里启用了 keepalive 选项并拥有更好的性能
#
# 此处定义服务器的 IP 和端口。
upstream vaultwarden-default {
  zone vaultwarden-default 64k;
  server 127.0.0.1:8900;
  keepalive 2;
}

# 要支持 websocket 连接的话才需要
# 参阅:https://nginx.org/en/docs/http/websocket.html
# 我们不发送上述链接中所说的 "close",而是发送一个空值。
# 否则所有的 keepalive 连接都将无法工作。
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      "";
}

# 将 HTTP 重定向到 HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name vaultwarden.example.tld;

    if ($host = vaultwarden.example.tld) {
        return 301 https://$host$request_uri;
    }
    return 404;
}

server {
    # 对于旧版本的 nginx,在 ssl 后面的 listen 行中加入 http2,并移除 'http2 on;'。
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name vaultwarden.example.tld;

    # 根据需要指定 SSL 配置
    #ssl_certificate /path/to/certificate/letsencrypt/live/vaultwarden.example.tld/fullchain.pem;
    #ssl_certificate_key /path/to/certificate/letsencrypt/live/vaultwarden.example.tld/privkey.pem;
    #ssl_trusted_certificate /path/to/certificate/letsencrypt/live/vaultwarden.example.tld/fullchain.pem;

    client_max_body_size 525M;

    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://vaultwarden-default;
    }

    # 除了 ADMIN_TOKEN 之外,还可以选择添加额外的身份验证
    # 删除下面的 '#' 注释并创建 htpasswd_file 以使其处于活动状态
    #
    #location /admin {
    #  # 参阅:https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/
    #  auth_basic "Private";
    #  auth_basic_user_file /path/to/htpasswd_file;
    #
    #  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://vaultwarden-default;
    #}
}

编辑完配置文件后,在 sites-enabled 中建立链接并重启 Nginx 服务,使配置生效。

sudo ln -s  /etc/nginx/sites-available/onlyoffice /etc/nginx/sites-enabled/onlyoffice
sudo service nginx restart

此时访问域名即可正常使用服务了。

参考

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注