
对于经常上网的我们，账号密码相当多，使用同一个密码很容易被脱裤，使用不同的密码却又难记。其实有很多密码管理软件可以使用，比如 bitwarden。

bitwarden 的密码默认是储存在官方有服务器上，当然是加密存储的。官方为了方便用户，也提供 docker 方式在自己的服务器安装该密码管理服务。要想自己安装使用 bitwarden，需要先安装 docker，这个可以参考《[centos7 下安装 docker](https://www.psay.cn/toss/135.html)》一文。安装官方的镜像对服务器的要求高，由于官方使用的是 mssql，内存必需大于 2G，对于小内存机器来说是跑不起来的。

不过在 github 上有 vaultwarden（为了便于与官方区别，bitwarden_rs 已更名为 vaultwarden），这个是用 rust 写的 docker 镜像，对服务器要求较低，小内存照样能用。具体详见：[https://github.com/dani-garcia/vaultwarden/](https://github.com/dani-garcia/vaultwarden/)。

按照提示，两行命令即可拉取 docker 镜像，进行默认安装：

```bash
docker pull vaultwarden/server:latest
docker run -d --name vaultwarden -v /bw-data/:/data/ -p 6666:80 vaultwarden/server:latest

```

为了可以通过宿主机上通过端口映射反代，需要配置相应的 nginx，具体可以参考：[https://github.com/dani-garcia/vaultwarden/wiki/Proxy-examples](https://github.com/dani-garcia/vaultwarden/wiki/Proxy-examples)。

按上面链接配置好 web 配置文件后（如 nginx），就可以用配置好域名进行访问管理了。

当然 vaultwarden 也是可以自定义安装，这个自定义是指相关的 docker 配置，下面简单介绍一下。

1、自行选择安装目录，如安装到/home/vaultwarden：

```bash
cd /data && mkdir vaultwarden && cd vaultwarden
```

2、准备一个配置文件 config.env，里面包含了需要配置的环境变量：

```bash
cat >> config.env <<EOF
```

写入基本的环境配置（其它配置可在在安装好后进后台进行设置）：

```env
# 启用或禁用新用户注册：true启用，false禁用
SIGNUPS_ALLOWED=true
# 设置web访问域名
DOMAIN=https://vault.yourdomain.com
# 设置SQLites数据库存储路径及数据库名
DATABASE_URL=data/vaultwarden.db
# 是否启用web客户端：true启用，false禁用
WEB_VAULT_ENABLED=true
# 启用管理后台并设置token，默认为空不启用，设置token后则启用
ADMIN_TOKEN=XXXXXXXXXXXX
# 是否启用WebSocket通知：true启用，false禁用
WEBSOCKET_ENABLED=false
# 设置日志路径
LOG_FILE=data/access.log
# 日志级别选项：trace、debug、info、warn、error 以及 off
LOG_LEVEL=warn
EXTENDED_LOGGING=true
EOF
```

DOMAIN 填自己的域名，需要 HTTPS。

这个环境配置文件不包含 smtp 发送邮件等配置，如果需要邮件功能，需要增加 smtp 的设置，可一并写入环境配置文件，相关设置说明如下（不一定非要写入环境文件，也可以按上面的基本配置安装完成后，进入后台界面进行设置）：

```env
# 启用或禁用新用户注册：true启用，false禁用
SIGNUPS_ALLOWED=false

# 设置web访问域名
DOMAIN=https://vault.yourdomain.com

# 设置SQLites数据库存储路径及数据库名
DATABASE_URL=data/vaultwarden.db

# 设置日志路径
LOG_FILE=data/access.log

# 日志级别选项：trace、debug、info、warn、error 以及 off
LOG_LEVEL=warn
EXTENDED_LOGGING=true

# 启用管理后台并设置token，默认为空不启用，设置token后则启用
ADMIN_TOKEN=XXXXXXXXXXXX

# 是否启用WebSocket通知：true启用，false禁用
WEBSOCKET_ENABLED=true

# 是否启用web客户端：true启用，false禁用
WEB_VAULT_ENABLED=true

# 修改线程，默认为10，若用户多可修改为更大，一般默认不需要设置
ROCKET_WORKERS=20

# 显示密码提示：true启用，false禁用
SHOW_PASSWORD_HINT=false

# 设置SMTP
SMTP_HOST=smtp.test.com
SMTP_FROM=test@test.com
SMTP_PORT=465
SMTP_USERNAME=test@test.com
SMTP_PASSWORD=password
# 自v1.25.0起，不再设置SMTP_SSL和SMTP_EXPLICIT_TLS，使用SMTP_SECURITY替代，它有以下选项：starttls、force_tls和off。
# 465端口使用force_tls，587端口使用starttls，25端口使用off。
SMTP_SECURITY=force_tls

# 启用或禁用邀请：true启用，false禁用
INVITATIONS_ALLOWED=false

# 启用或禁用分享发送功能，默认开启，启用true，禁用false
SENDS_ALLOWED=false

```

当然也可以在安装好后，进管理后台的界面设置 smtp 参数，不过要记得将 Use explicit TLS（vaultwarden 中的 Force TLS 选项）打上勾，然后保存即可，否则可能发送邮件会出错。

ADMIN_TOKEN 为管理面板密码，推荐使用“openssl rand -base64 48”生成，当然也可以随意。

SIGNUPS_ALLOWED=true，此项控制注册，第一次使用的话设置为 true，若是备份有数据库，可设置为 false，安装好后将 DATABASE_URL 指定路径中的数据库替换为备份的 db 重启 docker 即可。

上述详细的环境变量说明请参阅：[https://github.com/dani-garcia/vaultwarden/wiki](https://github.com/dani-garcia/vaultwarden/wiki)。

3、准备服务描述文件 docker-compose.yml：

```bash
cat >> docker-compose.yml <<EOF
```

写入：

```yml
version: '3'

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: always
    volumes:
      - /docker/data:/data
    env_file:
      - config.env
    ports:
      - "6666:80"
      - "8888:3012"
```

vaultwarden：现在是唯一一个服务；

image: vaultwarden/server:latest 指定使用 Docker Hub 的 vaultwarden/server:latest 最新镜像；

volumes 中指定将容器内的 /data 目录挂载到宿主机的当前目录下的 /docker/data 目录，这样你可以在宿主机上执行数据库的备份操作；

ports 指定分别将容器内的 80 和 3012 端口映射到了宿主机的 6666 和 8888 端口；

3、拉取镜像：

```bash
docker-compose up -d
```

4、nginx 配置反代（其它 web 方式请参阅：[https://github.com/dani-garcia/vaultwarden/wiki/Proxy-examples](https://github.com/dani-garcia/vaultwarden/wiki/Proxy-examples%EF%BC%89%EF%BC%9A)

```conf
server {
listen 443 ssl http2;
server_name vault.yourdomain.com;

# Specify SSL config if using a shared one.
#include conf.d/ssl/ssl.conf;

# Allow large attachments
client_max_body_size 128M;

location / {
    proxy_pass http://<SERVER>:6666;
    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;
}

location /notifications/hub {
    proxy_pass http://<SERVER>:8888;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

location /notifications/hub/negotiate {
    proxy_pass http://<SERVER>:6666;
}

# Optionally add extra authentication besides the AUTH_TOKEN
# If you don't want this, leave this part out
location /admin {
    # See: <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_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://<SERVER>:6666;
}

}

```

5、设置开机启动：

编辑 rc.local 文件：

```bash
vi /etc/rc.d/rc.local
```

在最后加上

```bash
/usr/local/bin/docker-compose -f /usr/local/vaultwarden/docker-compose.yml up -d
```

这样开机就会自动启动 vaultwarden。

访问<https://你的域名/>admin 可以进管理面板。

到这里 vaultwarden 就搭建完成可以使用了，不过个人还是建议配置数据备份。

6、如果修改了配置，需要重新启动容器以便生效：

```bash
docker-compose stop && docker-compose up -d
```

用这个命令，停止当前容器服务并重新启动。

```bash
docker-compose down && docker-compose up -d

```

这个命令是移除容器和镜像并重建。

