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 内网 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

二、架构回顾

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

十二、安全加固建议

措施 说明
全程内网 IP Restic 使用 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 手动清理未引用数据

十五、组件版本参考

组件 推荐版本 来源
OpenList latest (v4.x+) Docker Hub: openlistteam/openlist
Restic v0.16.4+ GitHub Releases / apt
飞牛 NAS fnOS 最新版 官方更新

用户需要一个独立的命令速查表,以备份/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"