什么是Vaultwarden

Vaultwarden是一个用Rust编写的Bitwarden服务器API的替代实现,兼容上游Bitwarden客户端,适合配置较低的机器自托管部署。

准备工作

  1. 一个域名
  2. 一台用于搭建Vaultwarden的主机,本文仅演示macOS系统,但配置HTTPS的内容是通用的。

安装Docker

我使用OrbStack管理Docker容器,因此使用homebrew安装:

brew install --cask orbstack

在启动台中找到软件并启动,进行初始化设置。

安装Vaultwarden

新建~/vaultwarden目录,用于存放compose.yml以及Vaultwarden产生的数据。

mkdir -p ~/vaultwarden && cd ~/vaultwarden

随后创建compose.yml

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: always
    environment:
      DOMAIN: "https://[your-domain]:8443/"
      SIGNUPS_ALLOWED: "true"
    volumes:
      - ./data:/data
    ports:
      - 11001:80

注意替换[your-domain]的内容,11001端口也可以替换为其他端口。(这里我添加了:8443是因为后文Nginx监听了8443端口)

随后拉取Docker镜像并启动容器:

docker compose pull
docker compose up -d

开启HTTPS

我的解决方案参考了Vautlwarden官方的这篇文章:Running a private vaultwarden instance with Let’s Encrypt certs,其中也解释了不适用私有证书的原因。

我使用域名解析服务商将vaultwarden要使用的域名解析到服务器的内网ip,例如将vw.example.com解析到192.168.1.2。再使用acme.sh通过DNS验证申请SSL证书,在服务器使用Nginx进行反向代理。

使用acme.sh申请证书可以参考这篇文章

Nginx的安装与基础配置我便不过多赘述,反向代理配置我参考了Vaultwarden官方给出的例子:

upstream vaultwarden {
  zone vaultwarden 128k;
  server 127.0.0.1:11001;
  keepalive 2;
}
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      "";
}
server {
    listen 8000;
    server_name [your-domain];
    if ($host = [your-domain]) {
        return 301 https://$host:8443$request_uri;
    }
    return 404;
}
server {
    listen 8443 ssl;
    http2 on;
    server_name [your-domain];
    ssl_certificate [your-cert-path];
    ssl_certificate_key [your-key-path];
    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;
    }
}

PS:这里我并没有监听常规80443端口,而是选择80008443端口。

注意替换[your-domain]以及[your-cert-path][your-key-path],若此前修改了Vaultwarden的外部端口,此处也应一并修改。

一般情况下,重启Nginx后访问[your-domain]:8000即可看到HTTPS已经成功启用了。