自建Vaultwarden密码管理器,并实现自动备份和EdgeOne加速

image

Vaultwarden 是一款基于 Rust 语言开发的 Bitwarden 兼容服务器,专为自托管场景设计。其核心目标是提供高性能、低资源占用的密码管理解决方案,同时保持与官方 Bitwarden 客户端的完全兼容。通过轻量化设计和模块化架构,Vaultwarden 能够在树莓派、NAS 或低配 VPS 上高效运行,成为自托管用户的理想选择。

Vaultwarden 采用 Rust 语言开发,内存占用极低,通常仅需 10-50MB,远低于官方 Bitwarden 服务器的资源需求。其模块化设计支持 Docker 容器化部署,默认镜像体积小巧,约 100MB,启动速度快,适合资源有限的环境。无论是个人用户还是小型团队,Vaultwarden 都能在不牺牲功能的前提下,提供流畅的使用体验。

Vaultwarden 实现了 Bitwarden 客户端 API 的几乎所有功能,包括个人保险库、组织共享、多因素认证、附件与图标支持以及管理后台。个人保险库支持存储密码、笔记、信用卡等数据,而组织共享功能则允许用户通过集合、用户组和角色管理实现团队协作。多因素认证集成了 FIDO2 WebAuthn、YubiKey 和 Duo 等硬件密钥,进一步提升账户安全性。此外,Vaultwarden 还支持文件上传和网站图标自动抓取,并通过 Web 端管理界面提供用户管理和策略配置功能。

一、环境准备

在开始部署之前,需要确保你的系统环境满足以下条件:

  • 操作系统:支持大多数 Linux 发行版,如 Ubuntu、Debian、CentOS 等。也可以在 Windows 和 macOS 上运行,但主要推荐在 Linux 服务器上部署。
  • 硬件要求:虽然 Vaultwarden 以低资源消耗闻名,但至少应确保有 1GB RAM 和 1GHz CPU,以保证运行的流畅性。磁盘空间根据你的用户量和存储的数据量来决定,起步至少需要 10GB。
  • 网络配置:确保服务器的指定端口(默认为 80 和 443)对外开放,以便用户访问 Vaultwarden 服务
  • Docker Engine:用于容器化部署和管理。
  • Docker Compose:支持configs的版本,用于多容器应用的编排
  • SSH 客户端,宝塔面板
  • 一个域名 (强烈建议,用于HTTPS)
  • 一个有EdgeOne免费套餐的腾讯云账号

二、部署过程

1、安装Docker和Docker Compose

1
bash <(curl -sSL https://linuxmirrors.cn/docker.sh)

国外选官方,国内除官方以外都可以

image

国外选官方,国内建议选第一个毫秒镜像

image

2、安装宝塔面板及网站环境

1
if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh;fi;bash install_panel.sh ed8484bec

成功安装完面板后进入首页,只需要安装推荐的Nginx

3、创建部署目录并编辑部署文件

1
mkdir -p /home/vaultwarden &&  cd /home/vaultwarden

在部署目录下,创建docker-compose.yaml​文件,示例内容如下:

1
vim docker-compose.yaml
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
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
network_mode: bridge #使用默认的桥接网络
restart: always
environment:
- TZ=Asia/Shanghai
- ADMIN_TOKEN=xxxxxx #‍此值是Vaultwarden管理员面板的令牌(一种密码)。为了安全起见,这应该是一个长的随机字符串。如果未设置此值,则管理员面板将被禁用。建议openssl rand -base64 48生成ADMIN_TOKEN确保安全
- SIGNUPS_ALLOWED=true #允许注册,一般在第一次注册之后关闭
- SIGNUPS_VERIFY=true #设置注册邮箱验证,此处设置需要配置好SMTP才生效
- ADMIN_SESSION_LIFETIME=20 #会话持续时间
- ADMIN_RATELIMIT_SECONDS=60 #这是来自同一IP的登录请求之间的平均秒数,在Vaultwarden限制登录次数之前
- LOGIN_RATELIMIT_MAX_BURST=10 #允许在一阵登录/两步验证尝试中的最大请求次数。
- LOGIN_RATELIMIT_SECONDS=60 #这与ADMIN_LOGIN_RATELIMIT_SECONDS相同
- DOMAIN=https://xxxxx.yourdomain.com # 这是您希望与您的Vaultwarden实例关联的域名
- ADMIN_RATELIMIT_MAX_BURST=10 # 这与LOGIN_RATELIMIT_MAX_BURST相同,只争对admin面板
- WEB_VAULT_ENABLED=true #是否开启web UI
- SENDS_ALLOWED=false #是否开启send功能
- EMERGENCY_ACCESS_ALLOWED=true
- PUSH_ENABLED=true #启用移动端推送
- PUSH_INSTALLATION_ID=xxxxxxx #访问https://bitwarden.com/host/,输入您的电子邮箱地址,然后您将获得一个 INSTALLATION ID 和 KEY
- PUSH_INSTALLATION_KEY=xxxxxx # 请确保选择 bitwarden.com(美国)作为数据区域
- SMTP_HOST=smtp.domain.tld
- SMTP_FROM=vaultwarden@domain.tld
- SMTP_PORT=587
- SMTP_SECURITY=starttls
- SMTP_USERNAME=myusername
- SMTP_PASSWORD=MyPassw0rd
- LOG_FILE=/log/vaultwarden.log
- LOG_LEVEL=warn
- EXTENDED_LOGGING=true
volumes:
- ./data:/data #在docker-compose.yml同级目录创建的文件夹
- ./log:/log
ports:
- 8888:80 #映射80端口
vaultwarden_backup:
image: ttionya/vaultwarden-backup:latest
restart: always
depends_on:
- vaultwarden
volumes:
- vaultwarden-rclone-data:/config
- ./data:/data
environment:
- DATA_DIR=/data #指定存放 vaultwarden 数据的目录
- XDG_CONFIG_HOME=/config #指定存放 rclone config 配置的目录
- LOCALTIME_FILE=/tmp/localtime
- RCLONE_REMOTE_NAME=BitwardenBackup #Rclone远程名称,它需要和rclone config中的远程名称保持一致
- RCLONE_REMOTE_DIR=/BitwardenBackup/ #远程存储系统中存放备份文件的文件夹路径
- ZIP_PASSWORD=WHEREISMYPASSWORD? #压缩文件的密码。请注意,打包备份文件时始终会使用密码
- BACKUP_KEEP_DAYS=0 #在远程存储系统中保留最近 X 天的备份文件。设置为 0 会保留所有备份文件
- TIMEZONE=Asia/Shanghai #设置你的时区名称
- ZIP_TYPE=7z #只支持 zip 和 7z 格式
volumes:
vaultwarden-data:
# Specify the name of the volume where you save the vaultwarden data,
# use vaultwarden-data for new users
# and bitwardenrs-data for migrated users
name: vaultwarden-data
# name: bitwardenrs-data
vaultwarden-rclone-data:
external: true
# Specify the name of the volume where you save the rclone configuration,
# use vaultwarden-rclone-data for new users
# and bitwardenrs-rclone-data for migrated users
name: vaultwarden-rclone-data
# name: bitwardenrs-rclone-data

这里 SMTP 相关环境变量可以不填,但不填的话登录 Vaultwarden 二次验证就是不能选择邮件验证,但你可以选择其他方式进行二验

docker-compose.yml​文件所在目录执行操作

1
2
3
4
5
6
7
8
9
10
11
# Start
docker-compose up -d

# Stop
docker-compose stop

# Restart
docker-compose restart

# Remove
docker-compose down

4、反向代理设置

image

image

image

  • 签发证书,其他默认
  • 启用 HTTPS:强烈建议通过反向代理启用 HTTPS,以确保数据传输过程中的加密。
  • 定期更新:定期更新 Docker 镜像或 Vaultwarden 本身,以确保安全漏洞得到修复

三、创建用户,使用教程

反代设置好以后,接下来访问 web 页面创建用户

image

填写账号信息创建用户。创建完毕后,记得修改 compose 文件的环境变量 SIGNUPS_ALLOWED​ 为 false

image

接下来可以设置二验,并保存恢复代码以防万一。

image

接下来就是安装客户端,再进行登录就完事了。PC 端推荐使用浏览器并安装插件,移动端推荐安装 App
,都可以在 bitwarden下载页面 找到。

需要注意的是,登陆时需要选择自托管,并填写自己的网址才可以使用。

image

另外现在越来越多网站可以开启TOTP二次验证,vaultwarden 当然也是支持的

image

四、自动备份教程

1、配置Rclone

我们通过 Rclone 同步备份文件到远程存储系统。

访问 GitHub 了解更多存储系统使用教程,不同的系统获得 Token 的方式不同。

你可以通过下面的命令获得 Token

1
2
3
4
docker run --rm -it \
--mount type=volume,source=vaultwarden-rclone-data,target=/config/ \
ttionya/vaultwarden-backup:latest \
rclone config

我们建议将远程名称设置为 BitwardenBackup​,否则你需要指定环境变量 RCLONE_REMOTE_NAME​ 为你设置的远程名称。

2、自动备份

如果你有一个正在运行的 vaultwarden,但是不想使用 docker-compose.yml,我们同样为你提供了备份方法。

确保你的 vaultwarden 容器被命名为 vaultwarden,否则你需要自行替换 docker run 的 –volumes-from 部分。

默认情况下 vaultwarden 的数据文件夹是 /data,你需要显式使用环境变量 DATA_DIR 指定数据文件夹。

使用默认设置启动容器(每小时的 05 分自动备份)

1
2
3
4
5
6
7
docker run -d \
--restart=always \
--name vaultwarden_backup \
--volumes-from=vaultwarden \
--mount type=volume,source=vaultwarden-rclone-data,target=/config/ \
-e DATA_DIR="/data" \
ttionya/vaultwarden-backup:latest

3、还原备份

重要: 还原备份会覆盖已存在的文件。

你需要在还原备份前停止 Docker 容器。

你也需要下载备份文件到本地计算机。

因为主机的文件无法在 Docker 容器中直接访问,所以要将需要还原的备份文件所在目录映射到 Docker 容器中。

首先进入待还原的备份文件所在目录。

如果你使用的是“自动备份”,请确认 vaultwarden 卷的命名,并替换 –mount source 部分。

同时不要忘记使用环境变量 DATA_DIR 指定数据目录(-e DATA_DIR=“/data”)。

1
2
3
4
5
6
7
8
9
docker run --rm -it \
\ # 如果你将本地目录映射到 Docker 容器中,就像 `vw-data` 一样
--mount type=bind,source="本地目录的绝对路径",target=/data/ \
\ # 如果你使用 Docker 卷
--mount type=volume,source="Docker 卷名称",target=/data/ \
--mount type=bind,source=$(pwd),target=/bitwarden/restore/ \
-e DATA_DIR="/data" \
ttionya/vaultwarden-backup:latest restore \
[OPTIONS]

五、EdgeOne加速

边缘安全加速平台 EO(Tencent cloud EdgeOne,下文简称为 EO )基于腾讯边缘计算节点提供加速和安全的解决方案,为电商与零售、金融服务、内容资讯与游戏等行业保驾护航,提升用户体验。

  • 加速方面:边缘节点更贴近用户,有效降低了数据访问时间延迟,避免数据传输抖动,保障大量数据传输的稳定性和有效性。同时,产品提供了动静态数据加速,跨国加速,智能路由优化等加速特性,高效支撑对时延敏感的相关业务。
  • 安全方面:提供 WAF,DDoS 安全防护服务。节点识别并拦截 L3/L4/L7层各类攻击请求,对 DDoS 攻击流量进行清洗,智能 AI 引擎、BOT 策略引擎对 Web、BOT、CC 类型攻击进行行为分析并更新拦截策略,阻断恶意请求到达用户源站,保障业务访问流畅稳定。

image

腾讯云国际站 6月13日开始限量内测 EdgeOne网站安全加速免费版!不限流量,不限请求次数!已备案域名还能享受中国大陆节点加速!

内测时间到2025 年7月15日晚上 11:59:59!内测结束会应该就会公测了!

目前EdgeOne国际版,无需实名,无需绑卡,就能使用服务!!

腾讯云国际版才有免费版,注册账号和购买时一定要注意!

腾讯云国际站:https://www.tencentcloud.com/zh

EdgeOne国际站:https://edgeone.ai/zh/redemption

1、免费计划

  • 只限一个站点(一个主域,不限制子域名)
  • 不限流量
  • 不限请求次数
  • 长期有效(”永”不过期)
  • 已备案域名支持中国大陆CDN加速
  • 自动签发SSL证书
  • 官方介绍:https://edgeone.ai/zh/document/70405

2、Get兑换码

官方推荐有3种方式:

第一:推特发布宣传内容,有机会获得兑换码(回复非常慢慢慢, 推特默认私信是关闭的要去手动打开)。

第二:在 Discord 上“抢”兑换码。北京时间下午三点/六点/晚上九点 准时发1兑换码)。

第三:参与Github活动可获取,https://edgeone.ai/blog/details/github-developer

另外一种方式,寻找EdgeOne人员PY一个码字。EdgeOne国内版国外版都是同一拨人!

3、绑定站点

访问 EO控制台

image

填写站点域名,一定要谨慎。因为目前暂时不能更换主域名。

特别提醒,域名有国内备案才能享受国内CDN加速!否则只有海外加速!速度相差太多了!

image

第二步:绑定已经拥有的免费版。点击下一步后稍等一会!

image

第三步:选择加速区域。已备案域名可选【全球可用区】。接入模式支持 CNAME 和 NS,根据自己的情况选择!

全球可用区支持中国大陆加速!!

image

image

image

image

image

4、加速vaultwarden站点

image

image

image

image

可以看到加速域名已经在部署中了,我们可以按以上步骤把所有需要加速的域名全部添加上

image

接下来我们给加速域名配置 SSL 证书,点击如图处的 编辑

image

为了省去手动更新证书的麻烦,我们直接选择 申请免费证书 ,点击 确定

image

可以看到,证书正在申请中,我们可以按以上步骤把所有加速域名的证书配置完成

image

稍等片刻,我们可以看到证书已经全部配置完毕

image

创建加速规则,否则无法进行设备审批登陆

image

image

添加以下路径为 不缓存(EdgeOne → 规则引擎 → 缓存规则):

1
2
3
4
/notifications/*
/identity/*
/api/*
/admin/*

启用真实客户端 IP 传递
在 EdgeOne → 站点配置 → 网络 中,确保 X-Forwarded-For​ 头已启用

image

进入vaultwarden admin:https://xxxxx.yourdomain.com/admin 页面,输入环境变量中的Admin_token

image

修改Client IP headerX-Forwarded-For

image