OpenList + S3 + Restic 备份 NAS 完整教程
一、整体架构
推荐架构:
[NAS本地目录]
│
│ Restic 扫描备份
▼
[Restic]
│ S3 API
▼
[OpenList S3 Server]
│
├── 阿里云盘
├── OneDrive
├── WebDAV
├── 123云盘
└── 其它网盘Openlist挂载网盘,转换为S3对象存储,备份本机nas上的文件。使用本机IP链接,安全性有保证。
Restic负责备份文件的处理。
OpenList + S3 + Restic 备份 NAS 完整教程
场景:X86 飞牛 NAS,OpenList 挂载网盘并暴露 S3 接口,Restic 通过本机内网 S3 协议加密备份 NAS 文件到网盘
安全特性:全程内网 IP 通信,Restic 客户端 AES-256 加密后上传,网盘服务商无法查看明文
一、你的参数确认
| 参数 | 值 |
|---|---|
| NAS 内网 IP | 192.168.31.85 |
| OpenList Web 端口 | 5244 |
| OpenList S3 端口 | 5246 |
| S3 访问密钥 ID (AK) | JsZgU0XkYY8QgnbY4utC |
| S3 访问密钥 (SK) | beNK/clOe/Bozmg8Fb+7rbssL9fLgC2b7Oe01gs+ |
| S3 存储桶名称 (Bucket) | openlist |
| OpenList 挂载路径 | /日本盘 |
| Restic 加密密码 | 123456789Li |
二、架构回顾
┌─────────────────────────────────────────────────────────────┐
│ 飞牛 NAS (192.168.31.85) │
│ ┌──────────────┐ S3 协议 (内网) ┌──────────────┐ │
│ │ Restic │ ───────────────────→ │ OpenList │ │
│ │ (备份工具) │ http://192.168.31.85:5246 │ (S3网关) │ │
│ └──────────────┘ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 日本盘 │ │
│ │ (网盘挂载) │ │
│ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘流程:
- OpenList 挂载网盘(日本盘)
- OpenList 开启 S3 服务端(端口 5246),将
/日本盘映射为 S3 存储桶openlist - Restic 通过
s3:http://192.168.31.85:5246/openlist连接 - 数据在 Restic 客户端完成 AES-256 加密 + 去重,经 OpenList 中转上传到网盘
三、安装 Restic
# 飞牛 NAS (Debian/Ubuntu 系)
apt update && apt install -y restic
# 验证版本
restic version如 apt 版本过旧,手动下载:
cd /tmp
wget https://github.com/restic/restic/releases/download/v0.17.0/restic_0.17.0_linux_amd64.bz2
bunzip2 restic_0.17.0_linux_amd64.bz2
chmod +x restic_0.17.0_linux_amd64
mv restic_0.17.0_linux_amd64 /usr/local/bin/restic
restic version四、配置环境变量
创建 /etc/restic.env:
nano /etc/restic.env粘贴以下内容(已填入你的实际参数):
# ==========================================
# OpenList S3 认证信息
# ==========================================
export AWS_ACCESS_KEY_ID="JsZgU0XkYY8QgnbY4utC"
export AWS_SECRET_ACCESS_KEY="beNK/clOe/Bozmg8Fb+7rbssL9fLgC2b7Oe01gs+"
# ==========================================
# Restic 仓库地址
# 格式: s3:http://IP:端口/存储桶名
# ==========================================
export RESTIC_REPOSITORY="s3:http://192.168.31.85:5246/openlist"
# ==========================================
# Restic 加密密码(AES-256 客户端加密)
# ⚠️ 丢失此密码 = 数据永久无法恢复
# ==========================================
export RESTIC_PASSWORD="123456789Li"保存退出(Ctrl+O → Enter → Ctrl+X)。
加载环境变量:
source /etc/restic.env💡 建议将
source /etc/restic.env加入~/.bashrc,避免每次手动加载。
五、创建密码文件(用于自动化脚本)
echo "123456789Li" > /etc/restic.pass
chmod 600 /etc/restic.pass
chmod 600确保只有 root 能读取此文件。
六、初始化 Restic 仓库(首次必须执行)
source /etc/restic.env
restic init预期输出:
created restic repository 4dc8f5c6 at s3:http://192.168.31.85:5246/openlist
Please note that knowledge of your password is required to access the repository.
Losing your password means that your data is irrecoverably lost.
⚠️ 常见问题:
- 如果报错
Access Denied:检查 OpenList 是否已重启应用 S3 配置;确认密钥 ID 和密钥复制正确;确认存储桶名openlist与 OpenList 后台一致;确认端口是5246(不是5244)- 初始化完成后,网盘里会出现
config文件和data/、index/、keys/等目录,不要手动删除
七、执行备份
7.1 基础备份
假设要备份 NAS 上的 /mnt/data 目录:
source /etc/restic.env
restic backup /mnt/data预期输出:
repository 4dc8f5c6 opened (repository version 2)
using parent snapshot 8f3a2b1c
Files: 0 new, 5 changed, 1200 unmodified
Dirs: 0 new, 3 changed, 50 unmodified
Added to the repository: 15.234 MiB (12.456 MiB stored)
processed 1205 files, 2.345 GiB in 0:45
snapshot 9a4e7d2f saved
7.2 带标签备份
restic backup /mnt/data --tag "daily-$(date +%Y%m%d)"7.3 多目录备份
restic backup /mnt/data /home /etc7.4 排除不需要的文件
创建排除规则文件 /etc/restic-exclude.txt:
nano /etc/restic-exclude.txt内容示例:
# 缓存和临时文件
*.tmp
*.log
.cache
# 开发依赖
node_modules
vendor
# 系统目录
/proc
/sys
/dev
/run
# Docker 相关
/var/lib/docker
# 下载和回收站
Downloads/
.Trash/
执行备份时引用:
restic backup /mnt/data --exclude-caches --exclude-if-present .nobackup --exclude-file /etc/restic-exclude.txt7.5 模拟运行(测试但不实际备份)
restic backup /mnt/data --dry-run7.6 限速备份(避免占用全部带宽)
restic backup /mnt/data --limit-upload 2000限制上传速度为 2000 KB/s(约 2MB/s),避免影响正常使用。
八、查看与管理快照
8.1 列出所有快照
source /etc/restic.env
restic snapshots输出示例:
ID Time Host Tags Paths
----------------------------------------------------------------------------------
abc123de 2026-06-05 12:00:00 fnos-nas daily /mnt/data
def456gh 2026-06-05 20:30:00 fnos-nas daily /mnt/data
ghi789jk 2026-06-04 12:00:00 fnos-nas daily /mnt/data
----------------------------------------------------------------------------------
3 snapshots
8.2 按标签过滤
restic snapshots --tag "daily"8.3 查看快照中的文件列表
restic ls abc123de
restic ls latest8.4 查看快照差异
# 比较两个快照
restic diff abc123de def456gh
# 比较最新和上一次
restic diff latest~1 latest8.5 查看备份统计
restic stats
restic stats abc123de8.6 检查仓库完整性
# 快速检查(不读取所有数据)
restic check
# 完整检查(读取所有数据块验证校验和)
restic check --read-data
# 检查 10% 的数据
restic check --read-data-subset 10%九、恢复数据
9.1 恢复到最新版本
source /etc/restic.env
restic restore latest --target /restore数据将恢复到
/restore目录,原目录结构保留。
9.2 恢复到指定快照
restic restore abc123de --target /restore9.3 恢复特定文件
# 先找到文件路径
restic ls abc123de | grep "重要文件.txt"
# 恢复单个文件
restic restore abc123de --target /restore --include "/mnt/data/重要文件.txt"9.4 挂载浏览(像普通目录一样找文件)
# 创建挂载点
mkdir -p /mnt/restic-mount
# 挂载仓库(只读)
restic mount /mnt/restic-mount
# 现在可以像普通目录一样浏览:
# ls /mnt/restic-mount/snapshots/
# ls /mnt/restic-mount/snapshots/latest/mnt/data/
# ls /mnt/restic-mount/snapshots/abc123de/mnt/data/
# 浏览完记得卸载
umount /mnt/restic-mount9.5 导出单个文件到 stdout
restic dump abc123de /mnt/data/config.txt > /restore/config.txt十、清理旧快照(节省网盘空间)
10.1 保留策略清理(推荐)
source /etc/restic.env
# 保留最近 7 天每日、最近 4 周每周、最近 6 个月每月的快照
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune10.2 模拟清理(先看效果)
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune --dry-run10.3 删除指定快照
restic forget abc123de --prune10.4 手动清理未引用数据块
restic prune十一、完整自动化备份脚本
创建 /root/backup.sh:
#!/bin/bash
set -e
# 加载环境变量
source /etc/restic.env
# 配置
BACKUP_DIRS="/mnt/data"
LOG_FILE="/var/log/restic-backup.log"
EXCLUDE_FILE="/etc/restic-exclude.txt"
# 日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "========== 备份开始 =========="
# 执行备份
restic backup $BACKUP_DIRS --tag "auto-$(date +%Y%m%d-%H%M)" --tag "$(hostname)" --exclude-caches --exclude-file "$EXCLUDE_FILE" --limit-upload 2000 >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
log "✓ 备份成功"
else
log "✗ 备份失败"
exit 1
fi
# 清理旧快照
log "清理旧快照..."
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune >> "$LOG_FILE" 2>&1
# 检查仓库完整性
log "检查仓库完整性..."
restic check >> "$LOG_FILE" 2>&1
log "========== 备份结束 =========="赋予执行权限:
chmod +x /root/backup.sh添加 Crontab 定时任务
crontab -e添加以下行(每天凌晨 2:30 执行备份):
30 2 * * * /root/backup.sh >> /var/log/restic-cron.log 2>&1
查看日志确认运行状态:
tail -f /var/log/restic-backup.log十二、安全加固建议
| 措施 | 说明 |
|---|---|
| 全程内网 IP | Restic 使用 http://192.168.31.85:5246,不要暴露 5244/5246 到公网 |
| 防火墙限制 | 飞牛 NAS 防火墙仅开放必要端口,5244/5246 建议仅限局域网访问 |
| 强密码策略 | RESTIC_PASSWORD(123456789Li)是数据加密密钥,与 OpenList 登录密码、S3 密钥均不相同 |
| 密钥分离存储 | /etc/restic.env 和 /etc/restic.pass 不要和备份数据放在同一目录 |
| 多网盘冗余 | 在 OpenList 挂载 2 个以上网盘,Restic 可分别初始化多个仓库,实现异地冗余 |
| 定期恢复测试 | 每季度执行一次 restic restore 测试,验证备份可用性 |
十三、常见问题
Q1: restic init 报错 Access Denied
- 检查 OpenList 是否已重启应用 S3 配置
- 确认
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY与 OpenList 后台生成的一致(注意大小写) - 确认
RESTIC_REPOSITORY中的存储桶名openlist与 OpenList S3 配置中的「名称」一致 - 确认端口是
5246(不是5244) - 测试连通性:
curl http://192.168.31.85:5246
Q2: 备份大文件时速度很慢?
- 网盘本身的上传限速是主要瓶颈
- Restic 的去重机制会大幅减少重复数据的传输
- 建议夜间执行备份,或挂载支持高速上传的网盘
- 使用
--limit-upload避免占用全部带宽
Q3: 备份中断后如何继续?
restic unlock # 移除残留锁
restic backup /mnt/data # 重新执行,Restic 会自动增量续传Q4: 如何备份到多个网盘?
在 OpenList 中挂载多个网盘,分别配置不同的 S3 桶名(如 openlist-baidu、openlist-ali),然后创建多份环境变量文件,分别初始化仓库并执行备份。
Q5: 飞牛 NAS 重启后 OpenList 没有自动启动?
Docker Compose 中已配置 restart: unless-stopped,正常情况下会自动重启。如未启动,检查 Docker 服务是否设置了开机自启。
Q6: 如何查看某个文件是否在备份中?
restic ls latest | grep "文件名"Q7: 如何只备份特定类型的文件?
Restic 没有内置的 --include 过滤,建议通过 --exclude 反向排除不需要的文件,或使用 find 配合文件列表备份。
十四、命令速查表
仓库管理
| 命令 | 说明 |
|---|---|
source /etc/restic.env && restic init |
初始化仓库 |
restic check |
快速检查完整性 |
restic check --read-data |
完整检查 |
restic rebuild-index |
重建索引 |
restic unlock |
移除残留锁 |
restic stats |
查看仓库统计 |
备份
| 命令 | 说明 |
|---|---|
restic backup /mnt/data |
基础备份 |
restic backup /mnt/data --tag "daily" |
带标签备份 |
restic backup /p1 /p2 /p3 |
多目录备份 |
restic backup /mnt/data --exclude-caches |
排除缓存 |
restic backup /mnt/data --exclude-file /etc/exclude.txt |
使用排除文件 |
restic backup /mnt/data --limit-upload 2000 |
限速上传 |
restic backup /mnt/data --dry-run |
模拟运行 |
当您运行:
restic backup "/vol1/1000/SSD1/备份/日志"时,Restic 会:
| 步骤 | 说明 |
|---|---|
| 1. 扫描文件 | 读取 NAS 上的 552 个文件 |
| 2. 压缩加密 | 加密数据(用您的密码 123456789Li) |
| 3. 上传到 S3 | 所有数据存储到 s3://openlist(您的 NAS 上) |
| 4. 保存快照 | 创建索引文件以便恢复 |
现在的情况
您的数据已经在 S3 上:
s3://openlist/
├── data/b3/b34eef... (198 KB) ← 您的备份数据
├── data/2f/2f1b... (29 KB) ← 您的备份数据
├── index/2f4d... ← 索引文件(已删除)
├── config ← 配置文件
└── keys/ ← 加密密钥
快照管理
| 命令 | 说明 |
|---|---|
restic snapshots |
列出所有快照 |
restic snapshots --tag "daily" |
按标签过滤 |
restic ls abc123de |
查看快照内容 |
restic ls latest |
查看最新快照 |
restic diff abc123de def456gh |
比较快照差异 |
restic stats abc123de |
查看快照统计 |
恢复
| 命令 | 说明 |
|---|---|
restic restore latest --target /restore |
恢复最新 |
restic restore abc123de --target /restore |
恢复指定快照 |
restic restore abc123de --target /restore --include "/file" |
恢复特定文件 |
restic mount /mnt/restic-mount |
挂载浏览 |
restic dump abc123de /file > output |
导出到文件 |
清理
| 命令 | 说明 |
|---|---|
restic forget abc123de |
删除快照 |
restic forget --keep-daily 7 --keep-weekly 4 --prune |
保留策略清理 |
restic forget --dry-run |
模拟删除 |
restic prune |
手动清理未引用数据 |
十五、组件版本参考
| 组件 | 推荐版本 | 来源 |
|---|---|---|
| OpenList | latest (v4.x+) |
Docker Hub: openlistteam/openlist |
| Restic | v0.16.4+ | GitHub Releases / apt |
| 飞牛 NAS | fnOS 最新版 | 官方更新 |
用户需要一个独立的命令速查表,以备份/vol1/1000/SSD1/备份/日志为例,包括:
- 备份
- 恢复
- 查找
- 删除
并且需要体现:
- 备份到云端
- 删除本地不删除云端
- 添加标签说明
- 恢复指定快照
我应该创建一个清晰、实用的表格,包含所有常用命令的具体示例。# Restic 命令速查表
备份操作
| 操作 | 命令 | 说明 |
|---|---|---|
| 基础备份 | restic backup "/vol1/1000/SSD1/备份/日志" |
备份到 S3,生成快照 |
| 添加日期标签 | restic backup "/vol1/1000/SSD1/备份/日志" --tag "2026-06-05" |
便于按日期查找 |
| 添加自定义标签 | restic backup "/vol1/1000/SSD1/备份/日志" --tag "daily-backup" |
便于按类型查找 |
| 多标签备份 | restic backup "/vol1/1000/SSD1/备份/日志" --tag "daily" --tag "important" |
可添加多个标签 |
| 排除某些文件 | restic backup "/vol1/1000/SSD1/备份/日志" --exclude "*.tmp" |
排除临时文件 |
| 限速上传 | restic backup "/vol1/1000/SSD1/备份/日志" --limit-upload 2000 |
限制上传速度(KB/s) |
| 模拟运行 | restic backup "/vol1/1000/SSD1/备份/日志" --dry-run |
测试不真正上传 |
查找快照
| 操作 | 命令 | 输出示例 |
|---|---|---|
| 列出所有快照 | restic snapshots |
显示所有快照 ID、时间、标签 |
| 按标签过滤 | restic snapshots --tag "daily" |
只显示标记为"daily"的快照 |
| 查看快照文件列表 | restic ls abc123de |
显示快照中所有文件 |
| 查看最新快照内容 | restic ls latest |
显示最新快照中的文件 |
| 快照统计信息 | restic stats abc123de |
文件数、目录数、总大小 |
| 比较两个快照 | restic diff abc123de def456gh |
显示快照之间的差异 |
恢复操作
| 操作 | 命令 | 说明 |
|---|---|---|
| 恢复最新快照 | restic restore latest --target /tmp/restore |
恢复最新备份到临时目录 |
| 恢复指定快照 | restic restore abc123de --target /tmp/restore |
恢复特定快照 ID |
| 恢复到原位置 | restic restore abc123de --target / |
恢复到原始路径 |
| 恢复特定文件 | restic restore abc123de --target /tmp/restore --include "日志/file.txt" |
只恢复某个文件 |
| 恢复特定目录 | restic restore abc123de --target /tmp/restore --include "日志/*" |
只恢复某个目录 |
| 导出单个文件 | restic dump abc123de /vol1/1000/SSD1/备份/日志/file.txt > file.txt |
导出为本地文件 |
| 挂载快照浏览 | restic mount /mnt/restic-mount |
像浏览文件夹一样查看备份 |
删除操作(S3 保留,不删除本地)
❌ 错误做法(会导致无法恢复)
restic forget abc123de # 直接删除快照 → 数据孤立 ❌✅ 正确做法(使用保留策略)
| 操作 | 命令 | 说明 |
|---|---|---|
| 保留最近 7 天 | restic forget --keep-daily 7 --prune |
删除 7 天前的备份,S3 数据块会清理 |
| 保留按周统计 | restic forget --keep-weekly 4 --prune |
保留最近 4 周的快照 |
| 保留按月统计 | restic forget --keep-monthly 12 --prune |
保留最近 12 个月的快照 |
| 综合保留策略 | restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune |
组合保留策略 |
| 模拟删除 | restic forget --keep-daily 7 --dry-run |
预演删除(不真正执行) |
完整工作流示例
周一:初次备份(添加标签)
restic backup "/vol1/1000/SSD1/备份/日志" --tag "2026-06-05-weekly"周二-周五:每日增量备份
restic backup "/vol1/1000/SSD1/备份/日志" --tag "2026-06-06-daily"
restic backup "/vol1/1000/SSD1/备份/日志" --tag "2026-06-07-daily"
restic backup "/vol1/1000/SSD1/备份/日志" --tag "2026-06-08-daily"
restic backup "/vol1/1000/SSD1/备份/日志" --tag "2026-06-09-daily"周末:查看备份统计
# 查看所有快照
restic snapshots
# 查看最新快照内容
restic ls latest
# 查看某个快照大小
restic stats abc123de月末:清理旧备份(保留策略)
# 预演(先看会删除什么)
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --dry-run
# 确认无误后执行
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune需要恢复:选择合适的快照
# 方法 1:恢复最新
restic restore latest --target /tmp/restore
# 方法 2:恢复特定日期的
restic restore abc123de --target /tmp/restore
# 方法 3:只恢复某个文件
restic restore abc123de --target /tmp/restore \
--include "日志/20260605-130825_transfer.log"一键命令(配合环境变量)
在执行命令前,先加载环境变量:
source /etc/restic.env然后可直接运行上述所有命令。
如果不想每次都 source,可在命令前加:
source /etc/restic.env && restic backup "/vol1/1000/SSD1/备份/日志" --tag "daily"