Hi,少数派社区的读者们,我是zysrefuse,这是我来少数派写的教程系列文章的第一篇,给大家带来一个开源密码管理器Vaultwarden的部署教程。

同学也许会问Vaultwarden是什么,我直接引用一下官方的定义

Alternative implementation of the Bitwarden server API written in Rust and compatible with upstream Bitwarden clients, perfect for self-hosted deployment where running the official resource-heavy service might not be ideal.Basically full implementation of Bitwarden API is provided.

用 Rust 编写的 Bitwarden 服务器 API 的替代实现,上游 Bitwarden 客户端兼容,非常适合运行官方资源密集型服务的自托管部署。基本上提供了 Bitwarden API 的完整实现。

出发点

自托管在自己的服务器或设备上运行、管理软件或服务越来越流行,一方面,开源社区代有才人出,不断奉献出功能和品质上不逊于收费产品的项目;另一方面,容器(docker)、虚拟化(KVM)等技术不断发展,将用户从繁琐的服务器运维操作中解放出来。加上云服务器厂商大价格战加剧,云服务越来越便宜。

bitwarden.com上家庭版每年的价格是40美元,但是阿里云99计划到2026年3月31日每年都是99元。.top域名新注价格1年12元,3年76元,续费价格 每年32元,阿里云Digicert 单域名证书一年68(可选) 每年最高199元价格上有优势。

⚠️但是服务器在国内需要进行IPC备案和公安备案⚠️ 时间成本上可能付出更多。

从购买到部署

第一步 购买云服务器及域名

前往阿里云

购买服务器,选择ECS 经济型e实例

购买域名,建议选择.top域名

购买ssl证书(可选)

  • 在阿里云控制台搜索 数字证书管理服务 侧边栏>ssl证书管理>免费证书>立刻购买
  • 产品-个人测试证书 证书类型-默认证书(3个月有效期) 如果想要一年有效期 证书类型-升级证书

第二步 IPC备案和公安备案

⚠️ 在中华人民共和国境内提供互联网信息服务,应当依法履行备案手续,所以我们需要进行备案 ⚠️

具体参考阿里云的ICP备案 指南,当IPC备案完成后就可以开始域名与DNS的配置

第三步 配置域名与DNS

进入云服务器 ECS 获取公网IP地址

进入云解析DNS >新手引导

进入数字证书管理服务 >SSL 证书管理 > 创建证书。证书签发后下载Nginx的格式的证书解压得到域名.pem和和域名.key(可选)

第四步 配置云服务器

操作系统: Ubuntu 22.04 64位

硬件配置:2核(vCPU) 2GiB 3 Mbps带宽 40GiBESSD Entry云盘

创建完 ECS实例后,通过Workbench远程连接以 root 用户身份登录(或用其他用户登录后运行 sudo su 切换为 root 身份),然后开始安装

安装docker

附上 Docker 官方部署文档(如果需要更详细的安装流程,请参考官方文档)

由于运营商网络原因,会导致您拉取Docker Hub镜像变慢,甚至下载失败。阿里云提供了官方的镜像加速器,从而加速官方镜像的下载。官方镜像加速参考文档

安装Vaultwarden

#将容器的页面复制到host,方便编辑
docker run -d --name vaultwarden  -v  /www/vw-data/:/data/   --restart unless-stopped  vaultwarden/server:latest 
docker cp  vaultwarden:/web-vault/ /www/vw-vault/
docker container stop vaultwarden
docker container rm vaultwarden
#需要在文本编辑器里面修改添加上你的主域名,这个代码允许任何人注册
docker run -d --name vaultwarden  -v  /www/vw-data/:/data/ -v /www/web-vault/:/web-vault/   --env DOMAIN="https://你的主域名"    --restart unless-stopped -p 80 vaultwarden/server:latest
#如果想要禁止其他人注册可以先删除再更改环境变量,重新创建容器
docker container stop vaultwarden
docker container rm vaultwarden
docker run -d --name vaultwarden  -v  /www/vw-data/:/data/ -v /www/web-vault/:/web-vault/   --env DOMAIN="https://你的主域名"   -v  SIGNUPS_ALLOWED=false   --restart unless-stopped -p 80 vaultwarden/server:latest
#查看容器ip地址
docker inspect vaultwarden | grep IPAddress

添加IPC备案号。

docker cp vaultwarden:/web-vault/index.html  ./
#编辑index.html文件
vim ./index.html
<html class="theme_light">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=1010">
    <meta name="theme-color" content="#175DDC">
    <title page-title>Bitwarden Web Vault</title>
    <link rel="apple-touch-icon" sizes="180x180" href="images/icons/apple-touch-icon.png">
    <link rel="icon" type="image/png" sizes="32x32" href="images/icons/favicon-32x32.png">
    <link rel="icon" type="image/png" sizes="16x16" href="images/icons/favicon-16x16.png">
    <link rel="mask-icon" href="images/icons/safari-pinned-tab.svg" color="#175DDC">
    <link rel="manifest" href="manifest.json">
    <script src="theme_head.8e5494e39b48bad5e654.js"></script>
    <link href="app/main.8e5494e39b48bad5e654.css" rel="stylesheet">
</head>

<body class="layout_frontend">
    <app-root>
        <div class="mt-5 d-flex justify-content-center">
            <div><img class="mb-4 logo logo-themed" alt="Bitwarden">
                <p class="text-center"><i class="fa fa-spinner fa-spin fa-2x text-muted" title="Loading" aria-hidden="true"></i></p>
            </div>
        </div>
    </app-root>
    <script src="app/polyfills.8e5494e39b48bad5e654.js"></script>
    <script src="app/vendor.8e5494e39b48bad5e654.js"></script>
    <script src="app/main.8e5494e39b48bad5e654.js"></script><a href="https://beian.miit.gov.cn" target="_blank">
        <center>ipc备案号</center>
    </a></script>
</body>
</html>
docker cp ./index.html vaultwarden:/web-vault/
docker container restart vaultwarden

 

安装caddy

Caddy是第一个也是唯一一个_默认_自动使用HTTPS的Web服务器。

安装并且配置caddy使用反向代理和SSL。

 
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
 
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
 
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
 
sudo apt update
 
sudo apt install caddy
 
nano /etc/caddy/Caddyfile 

 如果购买了阿里云的证书

进入ECS 云助手先将Nginx的格式的证书上传到到ECS实例,请默认上传到/www目录。

#删除/etc/caddy/Caddyfile的内容 
#将以下代码需要在文本编辑器里面修改添加上你的主域名后添加到Caddyfile
 
xxxxx.top {
tls /www/xxxxx.top.pem  /www/xxxxx.top.key
reverse_proxy   容器的IPAddress:80
}
www.xxxxx.top {
        redir https://xxxxx.top{uri}        
}

修改Nginx的格式的证书的所有权给caddy

cd /www
chown caddy *.key
chown caddy *.pem

如果没有购买了阿里云的证书

#删除/etc/caddy/Caddyfile的内容 
#将以下代码需要在文本编辑器里面修改添加上你的主域名和邮箱后,添加到Caddyfile
 
xxxxx.top {
        tls youremail
        reverse_proxy  容器的IPAddress:80
}

www.xxxxx.top {
        redir https://xxxxx.top{uri}        
}

重启caddy

systemctl restart caddy.service

配置防火墙

进入安全组配置>安全组>入方向>快速添加

放行HTTP (80),HTTPS (443)端口

Vault初体验

浏览器输入你的域名

此时需要我们提供邮箱和一个密码来生成账号。点击 创建账户,密码不建议太简单。

创建完账户密码后,开始使用浏览器插件和手机app

下载链接

安卓,苹果用户现需要一些特殊设置请参照文章末尾另一篇有相关文章,本文不多赘述

安全性提升

因为服务器在公网上,需要进一步进行设置

  1. 点击右上角下箭头-账户设置-安全-两步登陆-FIDO2 WebAuthn或者验证器 App ,防止有人暴力破解你的Vault的主密码。
  2. 禁止其他人注册账户
  3. 进入安全组配置 关闭ssh(22)端口,或者参考20 个 OpenSSH 最佳安全实践 保护ssh
  4. 定期升级服务器系统
  5. 定期导出你的密码库或者备份目录 /www/vw-data/

后记

安卓,苹果等平台请参考另一篇有相关文章 受够了密码数据泄漏事件?用 Bitwarden 做自己的安全负责人

到此本教程就该结束了,本人笨嘴拙腮写不出情文并茂的句子,不足的地方还望见谅。


 

3
2