专题 1 个子章节

自建 Vaultwarden:部署、安全配置与异地备份

梦随乡兮 梦随乡兮 #Vaultwarden#Bitwarden#Cloudflare Tunnel#Docker#备份

记录如何用 Google Cloud、Docker 与 Cloudflare Tunnel 部署 Vaultwarden,并为密码库补上安全配置和 OneDrive 异地备份。

一些网站密码泄露后,我检查了浏览器里保存的 700 多条密码,发现不少密码存在重复使用。于是我把密码迁移到了 Vaultwarden,服务端运行在 Google Cloud,通过 Cloudflare Tunnel 对外访问。

这套部署以我 2025 年 7 月使用的免费额度和控制台界面为准。云服务的免费范围可能变化,创建实例前需要重新核对 Google Cloud 的当前说明。

部署结构

  1. Google Cloud (GCP) - 你的免费服务器

    • 作用:提供一台位于美国,24 小时运行的微型虚拟服务器 (e2-micro)。
    • 免费点:GCP 提供“始终免费”层级,其中就包含了这台服务器、30GB 的硬盘和每月 1GB 的对外流量。这对密码库来说绰绰有余。
  2. Cloudflare Tunnel - 访问通道

    • 作用:连接 GCP 上的服务与 Cloudflare 网络。
    • 安全点:Vaultwarden 不需要直接开放 HTTP 或 HTTPS 入站端口,外部访问经过 Cloudflare Tunnel。
    • 免费点:我部署时使用的是 Cloudflare 的免费方案。
  3. Vaultwarden - 你的轻量级密码管家

    • 作用:提供兼容 Bitwarden 客户端的开源服务端,对服务器资源要求较低,适合运行在微型实例上。

准备工作

  1. 一个 Google Cloud 账号点击注册。需要绑定一张信用卡用于身份验证,但只要你不超出免费额度,就不会被收费。
  2. 一个 Cloudflare 账号点击注册。免费套餐即可。
  3. 一个你自己的域名:这是你访问密码库的地址。可以在NamecheapGoDaddy等平台购买,一年费用通常几十元人民币。购买后,需要按照 Cloudflare 的提示,将域名的 DNS 服务器修改为 Cloudflare 的服务器。

创建 Google Cloud 服务器

  1. 登录 Google Cloud Console
  2. 导航到 “计算引擎(Compute Engine)” > “VM 实例”,然后点击 “创建实例”
  3. 按照以下关键配置进行设置,确保免费:
    • 名称:随意,例如 bitwarden-server
    • 区域(Region)务必选择以下三个之一(us-west1离中国最近):
      • us-west1(俄勒冈)
      • us-central1(爱荷华)
      • us-east1(南卡罗来纳)
    • 机器类型(Machine type):选择 e2-micro
    • 启动磁盘(Boot disk):点击“更改”,将**“启动磁盘类型”**修改为 “标准永久性磁盘”,大小设置为30 GB 或更小。
    • 防火墙(Firewall)不要勾选 “允许 HTTP 流量” 或 “允许 HTTPS 流量”。

控制台右侧可能显示标准估算价格。是否能被免费额度抵扣,以创建实例时 Google Cloud 的规则和最终账单为准。

  1. 点击 “创建”,等待几分钟,你的免费服务器就准备好了。

安装 Vaultwarden

  1. 在 VM 实例列表中,找到你刚创建的服务器,点击最右侧的 “SSH” 按钮,浏览器会弹出一个终端窗口。
  2. 在终端里,依次输入以下命令来安装 Docker(一个容器化工具):
    Terminal window
    sudo apt-get update
    sudo apt-get install -y docker.io
  3. 运行下面这行命令,一键启动你的 Vaultwarden 密码库服务:
    Terminal window
    sudo docker run -d --name vaultwarden -v /vw-data/:/data/ -p 8080:80 --restart unless-stopped vaultwarden/server:latest

创建 Cloudflare Tunnel

  1. 登录 Cloudflare 仪表板,选择你的域名。
  2. 在左侧菜单中,找到并点击 “Zero Trust”
  3. 进入 Zero Trust 仪表板后,在左侧导航到 “Networks” > “Tunnels”
  4. 点击 “Create a tunnel”,给隧道起个名字(如bitwarden-gcp),保存。
  5. 在“Choose your environment”页面,选择 “Debian”,然后复制下面框里的那段以curl开头的命令。
  6. 回到你 GCP 的SSH 终端窗口,粘贴并运行刚刚复制的命令。这会自动安装并配置好通道。
  7. 稍等片刻,Cloudflare 页面会显示你的连接器已激活。点击 “Next”
  8. 现在配置公共访问地址:
    • 子域名 (Subdomain):输入你想要的地址前缀,例如 bw
    • 域名 (Domain):选择你的域名。
    • 服务 (Service)
      • Type: 选择 HTTP
      • URL: 输入 localhost:8080

解惑: 这里使用 HTTP 是安全的,因为这是cloudflared在服务器内部与 Vaultwarden 通信,流量并未离开服务器,不产生任何费用。你从外部访问https://bw.yourdomain.com的全程都是被 Cloudflare 加密的。

  1. 点击 “Save hostname”

等待一两分钟后访问 https://bw.yourdomain.com,确认 Bitwarden 登录页面可以打开。

安全配置与数据迁移

禁止新用户注册

在你注册完自己的账号后,为了安全,必须禁止其他人注册。

  1. 回到 GCP 的 SSH 终端。
  2. 依次执行以下三条命令,用新的配置重建容器(数据不会丢失):
    Terminal window
    # 停止当前容器
    sudo docker stop vaultwarden
    # 移除旧容器
    sudo docker rm vaultwarden
    # 使用禁止注册的配置重新启动
    sudo docker run -d --name vaultwarden -e SIGNUPS_ALLOWED=false -v /vw-data/:/data/ -p 8080:80 --restart unless-stopped vaultwarden/server:latest
  3. 刷新你的登录页面,会发现“创建账户”的按钮已经消失了。

从 Chrome 浏览器导入密码

  1. 导出:在 Chrome 地址栏输入 chrome://settings/passwords,在右侧菜单中选择“导出密码”。
  2. 导入:登录你的 Vaultwarden 网页版,进入 “工具” > “导入数据”,格式选择“Chrome (csv)”,然后上传文件即可。
  3. 清理:导出的.csv文件是明文,导入后请立即彻底删除它

配置浏览器插件

  1. Chrome 应用商店安装官方Bitwarden插件。
  2. 点击插件图标,点击左上角的齿轮设置
  3. 在**“服务器 URL”**中,填入你的完整域名 https://bw.yourdomain.com,保存。
  4. 用你的主密码登录插件。
  5. 回到chrome://settings/passwords,关闭“要约保存密码”和“自动登录”。

配置完成后,Bitwarden 插件会负责密码的自动填充和保存。

忘记主密码时怎么办

问:如果我忘记了 Vaultwarden 的主密码怎么办?

服务端管理员无法查看或重置 Vaultwarden 的主密码。

  • 唯一的机会:注册时设置的“密码提示”。
  • 最后的手段:管理员可以删除这个账户,让用户用原邮箱重新注册一个空密码库,但原有数据无法恢复。

VPS + Docker:Vaultwarden 自动备份到 OneDrive

梦随乡兮 梦随乡兮 #备份#解决#自动#踩坑#坑点

记录如何把 Vaultwarden 的数据打包并自动上传到 OneDrive,形成一套可长期运行的异地备份方案。

Vaultwarden 跑起来后,还需要把服务器上的数据定期复制到外部存储。我这里用 Rclone 把数据打包后上传到 Microsoft OneDrive,每天执行一次,并保留 7 天本地备份。

我的环境与目标

  • 服务器:Google Cloud VPS(Debian / Ubuntu 系统)
  • 服务:Vaultwarden(通过 Docker 部署)
  • 备份目标:Microsoft OneDrive
  • 最终目标:每日定时、自动执行、异地备份。

安装与配置 Rclone

1. 安装 Rclone

Terminal window
sudo -v ; curl https://rclone.org/install.sh | sudo bash

踩坑点 #1:解压工具缺失

遭遇:脚本报错 unzip 工具未找到。 分析:纯净的 VPS 系统缺少基础解压工具。 解决:先安装 unzipsudo apt-get update && sudo apt-get install unzip -y,然后重新运行安装脚本。

2. 配置 Rclone 运行 rclone config,根据提示开始配置。

  • 新建连接:选 n) New remote,命名为 onedrive
  • 选择云盘类型:选择 Microsoft OneDrive
  • 客户端 ID 和密钥:全部直接回车,留空。
  • 区域:直接回车,选择 global
  • 高级配置:选 n (No)。
  • 自动配置:选 n (No),这是在无浏览器 VPS 上的关键!

踩坑点 #2:如何在无浏览器的服务器上授权?

遭遇:选择了 n 之后,终端提示我需要一个 config_token分析:这是 Rclone 的远程授权机制,需要在有浏览器的电脑上生成授权令牌。 解决

  1. 自己的个人电脑上同样安装 Rclone。
  2. 在个人电脑的命令行中运行 rclone authorize "onedrive"
  3. 浏览器会自动弹出并引导你登录微软账户、授权。
  4. 授权成功后,回到个人电脑的命令行窗口,复制那一整大串 {...} 的 JSON 文本。
  5. 将这串文本完整地粘贴回VPS 的终端config_token> 提示符之后,按回车。

之后一路确认,选择你的个人 OneDrive,即可完成配置。

编写备份脚本

1. 找到 Vaultwarden 数据目录

踩坑点 #3:数据目录路径不确定

分析:备份脚本需要知道 Docker 容器映射到 VPS 上的真实数据路径。 解决:运行 sudo docker inspect vaultwarden,在输出中找到 "Mounts" 部分,里面的 "Source" 对应的路径就是我们需要的。在我的例子中是 "/vw-data"

2. 创建 backup.sh 脚本

运行 nano backup.sh,写入下面的代码:

Terminal window
# !/bin/bash
# 任何命令失败则立即退出
set -e
# --- 开始配置 ---
CONTAINER_NAME="vaultwarden"
VAULTWARDEN_DATA_DIR="/vw-data"
BACKUP_DIR="/home/imsxx_com/vaultwarden_backups"
RCLONE_REMOTE_NAME="onedrive"
ONEDRIVE_BACKUP_DIR="VaultwardenBackups"
RCLONE_CONFIG_PATH="/home/imsxx_com/.config/rclone/rclone.conf"
# --- 结束配置 ---
echo "备份流程开始于: $(date +"%Y-%m-%d %H:%M:%S")"
mkdir -p "$BACKUP_DIR"
BACKUP_FILE="vaultwarden-backup-$(date +%Y%m%d-%H%M%S).tar.gz"
BACKUP_FILE_PATH="$BACKUP_DIR/$BACKUP_FILE"
echo "准备停止 Vaultwarden 容器..."
sudo docker stop "$CONTAINER_NAME"
echo "容器已停止,开始创建备份文件: $BACKUP_FILE_PATH"
tar -czf "$BACKUP_FILE_PATH" -C "$VAULTWARDEN_DATA_DIR" .
echo "备份文件创建完成,准备重启 Vaultwarden 容器..."
sudo docker start "$CONTAINER_NAME"
echo "容器已重启。本地备份完成。"
echo "开始上传备份文件到 OneDrive..."
rclone --config "$RCLONE_CONFIG_PATH" copy "$BACKUP_FILE_PATH" "$RCLONE_REMOTE_NAME:$ONEDRIVE_BACKUP_DIR" --progress
echo "文件上传成功。"
echo "开始清理7天前的本地旧备份..."
find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +7 -delete
echo "旧备份清理完毕。"
echo "备份流程全部完成于: $(date +"%Y-%m-%d %H:%M:%S")"

3. 添加执行权限

Terminal window
chmod +x backup.sh

设置 Cron 定时任务

1. 手动执行脚本,发现权限“连环坑”

踩坑点 #4:sudo 密码问题

遭遇:设置了 cron 任务后,发现不执行。查看日志 cat ...backup.log,发现错误 sudo: a password is required分析cron 在后台非交互式环境运行,无法响应 sudo 的密码输入请求。 解决:通过 sudo visudo 命令,在打开的 sudoers 文件末尾添加一行,给予指定命令免密权限:

imsxx_com ALL=(ALL) NOPASSWD: /usr/bin/docker stop vaultwarden, /usr/bin/docker start vaultwarden

踩坑点 #5:tar 打包权限问题

遭遇:解决了 sudo 问题后,手动以普通用户身份 ./backup.sh 模拟 cron 执行,又报 tar: Permission denied

分析:之前用 sudo 运行脚本时,创建的 vaultwarden_backups 文件夹所有者是 root,普通用户 imsxx_com 没有写入权限。

解决:用 chown 命令将文件夹“物归原主”:

Terminal window
sudo chown -R imsxx_com:imsxx_com /home/imsxx_com/vaultwarden_backups

2. 最终的定时任务设置

踩坑点 #6:Cron 的执行环境问题

遭遇:解决权限问题后,手动运行 ./backup.sh 正常,但 cron 自动执行依然失败。 分析cron 的执行环境非常干净,它不知道各种命令的路径 (PATH),也不会加载用户的环境变量配置文件 (.profile)。这是 cron 任务失败最根本、最常见的原因。 解决:在 crontab 命令中,让 cron 在运行脚本前加载用户环境。

  1. 运行 crontab -e 打开编辑器。
  2. 写入下面这行任务配置:
Terminal window
10 0 * * * /bin/bash -c 'source ~/.profile; /home/imsxx_com/backup.sh' >> /home/imsxx_com/vaultwarden_backup.log 2>&1

这行命令让 cron 先加载 .profile 文件,再执行备份脚本。我设置的时间是北京时间每天的 00:10

调整时区并验证

1. 修改服务器时区为北京时间

Terminal window
sudo timedatectl set-timezone Asia/Shanghai

2. 验证备份结果

设置好 cron 后,等待设定时间,确认 OneDrive 中出现带有正确北京时间的备份文件。需要修改执行时间时,调整表达式前面的分钟和小时字段。例如每天凌晨 03 使用 0 3 * * *