Podman的Vaultwarden-Wallos-Linkding备份
Podman 部署应用的数据备份与恢复完全指南
一、概述
本文档整理了使用 Podman 部署的以下应用的备份与恢复方法:
- Vaultwarden(密码管理器)
- Wallos(个人财务/订阅管理)
- Linkding(书签管理器)
这三个应用默认都使用 SQLite 作为数据库,可以采用相同的备份策略。
二、数据库知识基础
2.1 为什么不能直接 cp 复制数据库文件?
SQLite 数据库在运行时直接复制可能导致文件损坏。正确做法是使用 SQLite 的在线热备份功能。
2.2 .backup 命令的作用
sqlite3 /data/db.sqlite3 ".backup /data/db_backup.sqlite3"这条命令会:
- 遍历数据库的所有页面
- 处理 WAL 日志文件中的未提交更改
- 生成一个事务级别一致的快照文件
等效写法(更直观):
sqlite3 /data/db.sqlite3 ".backup /data/db_backup.sqlite3"2.3 关于 WAL 和 SHM 文件
| 文件 | 作用 | 是否需要备份 |
|---|---|---|
db.sqlite3-wal | 预写日志,记录未写入主库的更改 | ❌ 使用 .backup 时不需要 |
db.sqlite3-shm | 共享内存,运行时临时文件 | ❌ 永远不需要备份 |
.backup 命令会自动处理 WAL 文件中的内容,生成的备份是完整的独立文件。
三、备份方法
3.1 方法一:宿主机安装 sqlite3 直接备份(最推荐)
优点:不影响运行中的容器,数据一致,操作简单
在宿主机安装 sqlite3:
# Ubuntu/Debian
sudo apt install sqlite3
# CentOS/RHEL/Fedora
sudo dnf install sqlite3
# Arch Linux
sudo pacman -S sqlite3备份命令:
# 进入数据目录
cd /path/to/app/data
# 热备份数据库
sqlite3 db.sqlite3 ".backup /backup/app_$(date +%Y%m%d_%H%M%S).sqlite3"3.2 方法二:容器内安装 sqlite3(资源消耗可忽略)
sqlite3 工具:
- 磁盘占用:约 1-2 MB
- 内存占用:仅在执行时占用几 MB,平时为 0
- 性能影响:无
在容器内安装(Alpine Linux 镜像):
podman exec -it vaultwarden /bin/sh
apk update
apk add sqlite
sqlite3 --version # 验证安装
exit3.3 方法三:暂停容器后复制(最安全,有短暂中断)
# 暂停容器(冻结进程,网络中断但容器不停止)
podman pause container_name
# 备份数据目录
tar -czf /backup/data_$(date +%Y%m%d).tar.gz -C /path/to/data .
# 恢复运行
podman unpause container_name3.4 方法四:停止容器后复制(最简单,停机时间较长)
podman stop container_name
tar -czf /backup/data_$(date +%Y%m%d).tar.gz -C /path/to/data .
podman start container_name3.5 方法对比
| 方式 | 一致性 | 停机时间 | 操作复杂度 | 推荐度 |
|---|---|---|---|---|
| 宿主机 sqlite3 .backup | ✅ 高 | 无 | 低 | ⭐⭐⭐⭐⭐ |
| 容器内 sqlite3 .backup | ✅ 高 | 无 | 中 | ⭐⭐⭐⭐ |
| pause 后复制 | ✅ 最高 | 秒级 | 低 | ⭐⭐⭐⭐ |
| stop 后复制 | ✅ 高 | 较长 | 低 | ⭐⭐⭐ |
| 直接 cp(不暂停) | ❌ 可能损坏 | 无 | 低 | ❌ 不推荐 |
四、各应用的具体数据位置
4.1 Vaultwarden
| 数据类型 | 存储位置 | 是否必须备份 |
|---|---|---|
| 数据库(密码、笔记、身份卡等) | db.sqlite3 | ✅ 必须 |
| 附件 | attachments/ | ⚠️ 有则备份 |
| 图标缓存 | icon_cache/ | ❌ 不需要 |
| Send 文件 | sends/ | ⚠️ 有则备份 |
| 配置文件 | config.json | ⚠️ 有修改则备份 |
| RSA 密钥 | rsa_key* | ⚠️ 组织功能需要 |
4.2 Wallos
| 数据类型 | 存储位置 | 是否必须备份 |
|---|---|---|
| 数据库 | db/wallos.db | ✅ 必须 |
| 上传的图标/Logo | images/uploads/ 或 logos/ | ⚠️ 有则备份 |
4.3 Linkding
| 数据类型 | 存储位置 | 是否必须备份 |
|---|---|---|
| 数据库 | data/db.sqlite3 | ✅ 必须 |
| 书签图标 | data/icons/ | ❌ 不需要 |
判断 Linkding 使用的数据库类型:
- 未配置
LD_DB_ENGINE→ 使用 SQLite(默认) - 配置了
LD_DB_ENGINE=postgres→ 使用 PostgreSQL,需用pg_dump备份
五、备份数据详解
5.1 数据库内容说明
Vaultwarden 的 db.sqlite3 包含:
- 登录信息(用户名、密码、网址)
- 笔记(Secure Notes)
- 身份卡(Identities:姓名、地址、护照号等)
- 支付卡信息
- 文件夹和组织数据
5.2 icon_cache 为什么可以不备份?
icon_cache是纯粹的缓存目录- 丢失后 Vaultwarden 会自动重新下载图标
- 不会导致任何错误或数据丢失
- 只是恢复后首次显示图标时可能稍慢
5.3 禁用图标功能的方法
方法一:客户端禁用(推荐)
- 浏览器扩展:设置 → 选项 → 取消"显示网站图标"
- 桌面应用:设置 → 选项 → 禁用"显示网站图标"
- 手机 App:设置 → 其他 → 关闭"网站图标"
方法二:服务端禁用
# 环境变量
-e DISABLE_ICON_DOWNLOAD=true方法三:禁止图标过期刷新
# 图标永不过期,不再主动刷新
-e ICON_CACHE_TTL=0六、恢复方法
6.1 使用 .backup 备份文件恢复(最干净)
# 1. 停止容器
podman stop vaultwarden
# 2. 清空数据目录(或重命名备份)
rm -rf /path/to/data/*
# 或:mv /path/to/data /path/to/data.old && mkdir -p /path/to/data
# 3. 将备份文件复制并重命名
cp /backup/db_backup.sqlite3 /path/to/data/db.sqlite3
# 4. 如果有 config.json,也复制过去
cp /backup/config.json /path/to/data/
# 5. 启动容器
podman start vaultwarden注意:不需要管 -wal 和 -shm 文件,容器启动时会自动生成。
6.2 使用直接复制的备份文件恢复
如果备份是直接 cp 或 tar 打包的整个目录:
# 1. 停止容器
podman stop vaultwarden
# 2. 将整个备份目录覆盖回去
rm -rf /path/to/data/*
cp -r /backup/data/* /path/to/data/
# 3. 启动容器
podman start vaultwarden需要同时恢复 db.sqlite3 和 db.sqlite3-wal 文件,-shm 文件不需要。
6.3 无附件时的极简恢复
如果从未上传过附件:
- 只需要恢复
db.sqlite3一个文件即可 - 其他目录会自动创建
七、自动化备份脚本示例
#!/bin/bash
# 备份脚本:同时备份 Vaultwarden、Wallos、Linkding
BACKUP_DIR="/backup/sqlite_apps"
DATE=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p "$BACKUP_DIR"
# 备份 Vaultwarden
echo "备份 Vaultwarden..."
sqlite3 /path/to/vaultwarden/data/db.sqlite3 ".backup '$BACKUP_DIR/vaultwarden_$DATE.sqlite3'"
# 备份 Wallos
echo "备份 Wallos..."
sqlite3 /path/to/wallos/data/db/wallos.db ".backup '$BACKUP_DIR/wallos_$DATE.sqlite3'"
# 备份 Linkding
echo "备份 Linkding..."
sqlite3 /path/to/linkding/data/db.sqlite3 ".backup '$BACKUP_DIR/linkding_$DATE.sqlite3'"
# 删除 30 天前的备份
find "$BACKUP_DIR" -name "*.sqlite3" -mtime +30 -delete
echo "备份完成: $BACKUP_DIR"设置定时任务(每天凌晨 2 点执行)
crontab -e
# 添加以下行
0 2 * * * /path/to/backup_script.sh八、常见问题
Q1: 执行备份时提示 "sqlite3: not found"
原因:容器内没有安装 sqlite3 工具
解决方案:
- 在宿主机安装 sqlite3 直接备份(推荐)
- 进入容器安装:
apk add sqlite(Alpine)
Q2: 恢复后图标都不显示了怎么办?
原因:icon_cache 没有备份
解决方案:
- 耐心等待,Vaultwarden 会按需重新下载
- 或在客户端手动刷新每个条目
Q3: 恢复后提示数据库损坏?
原因:备份文件本身不一致(直接 cp 导致的)
解决方案:
- 使用
.backup命令重新生成备份 - 或使用
podman pause后再复制
Q4: 容器内安装 sqlite3 会消耗很多资源吗?
不会:
- 磁盘:约 1-2 MB
- 内存:仅执行时占用几 MB
- 不影响 Vaultwarden 运行性能
九、关键要点总结
- 最佳备份方式:宿主机安装 sqlite3,使用
.backup命令热备份 - 备份核心:
db.sqlite3是唯一必须备份的文件 - 图标缓存:
icon_cache不需要备份,丢了会自动重建 - WAL/SHM 文件:使用
.backup时不需要关心这些文件 - 恢复流程:停止容器 → 替换
db.sqlite3→ 启动容器 - 统一策略:Vaultwarden、Wallos、Linkding 都是 SQLite,备份方法相同
文档整理日期:2026年4月