为什么我放弃了零成本的 NodeWarden,转而拥抱 VPS 自建 Vaultwarden?

在自托管密码管理器的圈子里,NodeWarden 曾经是我的心头好。通过 Cloudflare Workers 部署,它实现了真正的“零成本”运行,界面友好,备份恢复功能也相对完善。但在我使用了一段时间后,两个致命的问题让我决定它只适合轻量级或临时使用,而不适合作为长期依赖的核心密码库。

如果你也在犹豫是否要迁移,或者正在寻找更稳定的 Bitwarden 替代方案,这篇文档或许能给你一些新的思路。

痛点分析:免费背后的隐形成本

1. 国内访问的“玄学”体验

Cloudflare Workers 生成的域名在国内的网络环境下,稳定性常常让人捉摸不透。虽然可以通过一些“优选域名”的技巧来提速,但这本身就违背了自托管“稳定可控”的初衷。每次需要输入密码时网络连接超时,这种焦虑感是长期用户无法忍受的。

2. 安全隐患:明文传输的风险

这是促使我迁移的核心原因。虽然 Workers 对外的流量是 HTTPS 加密的,但 Cloudflare 内部节点到 Worker 之间的通信在某些配置下可能是 HTTP 明文。对于密码管理器来说,虽然主密钥(Master Key)在客户端解密,但诸如 WebDAV 备份密码、API 令牌等配置信息如果以明文传输,依然存在一定的被中间人监听或窃取的风险。对于追求极致安全的玩家来说,这是不可接受的。

解决方案:闲置 VPS 的华丽转身

正好手头有一台闲置的 Oracle ARM 架构 VPS,性能对于运行 Vaultwarden 来说绰绰有余。于是,我决定迁移到 Vaultwarden,并搭建一套全自动、高可用、多端备份的方案。

部署核心组件

我们将采用以下技术栈:

  • 核心服务:Vaultwarden(Bitwarden 的轻量级兼容服务器)
  • 反向代理 & HTTPS:Caddy(自动签发 Let's Encrypt 证书,极简配置)
  • 自动备份:Vaultwarden Backup + Rclone(同步到 Koofr WebDAV 或其他云存储)

第一步:配置 Rclone 远程存储

我们需要先配置好备份的目标位置。这里以 Koofr 的 WebDAV 为例,你也可以使用阿里云盘、百度网盘、OneDrive 或 S3 等。

  1. 获取应用密码:登录你的 WebDAV 服务(如 Koofr),在设置中找到 右上角头像 -> 偏好设置 -> 密码 -> 应用程序密码,生成一个新密码。
  2. 配置 Rclone

运行以下命令进行交互式配置:

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

关键点

  • 按照提示输入 WebDAV 的 URL 和认证信息。
  • Remote Name 建议设置为 BitwardenBackup,这样在后续的 Docker Compose 配置中可以省略环境变量指定,保持代码整洁。如果设置了其他名字,需要在 docker-compose.yml 中通过 RCLONE_REMOTE_NAME 变量显式指定。
  1. 验证配置
docker run --rm -it \
--mount type=volume,source=vaultwarden-rclone-data,target=/config/ \
ttionya/vaultwarden-backup:latest \
rclone config show

第二步:编写 docker-compose.yml

将以下内容保存为 docker-compose.yml。请替换其中的域名 https://xxx.xxx 为你自己的域名,并设置一个强随机的 ADMIN_TOKEN

services:
  vaultwarden:
    image: vaultwarden/server:latest
    restart: always
    environment:
      SIGNUPS_ALLOWED: 'false'  # 关闭注册,仅限管理员创建账号
      ADMIN_TOKEN: 'replace_with_a_strong_random_string' # 务必修改
      DOMAIN: "https://vault.yourdomain.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
      # Caddy 会自动处理证书申请和续期
    command: caddy reverse-proxy --from https://vault.yourdomain.com --to http://vaultwarden:80
    depends_on:
      - vaultwarden

  backup:
    image: ttionya/vaultwarden-backup:latest
    restart: always
    environment:
      # 如果 rclone config 中 remote name 不是 BitwardenBackup,需取消注释并修改
      # RCLONE_REMOTE_NAME: 'BitwardenBackup'
      # RCLONE_REMOTE_DIR: '/BitwardenBackup/' # 远程存储的具体目录

      CRON: '0 */6 * * *' # 每6小时备份一次,可根据需求调整
      ZIP_PASSWORD: 'your_backup_zip_password' # 可选,给备份压缩包加一层密码
      # ZIP_ENABLE: 'TRUE'
      # ZIP_TYPE: 'zip'

      BACKUP_FILE_SUFFIX: '%Y%m%d_%H%M%S' # 文件名后缀,确保唯一性
      BACKUP_KEEP_DAYS: 2 # 保留2天的本地备份,节省空间
      TIMEZONE: 'Asia/Shanghai' # 设置时区

    volumes:
      - vaultwarden-data:/bitwarden/data/ # 挂载 Vaultwarden 数据目录供备份
      - vaultwarden-rclone-data:/config/ # 挂载 Rclone 配置目录
    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

第三步:防火墙与启动

  1. 开放端口:登录你的 VPS 控制台(如 Oracle Cloud, AWS, 阿里云等),确保安全组或防火墙已放行 80443 端口。
  2. 启动服务
    sudo docker compose up -d
    

写在最后

从 NodeWarden 迁移到 Vaultwarden,虽然失去了一层“零成本”的光环,但换来的是数据的完全掌控权连接稳定性。Caddy 的自动 HTTPS 让配置变得极其简单,而 Rclone 的自动备份则消除了对单一存储介质的担忧。

对于重视隐私和数据安全的同学来说,这绝对是一次值得的升级。你的密码库,值得更安全的港湾。

小贴士:迁移前,请务必记得先在 NodeWarden 中导出完整备份,并在新的 Vaultwarden 中导入,以确保数据无缝衔接。

标签: none

评论已关闭