OpenList + S3 + Restic 备份 NAS 完整教程

2026年06月06日

一、整体架构

推荐架构:

text
[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 内网 IP192.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

二、架构回顾

text
┌─────────────────────────────────────────────────────────────┐
│                    飞牛 NAS (192.168.31.85)                   │
│  ┌──────────────┐      S3 协议 (内网)     ┌──────────────┐   │
│  │   Restic     │  ───────────────────→  │   OpenList   │   │
│  │  (备份工具)   │   http://192.168.31.85:5246  │  (S3网关)    │   │
│  └──────────────┘                        └──────────────┘   │
│                                                   │          │
│                                                   ▼          │
│                                          ┌──────────────┐   │
│                                          │   日本盘      │   │
│                                          │  (网盘挂载)   │   │
│                                          └──────────────┘   │
└─────────────────────────────────────────────────────────────┘

流程

  1. OpenList 挂载网盘(日本盘)
  2. OpenList 开启 S3 服务端(端口 5246),将 /日本盘 映射为 S3 存储桶 openlist
  3. Restic 通过 s3:http://192.168.31.85:5246/openlist 连接
  4. 数据在 Restic 客户端完成 AES-256 加密 + 去重,经 OpenList 中转上传到网盘

三、安装 Restic

bash
# 飞牛 NAS (Debian/Ubuntu 系)
apt update && apt install -y restic

# 验证版本
restic version

如 apt 版本过旧,手动下载:

bash
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

bash
nano /etc/restic.env

粘贴以下内容(已填入你的实际参数):

bash
# ==========================================
# 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+OEnterCtrl+X)。

加载环境变量

bash
source /etc/restic.env

💡 建议将 source /etc/restic.env 加入 ~/.bashrc,避免每次手动加载。


五、创建密码文件(用于自动化脚本)

bash
echo "123456789Li" > /etc/restic.pass
chmod 600 /etc/restic.pass

chmod 600 确保只有 root 能读取此文件。


六、初始化 Restic 仓库(首次必须执行)

bash
source /etc/restic.env
restic init

预期输出

code
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 目录:

bash
source /etc/restic.env
restic backup /mnt/data

预期输出

code
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 带标签备份

bash
restic backup /mnt/data --tag "daily-$(date +%Y%m%d)"

7.3 多目录备份

bash
restic backup /mnt/data /home /etc

7.4 排除不需要的文件

创建排除规则文件 /etc/restic-exclude.txt

bash
nano /etc/restic-exclude.txt

内容示例:

code
# 缓存和临时文件
*.tmp
*.log
.cache

# 开发依赖
node_modules
vendor

# 系统目录
/proc
/sys
/dev
/run

# Docker 相关
/var/lib/docker

# 下载和回收站
Downloads/
.Trash/

执行备份时引用:

bash
restic backup /mnt/data   --exclude-caches   --exclude-if-present .nobackup   --exclude-file /etc/restic-exclude.txt

7.5 模拟运行(测试但不实际备份)

bash
restic backup /mnt/data --dry-run

7.6 限速备份(避免占用全部带宽)

bash
restic backup /mnt/data --limit-upload 2000

限制上传速度为 2000 KB/s(约 2MB/s),避免影响正常使用。


八、查看与管理快照

8.1 列出所有快照

bash
source /etc/restic.env
restic snapshots

输出示例

code
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 按标签过滤

bash
restic snapshots --tag "daily"

8.3 查看快照中的文件列表

bash
restic ls abc123de
restic ls latest

8.4 查看快照差异

bash
# 比较两个快照
restic diff abc123de def456gh

# 比较最新和上一次
restic diff latest~1 latest

8.5 查看备份统计

bash
restic stats
restic stats abc123de

8.6 检查仓库完整性

bash
# 快速检查(不读取所有数据)
restic check

# 完整检查(读取所有数据块验证校验和)
restic check --read-data

# 检查 10% 的数据
restic check --read-data-subset 10%

九、恢复数据

9.1 恢复到最新版本

bash
source /etc/restic.env
restic restore latest --target /restore

数据将恢复到 /restore 目录,原目录结构保留。

9.2 恢复到指定快照

bash
restic restore abc123de --target /restore

9.3 恢复特定文件

bash
# 先找到文件路径
restic ls abc123de | grep "重要文件.txt"

# 恢复单个文件
restic restore abc123de --target /restore --include "/mnt/data/重要文件.txt"

9.4 挂载浏览(像普通目录一样找文件)

bash
# 创建挂载点
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-mount

9.5 导出单个文件到 stdout

bash
restic dump abc123de /mnt/data/config.txt > /restore/config.txt

十、清理旧快照(节省网盘空间)

10.1 保留策略清理(推荐)

bash
source /etc/restic.env

# 保留最近 7 天每日、最近 4 周每周、最近 6 个月每月的快照
restic forget   --keep-daily 7   --keep-weekly 4   --keep-monthly 6   --prune

10.2 模拟清理(先看效果)

bash
restic forget   --keep-daily 7   --keep-weekly 4   --keep-monthly 6   --prune   --dry-run

10.3 删除指定快照

bash
restic forget abc123de --prune

10.4 手动清理未引用数据块

bash
restic prune

十一、完整自动化备份脚本

创建 /root/backup.sh

bash
#!/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 "========== 备份结束 =========="

赋予执行权限:

bash
chmod +x /root/backup.sh

添加 Crontab 定时任务

bash
crontab -e

添加以下行(每天凌晨 2:30 执行备份):

cron
30 2 * * * /root/backup.sh >> /var/log/restic-cron.log 2>&1

查看日志确认运行状态:

bash
tail -f /var/log/restic-backup.log

十二、安全加固建议

措施说明
全程内网 IPRestic 使用 http://192.168.31.85:5246不要暴露 5244/5246 到公网
防火墙限制飞牛 NAS 防火墙仅开放必要端口,5244/5246 建议仅限局域网访问
强密码策略RESTIC_PASSWORD123456789Li)是数据加密密钥,与 OpenList 登录密码、S3 密钥均不相同
密钥分离存储/etc/restic.env/etc/restic.pass 不要和备份数据放在同一目录
多网盘冗余在 OpenList 挂载 2 个以上网盘,Restic 可分别初始化多个仓库,实现异地冗余
定期恢复测试每季度执行一次 restic restore 测试,验证备份可用性

十三、常见问题

Q1: restic init 报错 Access Denied

  • 检查 OpenList 是否已重启应用 S3 配置
  • 确认 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 与 OpenList 后台生成的一致(注意大小写)
  • 确认 RESTIC_REPOSITORY 中的存储桶名 openlist 与 OpenList S3 配置中的「名称」一致
  • 确认端口是 5246(不是 5244
  • 测试连通性:curl http://192.168.31.85:5246

Q2: 备份大文件时速度很慢?

  • 网盘本身的上传限速是主要瓶颈
  • Restic 的去重机制会大幅减少重复数据的传输
  • 建议夜间执行备份,或挂载支持高速上传的网盘
  • 使用 --limit-upload 避免占用全部带宽

Q3: 备份中断后如何继续?

bash
restic unlock              # 移除残留锁
restic backup /mnt/data    # 重新执行,Restic 会自动增量续传

Q4: 如何备份到多个网盘?

在 OpenList 中挂载多个网盘,分别配置不同的 S3 桶名(如 openlist-baiduopenlist-ali),然后创建多份环境变量文件,分别初始化仓库并执行备份。

Q5: 飞牛 NAS 重启后 OpenList 没有自动启动?

Docker Compose 中已配置 restart: unless-stopped,正常情况下会自动重启。如未启动,检查 Docker 服务是否设置了开机自启。

Q6: 如何查看某个文件是否在备份中?

bash
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模拟运行

当您运行:

bash
restic backup "/vol1/1000/SSD1/备份/日志"

时,Restic 会:

步骤说明
1. 扫描文件读取 NAS 上的 552 个文件
2. 压缩加密加密数据(用您的密码 123456789Li
3. 上传到 S3所有数据存储到 s3://openlist(您的 NAS 上)
4. 保存快照创建索引文件以便恢复

现在的情况

您的数据已经在 S3 上:

code
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手动清理未引用数据

十五、组件版本参考

组件推荐版本来源
OpenListlatest (v4.x+)Docker Hub: openlistteam/openlist
Resticv0.16.4+GitHub Releases / apt
飞牛 NASfnOS 最新版官方更新

用户需要一个独立的命令速查表,以备份/vol1/1000/SSD1/备份/日志为例,包括:

  1. 备份
  2. 恢复
  3. 查找
  4. 删除

并且需要体现:

  • 备份到云端
  • 删除本地不删除云端
  • 添加标签说明
  • 恢复指定快照

我应该创建一个清晰、实用的表格,包含所有常用命令的具体示例。# 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 保留,不删除本地)

错误做法(会导致无法恢复)

bash
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预演删除(不真正执行)

完整工作流示例

周一:初次备份(添加标签)

bash
restic backup "/vol1/1000/SSD1/备份/日志" --tag "2026-06-05-weekly"

周二-周五:每日增量备份

bash
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"

周末:查看备份统计

bash
# 查看所有快照
restic snapshots

# 查看最新快照内容
restic ls latest

# 查看某个快照大小
restic stats abc123de

月末:清理旧备份(保留策略)

bash
# 预演(先看会删除什么)
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

需要恢复:选择合适的快照

bash
# 方法 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"

一键命令(配合环境变量)

在执行命令前,先加载环境变量:

bash
source /etc/restic.env

然后可直接运行上述所有命令。

如果不想每次都 source,可在命令前加:

bash
source /etc/restic.env && restic backup "/vol1/1000/SSD1/备份/日志" --tag "daily"