Vaultwarden 数据备份与高可用方案:SQLite 自动备份、迁移 PostgreSQL、异地容灾

Vaultwarden 数据备份与高可用方案:SQLite 自动备份、迁移 PostgreSQL、异地容灾

Vaultwarden 是 Bitwarden 服务端的轻量级 Rust 实现,凭借极低的资源占用成为自托管密码管理的首选。然而,密码数据库一旦损坏或丢失,后果极为严重。本文聚焦生产级备份与高可用,从 SQLite WAL 热备、rclone 异地同步,到切换 PostgreSQL 提升稳定性,帮助你在单台 VPS 上构建可靠的密码管理基础设施。


服务器配置

密码管理服务对计算资源要求不高,但对数据可靠性要求极高。推荐使用 雨云服务器 rainyun-com,注册填优惠码 2026off 领 5 折优惠券,选择 1 核 2GB 内存机型即可轻松运行 Vaultwarden 及其备份套件。

  • 推荐机型:1 核 2GB / SSD 40GB
  • 操作系统:Debian 12 或 Ubuntu 22.04 LTS
  • 带宽要求:1Mbps 上行即可满足多人使用
  • 额外建议:开启自动快照功能,为磁盘层面提供额外保护

数据安全永远比省钱重要。建议同时配置本地备份 + 对象存储异地备份的双保险策略,本文将详细讲解实现方法。


前置准备

基础环境安装

# 更新系统
apt update && apt upgrade -y

# 安装 Docker 和必要工具
curl -fsSL https://get.docker.com | sh
apt install -y docker-compose-plugin sqlite3 cron curl

# 安装 rclone(用于对象存储同步)
curl https://rclone.org/install.sh | bash

目录结构规划

mkdir -p /opt/vaultwarden/{data,backup,scripts}
# data/    - Vaultwarden 数据目录
# backup/  - 本地备份存储
# scripts/ - 备份脚本

配置步骤

1. 基础 Docker Compose 部署

# /opt/vaultwarden/docker-compose.yml
version: "3.8"
services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:80"
    volumes:
      - /opt/vaultwarden/data:/data
    environment:
      # 管理员面板 Token(强烈建议设置为随机长字符串)
      ADMIN_TOKEN: "${ADMIN_TOKEN}"
      # 禁止公开注册,仅管理员邀请
      SIGNUPS_ALLOWED: "false"
      # 启用管理员面板
      ADMIN_ENABLED: "true"
      # 域名配置(必须与实际访问地址一致)
      DOMAIN: "https://vault.yourdomain.com"
      # 日志级别
      LOG_LEVEL: "warn"
      # SMTP 邮件(用于 2FA 和邀请)
      SMTP_HOST: "smtp.example.com"
      SMTP_PORT: "587"
      SMTP_FROM: "vault@yourdomain.com"
      SMTP_USERNAME: "${SMTP_USER}"
      SMTP_PASSWORD: "${SMTP_PASS}"

生成安全的 ADMIN_TOKEN

# 生成高强度随机 Token(32字节 base64)
openssl rand -base64 48

# 创建 .env 文件存储敏感变量
cat > /opt/vaultwarden/.env << 'EOF'
ADMIN_TOKEN=your_generated_token_here
SMTP_USER=your_smtp_user
SMTP_PASS=your_smtp_password
EOF

chmod 600 /opt/vaultwarden/.env

ADMIN_TOKEN 安全配置要点

  • 长度至少 40 个字符,包含大小写字母、数字和特殊字符
  • 绝对不能与密码库密码相同
  • 定期轮换(建议每 6 个月一次)
  • 使用 .env 文件而非直接写入 docker-compose.yml

2. SQLite WAL 备份脚本

Vaultwarden 默认使用 SQLite 存储数据,其 WAL(Write-Ahead Logging)模式允许在数据库写入时进行在线热备。

# /opt/vaultwarden/scripts/backup-sqlite.sh
#!/bin/bash

set -euo pipefail

VAULTWARDEN_DATA="/opt/vaultwarden/data"
BACKUP_DIR="/opt/vaultwarden/backup"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/vaultwarden_${TIMESTAMP}.sqlite3"
RETENTION_DAYS=30

# 创建备份目录
mkdir -p "${BACKUP_DIR}"

# 使用 SQLite .backup 命令进行在线热备(WAL 安全)
sqlite3 "${VAULTWARDEN_DATA}/db.sqlite3" ".backup '${BACKUP_FILE}'"

# 同时备份 attachments 和 sends 目录
tar -czf "${BACKUP_DIR}/attachments_${TIMESTAMP}.tar.gz" \
    -C "${VAULTWARDEN_DATA}" attachments sends 2>/dev/null || true

# 校验备份文件完整性
if sqlite3 "${BACKUP_FILE}" "PRAGMA integrity_check;" | grep -q "^ok$"; then
    echo "[$(date)] 备份成功:${BACKUP_FILE}"
else
    echo "[$(date)] 备份校验失败!" >&2
    exit 1
fi

# 清理超过保留期的旧备份
find "${BACKUP_DIR}" -name "vaultwarden_*.sqlite3" -mtime +${RETENTION_DAYS} -delete
find "${BACKUP_DIR}" -name "attachments_*.tar.gz" -mtime +${RETENTION_DAYS} -delete

echo "[$(date)] 本地备份完成,保留最近 ${RETENTION_DAYS} 天"
chmod +x /opt/vaultwarden/scripts/backup-sqlite.sh

# 设置 cron 定时任务(每天凌晨 3:00 执行)
echo "0 3 * * * root /opt/vaultwarden/scripts/backup-sqlite.sh >> /var/log/vaultwarden-backup.log 2>&1" \
    > /etc/cron.d/vaultwarden-backup

3. rclone 同步到对象存储(S3 兼容)

# 配置 rclone(交互式配置)
rclone config

# 配置示例(使用雨云对象存储或其他 S3 兼容服务)
# 选择 s3 → AWS S3 or compatible
# 填写 endpoint、access_key_id、secret_access_key

rclone 配置文件示例~/.config/rclone/rclone.conf):

[myoss]
type = s3
provider = Other
endpoint = https://oss.yourstorage.com
access_key_id = YOUR_ACCESS_KEY
secret_access_key = YOUR_SECRET_KEY
region = auto

创建异地同步脚本

# /opt/vaultwarden/scripts/sync-to-oss.sh
#!/bin/bash

set -euo pipefail

BACKUP_DIR="/opt/vaultwarden/backup"
REMOTE_PATH="myoss:vaultwarden-backup"
LOG_FILE="/var/log/vaultwarden-sync.log"

echo "[$(date)] 开始同步备份到对象存储..." | tee -a "${LOG_FILE}"

# 同步备份文件到对象存储(仅上传新文件,删除远端旧文件)
rclone sync "${BACKUP_DIR}" "${REMOTE_PATH}" \
    --min-age 5m \
    --log-file="${LOG_FILE}" \
    --log-level INFO

echo "[$(date)] 同步完成" | tee -a "${LOG_FILE}"

# 验证远端文件数量
REMOTE_COUNT=$(rclone ls "${REMOTE_PATH}" | wc -l)
echo "[$(date)] 远端备份文件数:${REMOTE_COUNT}" | tee -a "${LOG_FILE}"
chmod +x /opt/vaultwarden/scripts/sync-to-oss.sh

# 添加到 cron(每天凌晨 4:00 执行,在本地备份完成后)
echo "0 4 * * * root /opt/vaultwarden/scripts/sync-to-oss.sh" \
    >> /etc/cron.d/vaultwarden-backup

4. 迁移到 PostgreSQL

当用户数量超过 20 人或需要更高并发读写性能时,建议切换到 PostgreSQL。

步骤一:部署 PostgreSQL

# 在 docker-compose.yml 中添加 PostgreSQL 服务
services:
  postgres:
    image: postgres:16-alpine
    container_name: vaultwarden-db
    restart: unless-stopped
    volumes:
      - /opt/vaultwarden/pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: vaultwarden
      POSTGRES_USER: vaultwarden
      POSTGRES_PASSWORD: "${PG_PASSWORD}"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U vaultwarden"]
      interval: 10s
      timeout: 5s
      retries: 5

步骤二:停机迁移数据

# 1. 停止 Vaultwarden
docker compose stop vaultwarden

# 2. 导出 SQLite 数据
sqlite3 /opt/vaultwarden/data/db.sqlite3 .dump > /tmp/vaultwarden_dump.sql

# 3. 启动 PostgreSQL
docker compose up -d postgres

# 4. 使用迁移工具(推荐使用官方迁移脚本)
pip3 install sqlite-to-postgres 2>/dev/null || \
    pip install sqlite-utils psycopg2-binary

# 5. 更新 Vaultwarden 环境变量
# 在 docker-compose.yml 中添加:
# DATABASE_URL: "postgresql://vaultwarden:${PG_PASSWORD}@postgres/vaultwarden"

# 6. 重启 Vaultwarden(首次启动会自动创建表结构)
docker compose up -d vaultwarden

核心功能

备份验证与恢复演练

# 从备份恢复(测试场景)
BACKUP_FILE="/opt/vaultwarden/backup/vaultwarden_20260523_030000.sqlite3"

# 停止服务
docker compose stop vaultwarden

# 替换数据库
cp /opt/vaultwarden/data/db.sqlite3 /opt/vaultwarden/data/db.sqlite3.bak
cp "${BACKUP_FILE}" /opt/vaultwarden/data/db.sqlite3

# 恢复 attachments
tar -xzf /opt/vaultwarden/backup/attachments_20260523_030000.tar.gz \
    -C /opt/vaultwarden/data/

# 重启服务并验证
docker compose up -d vaultwarden

进阶技巧

监控备份健康状态

# 创建监控脚本,发送 HTTP 通知到 Uptime Kuma 或 ntfy
cat > /opt/vaultwarden/scripts/notify-backup.sh << 'EOF'
#!/bin/bash
# 备份完成后 ping 监控端点
curl -s "https://your-uptime-kuma.com/api/push/YOUR_TOKEN?status=up&msg=backup_ok" >/dev/null
EOF

双重加密备份

# 使用 GPG 加密备份文件
gpg --symmetric --cipher-algo AES256 "${BACKUP_FILE}"
# 生成 ${BACKUP_FILE}.gpg,删除原文件后上传到对象存储

常见问题

Q:SQLite 备份时报 “database is locked”?

确认 Vaultwarden 的 WAL 模式已启用。检查 db.sqlite3-wal 文件是否存在,这是正常现象,备份脚本中使用的 .backup 命令支持 WAL 在线热备。

Q:rclone sync 速度太慢?

添加 --transfers 4 --checkers 8 参数增加并行传输数量,或使用 rclone copy 替代 sync 仅上传新文件。

Q:切换 PostgreSQL 后数据丢失?

迁移前务必保留完整的 SQLite 备份,并在 Vaultwarden 日志中确认数据库连接字符串正确。可通过 docker compose logs vaultwarden | grep "Database" 查看连接状态。

Q:ADMIN_TOKEN 忘记了怎么办?

.env 文件或 docker-compose.yml 的环境变量中查找。如果确实遗失,停止容器,修改环境变量为新 Token,重启即可生效(不影响用户密码库数据)。


密码安全无小事,完善的备份策略是 Vaultwarden 自托管的必修课。从 SQLite 热备到异地对象存储,再到 PostgreSQL 高可用,一步步将个人密码管理打造成生产级可靠系统。想要低成本起步,雨云服务器 rainyun-com 1 核 2GB 机型完全够用,使用优惠码 2026off 享 5 折优惠,把省下来的钱用于对象存储备份服务,才是真正的安全投资。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值