Podman 部署应用的数据备份与恢复完全指南

一、概述

本文档整理了使用 Podman 部署的以下应用的备份与恢复方法:

  • Vaultwarden(密码管理器)
  • Wallos(个人财务/订阅管理)
  • Linkding(书签管理器)

这三个应用默认都使用 SQLite 作为数据库,可以采用相同的备份策略。


二、数据库知识基础

2.1 为什么不能直接 cp 复制数据库文件?

SQLite 数据库在运行时直接复制可能导致文件损坏。正确做法是使用 SQLite 的在线热备份功能。

2.2 .backup 命令的作用

sqlite3 /data/db.sqlite3 ".backup /data/db_backup.sqlite3"

这条命令会:

  1. 遍历数据库的所有页面
  2. 处理 WAL 日志文件中的未提交更改
  3. 生成一个事务级别一致的快照文件

等效写法(更直观):

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   # 验证安装
exit

3.3 方法三:暂停容器后复制(最安全,有短暂中断)

# 暂停容器(冻结进程,网络中断但容器不停止)
podman pause container_name

# 备份数据目录
tar -czf /backup/data_$(date +%Y%m%d).tar.gz -C /path/to/data .

# 恢复运行
podman unpause container_name

3.4 方法四:停止容器后复制(最简单,停机时间较长)

podman stop container_name
tar -czf /backup/data_$(date +%Y%m%d).tar.gz -C /path/to/data .
podman start container_name

3.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必须
上传的图标/Logoimages/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 使用直接复制的备份文件恢复

如果备份是直接 cptar 打包的整个目录:

# 1. 停止容器
podman stop vaultwarden

# 2. 将整个备份目录覆盖回去
rm -rf /path/to/data/*
cp -r /backup/data/* /path/to/data/

# 3. 启动容器
podman start vaultwarden

需要同时恢复 db.sqlite3db.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 工具

解决方案

  1. 在宿主机安装 sqlite3 直接备份(推荐)
  2. 进入容器安装:apk add sqlite(Alpine)

Q2: 恢复后图标都不显示了怎么办?

原因icon_cache 没有备份

解决方案

  • 耐心等待,Vaultwarden 会按需重新下载
  • 或在客户端手动刷新每个条目

Q3: 恢复后提示数据库损坏?

原因:备份文件本身不一致(直接 cp 导致的)

解决方案

  • 使用 .backup 命令重新生成备份
  • 或使用 podman pause 后再复制

Q4: 容器内安装 sqlite3 会消耗很多资源吗?

不会

  • 磁盘:约 1-2 MB
  • 内存:仅执行时占用几 MB
  • 不影响 Vaultwarden 运行性能

九、关键要点总结

  1. 最佳备份方式:宿主机安装 sqlite3,使用 .backup 命令热备份
  2. 备份核心db.sqlite3 是唯一必须备份的文件
  3. 图标缓存icon_cache 不需要备份,丢了会自动重建
  4. WAL/SHM 文件:使用 .backup 时不需要关心这些文件
  5. 恢复流程:停止容器 → 替换 db.sqlite3 → 启动容器
  6. 统一策略:Vaultwarden、Wallos、Linkding 都是 SQLite,备份方法相同

文档整理日期:2026年4月

标签: none

添加新评论