安装 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 Login
Vaultwarden 私服支持对接 Bitwarden 官方的客户端。为了使该服务更具可用性,我们建议使用 Bitwarden 官方的浏览器插件和移动应用程序来连接我们自建的服务。这里以浏览器插件的配置为例:
![bitwarden-client](/blog/posts/how-to-install-vaultwarden-with-docker/images/bitwarden-client.webp)
下载并安装浏览器插件后,点击左上角的齿轮图标,然后在“自定义环境”一栏中输入之前配置的域名。完成输入后,点击保存并成功登录账户,就能畅快使用了。
写在最后
作为一位资深的 1Password 用户,我曾经被它精美的用户界面所吸引,同时也因为它支持丰富的密码种类而一直坚持使用。
![1Password-UI 1Password-UI](/blog/posts/how-to-install-vaultwarden-with-docker/images/1password.webp)
然而,随着成家的压力越来越大,开源节流已经成为了我的生活首要任务,再精美的 UI 也得被迫放弃了,因此这里截个图留个念。