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 折优惠,把省下来的钱用于对象存储备份服务,才是真正的安全投资。
190

被折叠的 条评论
为什么被折叠?



