# Docker 数据持久化、备份与恢复 **简体中文** · [English](./DOCKER_DATA_AND_BACKUP.en.md) > 文档更新:2026-10-20 ScrapeFun 容器可以随时重建,业务数据必须保存在宿主机。当前唯一推荐的 Compose 写法是把整个数据根目录挂载到 `/app/data`: ```yaml services: app: volumes: - ${SCRAPEFUN_DATA_DIR:-./scrapefun-data}:/app/data ``` 不要分别挂载 `db`、`images`、`config`、`custom-scrapers` 等子目录。分目录配置只能保护当时列出的内容,新版本增加 `user-avatars`、模型、缓存或其他运行目录后,未挂载的数据会留在容器可写层,并在容器重建时丢失。 ## 数据目录 默认宿主机目录是一键部署目录旁的 `~/scrapefun-data`;NAS 手动 Compose 通常使用项目目录下的 `./scrapefun-data`。实际路径以 `.updater.env` 的 `SCRAPEFUN_DATA_DIR` 或 Compose 配置为准。 部署配置与业务数据应一起保留。密钥、存储密码和备份文件不要上传公开 Issue;离机备份应限制访问或加密。 主要内容包括: | 子目录 | 内容 | 应用内备份 | | --- | --- | --- | | `db` | SQLite 数据库、设置、用户、媒体库、进度和任务 | 包含 | | `images` | 海报、背景图、生成封面和阅读背景 | 标准备份可省略可重建远程图片 | | `user-avatars` | 用户头像 | 包含 | | `config` | 系统刮削器运行时配置 | 包含 | | `custom-scrapers` | 旧版兼容的自定义刮削器文件 | 存在时包含 | | `local-subtitles` | 本地字幕 | 包含 | | `artwork-sources`、`file-artwork`、`storage-credentials` | 图片来源、文件封面、存储凭据 | 包含 | | `video-proxy-cache`、`transcode-cache` | 视频代理和转码缓存 | 不包含,可重建 | | `comic-cache`、`image-cache`、`image-upscale-cache` | 漫画和图片缓存 | 不包含,可重建 | | `media-probe-v2`、`temp`、`logs`、`cache` | 探测、临时文件和日志 | 不包含,可重建 | ## 从旧分目录挂载迁移 先检查当前容器: ```bash docker inspect scrapefun \ --format '{{range .Mounts}}{{println .Source "->" .Destination}}{{end}}' ``` 如果看到多条 `/app/data/db`、`/app/data/images` 等挂载,不要直接编辑 Compose 后重建。最新版一键脚本会默认停止,并要求显式执行迁移: ```bash curl -fsSL https://raw.githubusercontent.com/HaoweiLi97/ScrapeFun/main/scripts/one-click-compose-deploy.sh \ | bash -s -- ~/scrapefun --migrate-data-root ``` 命令沿用现有渠道;自定义部署请替换 `~/scrapefun`。迁移脚本不会自动导出应用备份,执行前必须自行导出并保留。 迁移流程: 1. 执行脚本前,自行暂停写入任务并导出应用内备份。 2. 停止 app,但先不要删除旧容器。 3. 将旧容器 `/app/data` 中未挂载的其他目录复制到统一宿主机数据根目录。 4. 确认数据库、图片、配置、头像、字幕和其他目录都在同一个根目录。 5. 把 Compose 改为单个根挂载,再重建 app。 6. 复制完成后安装器会重建 app;完成后验证登录、媒体库、图片、刮削器和播放,并保留事先导出的备份。 无法判断哪些文件只存在于旧容器时,不要继续重建;先保留旧容器并寻求支持。 ## 应用内备份(推荐) 在设置页的备份与恢复中导出 ZIP。当前 `snapshot-v5` 包含一致性数据库快照、逐文件大小和 SHA-256、图片来源、文件封面、头像、本地字幕、存储凭据及刮削器文件。 标准备份默认省略已有可靠重建来源的远程图片,恢复后按来源重建;完整应用备份保留这些图片。两者均排除可再生成缓存、临时文件和日志,完整应用备份不等于宿主机完整备份。 仍支持 `snapshot-v4`、`snapshot-v3`、`snapshot-v2` 和 `backup.json`。旧版本未必能导入 v5,恢复前核对格式兼容性。备份可能含存储密码,应限制访问或加密并保留离机副本。应用 ZIP 不包含宿主机 `server.env` 等部署配置,须单独备份。 ## Docker 宿主机完整备份 灾难恢复应同时备份数据目录与部署配置。以下工具要求一键部署的 `docker-compose.remote.yml` 和 `.updater.env`,NAS 手动 Compose 不能直接套用,应按面板流程备份。运维工具安装在一键部署目录: ```bash cd ~/scrapefun ./operations/backup-docker.sh --deploy-dir "$PWD" --output-dir /srv/backups/scrapefun ``` 工具自动读取 `.updater.env`、停止并恢复 app、验证 SQLite、归档数据和配置、生成 manifest/SHA-256,并保留 7 日、4 周、6 月恢复点。缓存默认排除;添加 `--include-caches` 才会包含。符号链接或特殊文件会在归档前被拒绝,避免生成不安全或不完整的备份。 可选的加密和异机复验: ```bash ./operations/backup-docker.sh \ --deploy-dir "$PWD" \ --output-dir /srv/backups/scrapefun \ --age-recipient age1你的公钥 \ --rclone-remote minio:scrapefun/backups ``` `server.env` 和 `.updater.env` 可能包含密钥。age 私钥必须存放在数据目录和备份之外;只有远端副本重新下载并通过 SHA-256 复验,才算异机备份成功。 使用 `install-docker-backup-timer.sh` 安装 systemd 定时任务时,通知地址保存在仅 root 可读的 `/etc/scrapefun-backup.env`,不会出现在 `ExecStart` 命令行中。 ## 从应用备份恢复 1. 先导出当前实例备份作为回退点。 2. 确认没有扫描、刮削、整理、转码或升级任务。 3. 在 `设置 → 通用 → 备份与恢复` 中选择“导入”。 4. 上传 ScrapeFun 导出的 ZIP,等待恢复成功并自动重启。 5. 恢复后检查登录、用户、媒体库、图片、刮削器、WebDAV/AList、播放与阅读进度。 恢复会先校验归档和 SQLite,再写入暂存位置,并在重启时统一提交;失败时会回滚。每次成功恢复还会保留恢复前数据库,默认保留最近 3 份,但这些本地副本不能代替离机备份。 ## 从完整数据目录恢复 使用恢复工具,不要直接覆盖当前目录: ```bash cd ~/scrapefun ./operations/restore-docker.sh \ --deploy-dir "$PWD" \ --backup /srv/backups/scrapefun/scrapefun-docker-backup-YYYYMMDDTHHMMSSZ.tar.gz ``` 工具会校验内外归档、预检空间、在新目录解压、检查 SQLite、保留当前数据为 `.pre-restore-*`,并在启动后验证 readiness。加密归档需添加 `--age-identity /安全路径/identity.txt`。恢复验证完成并重新生成备份后,才删除旧目录。 定期运行隔离恢复演练: ```bash ./operations/drill-docker-backup.sh --backup /srv/backups/scrapefun/备份文件.tar.gz ``` ## 恢复后检查 下列命令对应一键部署的 `docker-compose.remote.yml` / `.updater.env`。NAS 手动示例使用 `docker compose --env-file .env --env-file .updater.env ps` 和 `docker compose --env-file .env --env-file .updater.env logs --tail=200 app`;访问端口按实际配置替换。 ```bash docker compose --env-file .updater.env -f docker-compose.remote.yml ps docker compose --env-file .updater.env -f docker-compose.remote.yml logs --tail=200 app curl -fsS http://127.0.0.1:8096/health/live curl -fsS http://127.0.0.1:8096/health/ready ``` `/health/ready` 会检查启动、数据库、数据目录权限和恢复事务;仍应实际检查登录、媒体库、海报/头像、本地字幕、刮削器注册、WebDAV/AList 和一次播放。 ## 避免误删 - 不要执行 `docker compose down -v`。 - 不要删除或清空 `scrapefun-data`。 - 不要把新备份直接解压覆盖正在使用的数据目录。 - 不要只备份 SQLite 数据库;数据库和文件资源必须来自同一时间点。 - NAS 删除 Compose 项目前,先确认面板不会同时删除绑定目录。 - 更新或重建后,确认仍是同一个宿主机目录挂载到 `/app/data`。 [文档中心](./docs/README.md) · [Docker 运维](./DOCKER_GUIDE.md) · [支持](./SUPPORT.md) · [许可与协议](./legal/README.md)