告别 Cloudflare Workers 部署!手把手教你在 VPS 上搭建更安全的 Vaultwarden 并实现自动备份
大家好,今天想和大家聊聊个人密码管理的另一条路:自建。
之前我也和大家一样,沉迷于 NodeWarden + Cloudflare Workers 的“零成本”部署方案。不得不承认,它的界面确实友好,兼容性也没得挑,备份恢复功能也是一套龙。但是,用久了两个痛点越来越明显:
- 国内访问玄学:Workers 在国内的稳定性大家懂的都懂,虽然可以通过优选域名或者配合 CDN 提速,但总归不是长久之计,时不时就要折腾一下。
- 安全隐患:虽然 CF 官方说内部传输是安全的,但在某些复杂的路由视图下,配置信息(比如你的 WebDAV 备份密码)在部分环节可能存在明文可见的风险。对于存放“数字生命”的密码库来说,这点让我心里始终打鼓。
正好手里有一台闲置的 Oracle VPS(或者任何你能搞到的 IPv4 VPS),于是决定趁此机会,把部署环境切回更传统、更可控的 Vaultwarden。同时,为了解决手动备份的痛点,我搭配了 Auto Backup 脚本和 Caddy 反代,实现了一套“全自动、HTTPS、异地备份”的方案。
下面把踩坑后的完整流程整理出来,希望能帮到想要自建 Bitwarden 替代品的朋友们。
第一步:配置远程备份客户端 (Rclone)
为了实现数据的安全异地备份,我选择了 WebDAV 协议配合 Rclone。这里以 Koofr 为例,当然你也可以使用阿里云盘、OneDrive 等支持 WebDAV 的服务。
- 在你的 WebDAV 服务商后台(如 Koofr)生成一个应用密码。
- 在服务器上运行以下命令初始化 rclone 配置:
docker run --rm -it \
--mount type=volume,source=vaultwarden-rclone-data,target=/config/ \
ttionya/vaultwarden-backup:latest \
rclone config
按照提示操作:
- 输入
n新建配置。 - Remote name(远程名称):建议设置为
BitwardenBackup(后续 compose 文件中需保持一致,否则需额外指定环境变量)。 - 选择 WebDAV 类型。
- 输入 URL、User、Password 等信息。
配置完成后,可以通过以下命令验证是否成功:
docker run --rm -it \
--mount type=volume,source=vaultwarden-rclone-data,target=/config/ \
ttionya/vaultwarden-backup:latest \
rclone config show
第二步:编写 Docker Compose 编排文件
这是核心部分。我们将使用三个容器:
- vaultwarden: 核心服务。
- caddy: 自动获取 SSL 证书并反向代理。
- backup: 定时备份数据到远程。
创建 docker-compose.yml 文件:
services:
vaultwarden:
image: vaultwarden/server:latest
restart: always
environment:
# 禁止公开注册
SIGNUPS_ALLOWED: 'false'
# 必须设置一个强随机字符作为 ADMIN_TOKEN
ADMIN_TOKEN: 'randomly_generated_admin_token'
# 替换为你绑定的域名
DOMAIN: "https://vault.your-domain.com"
volumes:
- vaultwarden-data:/data/
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- caddy-data:/data
- caddy-config:/config
# 自动申请证书并反代到上游 vaultwarden 容器
command: caddy reverse-proxy --from https://vault.your-domain.com --to http://vaultwarden:80
depends_on:
- vaultwarden
backup:
image: ttionya/vaultwarden-backup:latest
restart: always
environment:
# 如果 rclone 远程名不是 BitwardenBackup,需取消注释并修改
# RCLONE_REMOTE_NAME: 'BitwardenBackup'
# RCLONE_REMOTE_DIR: '/BitwardenBackup/'
# 备份周期:每 6 小时备份一次(按需修改)
CRON: '0 */6 * * *'
ZIP_PASSWORD: '' # 加密备份文件的密码,建议设置
# 如果启用 zip 加密,需设置 ZIP_ENABLE: 'TRUE'
BACKUP_FILE_SUFFIX: '%Y%m%d_%H%M%S'
# 保留最近 2 天的备份
BACKUP_KEEP_DAYS: 2
TIMEZONE: 'Asia/Shanghai'
volumes:
- vaultwarden-data:/bitwarden/data/
- vaultwarden-rclone-data:/config/
depends_on:
- vaultwarden
volumes:
vaultwarden-data:
name: vaultwarden-data
vaultwarden-rclone-data:
external: true
name: vaultwarden-rclone-data
caddy-data:
name: caddy-data
caddy-config:
name: caddy-config
注意事项:
ADMIN_TOKEN请随机生成一个足够长的字符串,这是访问管理后台的关键。DOMAIN确保 DNS 解析已经指向你的 VPS IP。vaultwarden-rclone-data是外部卷,因为我们第一步已经创建并配置过了。
第三步:启动服务与防火墙设置
-
开放端口: 别忘了去你的云服务商控制台(如 Oracle Cloud、阿里云等),在安全组/防火墙规则中放行 80 和 443 端口。如果是腾讯云/阿里云,还需要注意防火墙的安全组设置。
-
启动容器:
sudo docker compose up -d
后续管理
-
初始化用户: 首次访问
https://vault.your-domain.com会进入注册页面(虽然设置了SIGNUPS_ALLOWED: false,但第一个用户通常可以注册,或者通过管理后台创建)。更安全的方式是通过管理后台创建第一个用户: 访问https://vault.your-domain.com/admin/ 输入你的ADMIN_TOKEN`,然后在 Web UI 中创建管理员账号。 -
查看备份日志:
sudo docker logs -f backup观察是否成功上传到 WebDAV。
为什么推荐这个方案?
- 数据主权:数据完全掌握在自己手中,不经过第三方 CDN 的边缘节点缓存。
- 稳定性:直连 VPS 的 IPv4 线路,国内访问速度通常比 CF Workers 更稳定,尤其是配合了 Caddy 自动 HTTPS 后,连接建立更快。
- 自动化焦虑缓解:有了
vaultwarden-backup,你不需要再担心“我昨天备份了吗”,系统会老老实实每 6 小时(或你设定的时间)丢一份加密压缩包到你的私有云盘里。
这套方案虽然占用了少量的 VPS 资源,但换来的稳定性和安全性,对于密码库这种核心数据来说,绝对是值得的。如果有同学还在纠结选 NodeWarden 还是 Vaultwarden,推荐优先考虑后者,尤其是在有独立 IP 的情况下。
祝大家搭建顺利,数据安全!
评论已关闭