Backrest 适用于家庭与 NAS 的备份方案
前期准备
概述
Backrest 是一个基于 restic 构建的、可通过 Web 访问的备份解决方案。Backrest 提供了一个 Web UI,该 Web UI 封装了 restic 命令行界面,可以轻松创建仓库、浏览快照和恢复文件。此外,Backrest 可以在后台运行,并采用有主见的策略来调度快照和编排仓库健康操作。
通过在 restic 之上构建,Backrest 利用了其成熟、快速、可靠和安全的备份功能,同时增加了一个直观的界面。
主要特性
- Web 界面:本地或远程访问(非常适合 NAS 部署)
- 多平台支持:
- Linux
- macOS
- Windows
- FreeBSD
- Docker
- 备份管理:
- 导入现有 restic 仓库
- Cron 定时备份和维护(例如 prune、check、forget 等)
- 浏览和恢复快照中的文件
- 可配置通知(Discord、Slack、Shoutrrr、Gotify、Healthchecks)
- 备份前/后命令钩子,用于执行 shell 脚本
- 存储选项:
- 兼容 rclone 远程
- 支持所有 restic 存储后端(S3、B2、Azure、GCS、本地、SFTP 以及 所有 rclone 远程)
安装 Backrest
version: "3.8"services: backrest: image: garethgeorge/backrest:latest container_name: backrest hostname: backrest volumes: - ./backrest/data:/data - ./backrest/config:/config - ./backrest/cache:/cache - ./backrest/tmp:/tmp - ./backrest/rclone:/root/.config/rclone # 使用 rclone 挂载网盘时配置此项 # - /boot/config/plugins/rclone/.rclone.conf:/root/.config/rclone # Unraid 使用此 rclone 路径 - /path/to/backup/data:/userdata # 备份路径 - /path/to/local/repos:/repos # repos 路径 environment: - BACKREST_DATA=/data - BACKREST_CONFIG=/config/config.json - XDG_CACHE_HOME=/cache - TMPDIR=/tmp - TZ=Asia/Shanghai ports: - "9898:9898" restart: unless-stopped配置 Backrest
- 第一次打开需要创建账户和密码;如果在纯内网环境使用,可跳过对外访问相关配置。
- 在 Plans 中可以添加备份计划,在 Repositories 中可以添加备份仓库。
以 S3 作为 restic 存储后端
概述
OpenList 是一个由 OpenList 团队维护的、社区驱动的 AList 分支,旨在通过其韧性和长期治理来保护开源项目免受基于信任的攻击。该项目在 AGPL-3.0 许可下开源,所有代码和服务均在 GitHub 上免费提供,且目前没有付费计划或商业部署。
安装 OpenList
services: openlist: restart: always volumes: - '/etc/openlist:/opt/openlist/data' ports: - '5244:5244' - '5245:5245' environment: - PUID=0 - PGID=0 - UMASK=022 - TZ=UTC container_name: openlist image: 'openlistteam/openlist:latest'通过 OpenList 挂载网盘为 S3
此功能是将 OpenList 映射为 S3 协议,可以使用 S3 客户端进行访问与查看,就像 OpenList 可以映射为 WebDAV 一样。
- 可以是整个 OpenList(根目录),也可以是单独某个文件夹
-
如果是第一次使用,先打开 OpenList 后台生成一下
访问客户端 ID和访问密钥保存,然后停止 OpenList,打开配置文件启用S3服务如果你后续更新访问 ID 和密钥,更新保存,再重启 OpenList 才可以生效
-
打开
配置文件,将enable字段改成true启用S3服务
"s3": { "enable": true, "port": 5246, "ssl": false }-
前两步操作完成后启动 OpenList,进入后台 S3 配置页面,选择希望映射为对象存储桶的路径
- 左侧是对外显示的存储桶名字,右侧是 OpenList 已有的列表目录路径,如果想将整个根目录全部映射出去可以选择列表中的 root 路径
- 手动填写可能会出现错误,建议使用右侧 选择 按钮进行选择
配置 Backrest
配置 Repositories
| key | 变量 |
|---|---|
| Repo Name | 自定义 |
| Repository URI | s3:http://s3.example.com:5246/example-bucket |
| Password | 自定义 |
| Env Vars | AWS_ACCESS_KEY_ID=你的 S3 访问密钥 IDAWS_SECRET_ACCESS_KEY=你的 S3 访问密钥 |
配置 Plans
| key | 变量 |
|---|---|
| Plan Name | 自定义 |
| Repository | s3:http://s3.example.com:5246/example-bucket |
| Paths | 自定义 |
| Backup Flags | --pack-size=64--limit-upload 8000--limit-download 8000 |
TIP
--pack-size=64打包的文件块大小,单位 MB,TB 以下建议 64,TB 以上可考虑 128。
--limit-upload 8000限制上传速度,单位 KB/s。
--limit-download 8000限制下载速度,单位 KB/s。
以 rclone 作为 restic 存储后端
概述
当目标网盘不直接支持 S3(如 OneDrive、Google Drive、阿里云盘等)时,可以通过 rclone 作为 restic 的后端:在 Backrest 中把仓库地址写成 rclone:<远程名>:<路径> 即可。
准备 rclone 配置
- 在任意主机上执行
rclone config创建远程(以远程名cloud为例)。 - 运行
rclone config file可查看rclone.conf的实际路径,然后将该文件复制到宿主机./backrest/rclone/目录。 - 确保文件名为
rclone.conf,容器内会通过卷挂载到/root/.config/rclone/rclone.conf。 - 可选:如需自定义路径,可在服务中添加环境变量
RCLONE_CONFIG=/root/.config/rclone/rclone.conf。
在 Backrest 中配置 Repositories
| key | 变量 |
|---|---|
| Repo Name | 自定义 |
| Repository URI | rclone:cloud:/restic(示例:rclone:onedrive:/backups/restic) |
| Password | 自定义 |
| Env Vars | RCLONE_BW_LIMIT=8MRCLONE_TRANSFERS=4RCLONE_CHECKERS=8RCLONE_FAST_LIST=true |
TIP
RCLONE_BW_LIMIT:限速,支持如8M、8000k。RCLONE_TRANSFERS/RCLONE_CHECKERS:并发传输与校验线程,带宽与远端限流允许时可适当提高。RCLONE_FAST_LIST:对部分网盘显著降低列目录开销。
在 Backrest 中配置 Plans
| key | 变量 |
|---|---|
| Plan Name | 自定义 |
| Repository | rclone:cloud:/restic |
| Paths | 自定义(如 /userdata/Documents 等) |
| Backup Flags | --pack-size=64--one-file-system--tag nas--exclude-file /config/exclude.txt |
TIP
- 建议在计划中设置 Cron 表达式,避开业务高峰时段(如每日 03:00)。
- restic ≥ 0.16 可加
--compression auto在多数远端取得更优的体积/速度平衡。
可选:排除规则(exclude)
在 ./backrest/config/ 下新建 exclude.txt,并在 Plan 的 Backup Flags 中引用 --exclude-file /config/exclude.txt。
# 常见临时/缓存目录**/.cache/****/node_modules/****/.venv/****/venv/****/.git/****/.DS_Store**/Thumbs.db**/@eaDir/****/@Recycle/****/Downloads/****/tmp/**TIP也可在
Backup Flags直接使用多次--exclude指定路径/通配符。
恢复与校验
- 恢复:在 Backrest Web UI 的
Snapshots中选择快照 →Browse→Restore。- 目标目录必须是容器可写目录(如挂载的
/userdata/restore)。 - 可按需添加恢复参数(如
--target、--include/--exclude)。
- 目标目录必须是容器可写目录(如挂载的
- 校验:在
Repositories→Maintenance中添加check任务,建议每周执行一次。Check Flags可用--read-data-subset=3%在速度与信心之间取得平衡。
维护与保留策略
- 忘记策略(forget):建议按以下之一配置(任选其一,放入
Forget Flags):--keep-daily 7 --keep-weekly 4 --keep-monthly 12- 或
--keep-last 30
- 数据瘦身(prune):在维护任务中勾选/添加
prune,定期清理未引用数据。 - 一般调度建议:
- 备份:每日 03:00
- check:每周日 02:00(带
--read-data-subset=3%) - forget + prune:每月 04:00
Windows 与权限注意事项
- Windows + Docker Desktop:卷路径示例
C:/Backups:/userdata(注意使用绝对盘符)。 - 确保 Docker 对对应盘符开启文件共享;路径含空格时请使用引号。
- 若出现权限不足(Permission denied):
- 确认宿主目录具备写入权限并已挂载到容器。
- 在 NAS 上可确保目录属主与容器用户匹配,或放宽权限后再试。
常见问题(FAQ)
- 初始化仓库失败或超时:
- 检查远端凭据/网络连通;若是 S3,确认时钟同步避免
RequestTimeTooSkewed。 - rclone 后端检查
rclone.conf的远程名是否与 URI 一致。
- 检查远端凭据/网络连通;若是 S3,确认时钟同步避免
repository is locked:在Maintenance中执行unlock,或稍后重试。- 恢复失败(目标不可写):确保恢复到挂载进容器的目录,如
/userdata/restore。 - 速度慢:
- 适当提高
RCLONE_TRANSFERS/RCLONE_CHECKERS,或在高延迟环境使用较大的--pack-size(64 或 128)。 - 对带宽紧张时设置
--limit-upload/--limit-download或RCLONE_BW_LIMIT。
- 适当提高