vaultwarden,用 Rust 编写的非官方 Bitwarden 兼容服务器

简介

Bitwarden 客户端 API 的替代服务器实现,用 Rust 编写,与官方 Bitwarden 客户端兼容,非常适合自托管部署,其中运行官方资源密集型服务可能不理想。

源码:https://github.com/dani-garcia/vaultwarden

部署

自签证书(可选)

使用 OpenSSL 生成自签名证书,现代浏览器不再识别只有 CN,需要包含 SAN。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 1. 生成私钥
openssl genrsa -out vaultwarden.key 2048

# 2. 生成带 SAN 的自签名证书
openssl req -x509 -new -nodes -key vaultwarden.key \
  -sha256 -days 3650 \
  -out vaultwarden.crt \
  -subj "/CN=192.168.5.25" \
  -addext "subjectAltName = IP:192.168.5.25,DNS:localhost,DNS:127.0.0.1"

# 3. 合并为 PEM 格式(某些服务需要)
cat vaultwarden.key vaultwarden.crt > vaultwarden.pem

下载 vaultwarden.crt 文件,安装到系统。

docker compose

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
version: '3.9'
services:
  vaultwarden:
    container_name: vaultwarden
    image: vaultwarden/server:latest
    environment:
	  - SIGNUPS_ALLOWED=false # 禁用新用户注册
	  - SIGNUPS_ALLOWED=false # 禁用组织邀请
    volumes:
      - ./vaultwarden_data/:/data/
    ports:
      - 3035:80
    restart: unless-stopped

无环境变量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
version: '3.9'
services:
  vaultwarden:
    container_name: vaultwarden
    image: vaultwarden/server:latest
    volumes:
      - ./vaultwarden_data/:/data/
    ports:
      - 80:80
    restart: unless-stopped

内置 https

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
version: '3.9'
services:
  vaultwarden:
    container_name: vaultwarden
    image: vaultwarden/server:latest
    environment:
        - ROCKET_TLS={certs="/data/certs/vaultwarden.crt",key="/data/certs/vaultwarden.key"}
    volumes:
        - /tmp/zfsv3/sata11/15285163454/data/Docker/vaultwarden/vaultwarden_data/:/data/
    ports:
        - 8446:80
    restart: unless-stopped

启用管理界面

环境变量

1
ADMIN_TOKEN=some_random_token_as_per_above_explanation # 启用管理页面

使用如下命令生成 argon2 加密后的 token

1
docker exec -it <container_id> /vaultwarden hash

$ 替换成 $$ 添加到 ADMIN_TOKEN 后面,注意,不要加''

smtp 邮件发送

配置

环境变量

1
2
3
4
5
6
SMTP_HOST= # smtp host
SMTP_FROM= # smtp 发件人
SMTP_PORT= # smtp 端口
SMTP_SECURITY= # smtp tls加密方式,可选有force_tls,starttls,off
SMTP_USERNAME= # smtp 用户名
SMTP_PASSWORD= # smtp 用户密码

smtp 服务器

Resnd:每个月免费 3000 封,注册添加域名后可能被封,需要发邮件解封

端口对应的 TLS

  • 使用端口 465 的邮件服务器
1
2
SMTP_PORT=465
SMTP_SECURITY=force_tls
  • 使用端口 587(有时候是 25)的邮件服务器
1
2
SMTP_PORT=587
SMTP_SECURITY=starttls
  • 根本不支持加密的邮件服务器
1
2
SMTP_PORT=25
SMTP_SECURITY=off

示例

resend

1
2
3
4
5
6
SMTP_HOST=smtp.resend.com
SMTP_FROM=no-reply@example.com
SMTP_PORT=465
SMTP_SECURITY=force_tls
SMTP_USERNAME=resend
SMTP_PASSWORD=re_Pxxxxxxxxxx

HTTPS

不使用 https 访问,已经无法使用。所以必须使用 https 访问

Nginx

请将 yourdomain替换为自己的域名

 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
36
37
38
39
40
41
server {
    if ($host = yourdomain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name yourdomain.com;
    return 301 https://yourdomain.com$request_uri;


}

server {
    listen 443 ssl;
    http2 on;
    server_name yourdomain.com;

    # SSL 证书配置
    ssl_certificate /etc/nginx/ssl/yourdomain.com/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/yourdomain.com/key.pem;

    # 安全设置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # 反向代理
    location / {
        proxy_pass http://127.0.0.1:3035/;
        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 https;
    }

    # 日志配置
    access_log /var/log/nginx/yourdomain.com.access.log;
    error_log /var/log/nginx/yourdomain.com.error.log;

}

自带

添加一条环境变量

1
ROCKET_TLS={certs="/data/ssl/cert.pem",key="/data/ssl/privkey.pem"}

将 cert.pem 和 privkey.pem 替换为自己的域名证书文件

页面浏览量Loading
网站总访客数:Loading
网站总访问量:Loading

-->