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 上行即可满足多人使用额外建议开启自动快照功能为磁盘层面提供额外保护数据安全永远比省钱重要。建议同时配置本地备份 对象存储异地备份的双保险策略本文将详细讲解实现方法。前置准备基础环境安装# 更新系统aptupdateaptupgrade-y# 安装 Docker 和必要工具curl-fsSLhttps://get.docker.com|shaptinstall-ydocker-compose-plugin sqlite3croncurl# 安装 rclone用于对象存储同步curlhttps://rclone.org/install.sh|bash目录结构规划mkdir-p/opt/vaultwarden/{data,backup,scripts}# data/ - Vaultwarden 数据目录# backup/ - 本地备份存储# scripts/ - 备份脚本配置步骤1. 基础 Docker Compose 部署# /opt/vaultwarden/docker-compose.ymlversion:3.8services:vaultwarden:image:vaultwarden/server:latestcontainer_name:vaultwardenrestart:unless-stoppedports:-127.0.0.1:8080:80volumes:-/opt/vaultwarden/data:/dataenvironment:# 管理员面板 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.comSMTP_PORT:587SMTP_FROM:vaultyourdomain.comSMTP_USERNAME:${SMTP_USER}SMTP_PASSWORD:${SMTP_PASS}生成安全的 ADMIN_TOKEN# 生成高强度随机 Token32字节 base64openssl rand-base6448# 创建 .env 文件存储敏感变量cat/opt/vaultwarden/.envEOF ADMIN_TOKENyour_generated_token_here SMTP_USERyour_smtp_user SMTP_PASSyour_smtp_password EOFchmod600/opt/vaultwarden/.envADMIN_TOKEN 安全配置要点长度至少 40 个字符包含大小写字母、数字和特殊字符绝对不能与密码库密码相同定期轮换建议每 6 个月一次使用.env文件而非直接写入docker-compose.yml2. SQLite WAL 备份脚本Vaultwarden 默认使用 SQLite 存储数据其 WALWrite-Ahead Logging模式允许在数据库写入时进行在线热备。# /opt/vaultwarden/scripts/backup-sqlite.sh#!/bin/bashset-euopipefailVAULTWARDEN_DATA/opt/vaultwarden/dataBACKUP_DIR/opt/vaultwarden/backupTIMESTAMP$(date%Y%m%d_%H%M%S)BACKUP_FILE${BACKUP_DIR}/vaultwarden_${TIMESTAMP}.sqlite3RETENTION_DAYS30# 创建备份目录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 sends2/dev/null||true# 校验备份文件完整性ifsqlite3${BACKUP_FILE}PRAGMA integrity_check;|grep-q^ok$;thenecho[$(date)] 备份成功${BACKUP_FILE}elseecho[$(date)] 备份校验失败2exit1fi# 清理超过保留期的旧备份find${BACKUP_DIR}-namevaultwarden_*.sqlite3-mtime${RETENTION_DAYS}-deletefind${BACKUP_DIR}-nameattachments_*.tar.gz-mtime${RETENTION_DAYS}-deleteecho[$(date)] 本地备份完成保留最近${RETENTION_DAYS}天chmodx /opt/vaultwarden/scripts/backup-sqlite.sh# 设置 cron 定时任务每天凌晨 3:00 执行echo0 3 * * * root /opt/vaultwarden/scripts/backup-sqlite.sh /var/log/vaultwarden-backup.log 21\/etc/cron.d/vaultwarden-backup3. rclone 同步到对象存储S3 兼容# 配置 rclone交互式配置rclone config# 配置示例使用雨云对象存储或其他 S3 兼容服务# 选择 s3 → AWS S3 or compatible# 填写 endpoint、access_key_id、secret_access_keyrclone 配置文件示例~/.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/bashset-euopipefailBACKUP_DIR/opt/vaultwarden/backupREMOTE_PATHmyoss:vaultwarden-backupLOG_FILE/var/log/vaultwarden-sync.logecho[$(date)] 开始同步备份到对象存储...|tee-a${LOG_FILE}# 同步备份文件到对象存储仅上传新文件删除远端旧文件rclonesync${BACKUP_DIR}${REMOTE_PATH}\--min-age 5m\--log-file${LOG_FILE}\--log-level INFOecho[$(date)] 同步完成|tee-a${LOG_FILE}# 验证远端文件数量REMOTE_COUNT$(rclonels${REMOTE_PATH}|wc-l)echo[$(date)] 远端备份文件数${REMOTE_COUNT}|tee-a${LOG_FILE}chmodx /opt/vaultwarden/scripts/sync-to-oss.sh# 添加到 cron每天凌晨 4:00 执行在本地备份完成后echo0 4 * * * root /opt/vaultwarden/scripts/sync-to-oss.sh\/etc/cron.d/vaultwarden-backup4. 迁移到 PostgreSQL当用户数量超过 20 人或需要更高并发读写性能时建议切换到 PostgreSQL。步骤一部署 PostgreSQL# 在 docker-compose.yml 中添加 PostgreSQL 服务services:postgres:image:postgres:16-alpinecontainer_name:vaultwarden-dbrestart:unless-stoppedvolumes:-/opt/vaultwarden/pgdata:/var/lib/postgresql/dataenvironment:POSTGRES_DB:vaultwardenPOSTGRES_USER:vaultwardenPOSTGRES_PASSWORD:${PG_PASSWORD}healthcheck:test:[CMD-SHELL,pg_isready -U vaultwarden]interval:10stimeout:5sretries:5步骤二停机迁移数据# 1. 停止 Vaultwardendockercompose stop vaultwarden# 2. 导出 SQLite 数据sqlite3 /opt/vaultwarden/data/db.sqlite3 .dump/tmp/vaultwarden_dump.sql# 3. 启动 PostgreSQLdockercompose up-dpostgres# 4. 使用迁移工具推荐使用官方迁移脚本pip3installsqlite-to-postgres2/dev/null||\pipinstallsqlite-utils psycopg2-binary# 5. 更新 Vaultwarden 环境变量# 在 docker-compose.yml 中添加# DATABASE_URL: postgresql://vaultwarden:${PG_PASSWORD}postgres/vaultwarden# 6. 重启 Vaultwarden首次启动会自动创建表结构dockercompose up-dvaultwarden核心功能备份验证与恢复演练# 从备份恢复测试场景BACKUP_FILE/opt/vaultwarden/backup/vaultwarden_20260523_030000.sqlite3# 停止服务dockercompose stop vaultwarden# 替换数据库cp/opt/vaultwarden/data/db.sqlite3 /opt/vaultwarden/data/db.sqlite3.bakcp${BACKUP_FILE}/opt/vaultwarden/data/db.sqlite3# 恢复 attachmentstar-xzf/opt/vaultwarden/backup/attachments_20260523_030000.tar.gz\-C/opt/vaultwarden/data/# 重启服务并验证dockercompose up-dvaultwarden进阶技巧监控备份健康状态# 创建监控脚本发送 HTTP 通知到 Uptime Kuma 或 ntfycat/opt/vaultwarden/scripts/notify-backup.shEOF #!/bin/bash # 备份完成后 ping 监控端点 curl -s https://your-uptime-kuma.com/api/push/YOUR_TOKEN?statusupmsgbackup_ok /dev/null EOF双重加密备份# 使用 GPG 加密备份文件gpg--symmetric--cipher-algo AES256${BACKUP_FILE}# 生成 ${BACKUP_FILE}.gpg删除原文件后上传到对象存储常见问题QSQLite 备份时报 “database is locked”确认 Vaultwarden 的 WAL 模式已启用。检查db.sqlite3-wal文件是否存在这是正常现象备份脚本中使用的.backup命令支持 WAL 在线热备。Qrclone sync 速度太慢添加--transfers 4 --checkers 8参数增加并行传输数量或使用rclone copy替代sync仅上传新文件。Q切换 PostgreSQL 后数据丢失迁移前务必保留完整的 SQLite 备份并在 Vaultwarden 日志中确认数据库连接字符串正确。可通过docker compose logs vaultwarden | grep Database查看连接状态。QADMIN_TOKEN 忘记了怎么办从.env文件或 docker-compose.yml 的环境变量中查找。如果确实遗失停止容器修改环境变量为新 Token重启即可生效不影响用户密码库数据。密码安全无小事完善的备份策略是 Vaultwarden 自托管的必修课。从 SQLite 热备到异地对象存储再到 PostgreSQL 高可用一步步将个人密码管理打造成生产级可靠系统。想要低成本起步雨云服务器 rainyun-com1 核 2GB 机型完全够用使用优惠码2026off享 5 折优惠把省下来的钱用于对象存储备份服务才是真正的安全投资。