更新

2024.02.12更新,按照文档从新配置,反向代理使用的的 Nginx Proxy Manager ,使用 docker-compose 部署,其他的没必要看了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: '3'

services:
vaultwarden:
container_name: vaultwarden
image: vaultwarden/server:latest
restart: unless-stopped
volumes:
- ./data/:/data/
ports:
- 127.0.0.1:8080:80
environment:
- SIGNUPS_ALLOWED=ture
- INVITATIONS_ALLOWED=false
- PUSH_ENABLED=true
- PUSH_INSTALLATION_ID=<>
- PUSH_INSTALLATION_KEY=<>
- DOMAIN=https://pa.365day.top
- SHOW_PASSWORD_HINT=false
- LOGIN_RATELIMIT_MAX_BURST=2
- EMERGENCY_ACCESS_ALLOWED=false
- WEB_VAULT_ENABLED=false

更新升级镜像

1
2
3
4
5
docker-compose pull

docker-compose up -d

docker image prune

背景

目前在用的密码管理软件是 1Password,没有订阅,使用的是 iCloud 同步,希望有一个全平台的密码管理软件,最后目标锁定在了 Enpass 和 Bitwarden 上。

Enpass 需要 29.99 美刀购买终身订阅,可以通过坚果云 webdav 协议同步自己的密码,密码文件由自己管理,缺点是在 Windows 端使用的时候,软件需要后台运行,才能在浏览器正常使用插件(也没毛病,密码又不在云端,那只能软件后台运行)

Enpass 购买地址:Enpass Password Manager Individual Plan: Lifetime Subscription

可以考虑等黑五的时候购买,有优惠的时候可以到 15 美刀。

Bitwarden 官方提供免费服务,也可以 10 美刀订阅高级版,解锁了 TOTP 验证,密码储存在云端,当然软件是开源的,也可以自己搭建,今天就来自己尝试搭建一下 Bitwarden 服务。

环境

Bitwarden 有两个版本

  • 一个是官方提供的免费版(没有解锁高级功能):开源地址
  • 一个是第三方基于 Rust 编写的解锁了高级功能的版本:开源地址

本次部署的是基于 Rust 的版本,使用的系统是 Ubuntu 20.04.1,使用 Docker 部署

安装

1、安装 docker

1
wget -qO- get.docker.com | bash

查看安装结果,并设置开机自启

1
2
3
docker version
systemctl start docker
systemctl enable docker

查看状态

1
systemctl status docker

2、运行镜像

拉取最新镜像

1
docker pull vaultwarden/server:latest

运行镜像,目的是先配置好账号,之后再进行详细的配置(将容器的 80 端口映射到宿主机的 8080 端口,因为 80 端口要由 Nginx 监控)

1
docker run -d --name bitwarden -v /vw-data/:/data/ -p 8080:80 vaultwarden/server:latest

需要启用启用 HTTPS ,不然无法设置账号(bitwarden 强制服务端必须提供 https)

This browser requires HTTPS to use the web vault

Check the Vaultwarden wiki for details on how to enable it

提前准备好证书和私钥,创建目录

1
mkdir -p /vw-data/ssl

把证书和私钥放到目录下,比如我的文件名字

ps.365day.top.crt ps.365day.top.key

3、配置 Nginx

1
apt install nginx -y

修改配置文件

1
2
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
vim /etc/nginx/nginx.conf

Nginx 的完整配置如下,需要修改 3 处位置,已经标注。使用的例子:Proxy-examples

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
worker_connections 768;
# multi_accept on;
}

http {

upstream vaultwarden-default {
zone vaultwarden-default 64k;
server 127.0.0.1:8080;
keepalive 2;
}

upstream vaultwarden-ws {
zone vaultwarden-ws 64k;
server 127.0.0.1:3012;
keepalive 2;
}

# Redirect HTTP to HTTPS
server {
listen 80;
listen [::]:80;
# 1、配置自己的域名
server_name ps.365day.top;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
# 2、配置自己的域名
server_name ps.365day.top;

# 3、配置SSL证书位置
# 配置证书文件
ssl_certificate /vw-data/ssl/ps.365day.top.crt;
# 配置证书私钥文件
ssl_certificate_key /vw-data/ssl/ps.365day.top.key;

client_max_body_size 128M;

location / {
proxy_http_version 1.1;
proxy_set_header "Connection" "";

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;
}

location /notifications/hub/negotiate {
proxy_http_version 1.1;
proxy_set_header "Connection" "";

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;
}

location /notifications/hub {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Forwarded $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_pass http://vaultwarden-ws;
}
}
}

设置开机启动,重启

1
2
systemctl enable nginx
systemctl restart nginx

开放防火墙端口

1
2
3
4
5
6
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
iptables -I INPUT -p tcp --dport 3012 -j ACCEPT
iptables-save
netfilter-persistent save
netfilter-persistent reload

4、根据 wiki 文档配置

之后应该就可以使用域名正常访问了,先创建一个账号。

账号创建完成之后,移除镜像,完善配置后重新创建

1
2
docker stop bitwarden
docker rm bitwarden

文档地址:Vaultwarden,部署以前最好先阅读一遍 wiki、

配置说明(更多的自行阅读 wiki 文档)

如果需要启用管理页面(此处的设置将覆盖环境变量,地址为域名后面/admin),首先执行命令,复制生成的秘钥

1
openssl rand -base64 48

root@ubuntu:~# openssl rand -base64 48
ET1f7w5ieS7Zh1ChDb1MSjaNiQK6l0f07cI13cTwXOhRCAYakHAttSTt7URTHnD8

根据上面的配置,运行 docker 镜像

1
2
3
4
5
6
7
8
9
docker run -d --name bitwarden \
-e SIGNUPS_ALLOWED=false \
-e INVITATIONS_ALLOWED=false \
-e WEBSOCKET_ENABLED=true \
-e DOMAIN=https://ps.365day.top \
-v /vw-data/:/data/ \
-p 8080:80 \
-p 3012:3012 \
vaultwarden/server:latest

现在就不允许注册。注册的话会出现提示:Registration not allowed or user already exists

这时我们就可以用之前注册好的账户登录

备份

这里使用 git 来定期备份

1、在 GitHub 创建私有仓库

2、系统安装 git

3、在个人指定的位置建立仓库,并和远程仓库建立连接,我是建立在了 /root/bitwarden 目录下

4、建立脚本 bitwarden.sh ,脚本内容如下

1
cd /vw-data && tar czvf bitwarden_backup_$(date '+%Y%m%d_%H%M').tgz /vw-data && mv bitwarden_backup_$(date '+%Y%m%d_%H%M').tgz /root/bitwarden && cd /root/bitwarden && git add . && git commit -m 'update' && git push && find /root/bitwarden -mtime +7 -name "bitwarden_backup_*.tgz" -exec rm -Rf {} \;

5、赋予权限,创建定时任务,可以设置每天备份一次,每次执行会检查是否有 7 天前的备份,并自动删除。