收起左侧

vibe coding手挫相机读卡器自动备份

1
回复
88
查看
[ 复制链接 ]

1

主题

0

回帖

0

牛值

江湖小虾

6 小时前 显示全部楼层 阅读模式
使用过群晖的相机读卡器自动备份,感觉对喜欢拍照的人特别友好,插入之后自动就备份了,最近用chatgpt写了一个类似应用,在配置界面使用uuid设置好卡的uuid,以及要同步哪些目录的内容,同步到哪里去
需要有一点docker经验:
使用docker运行
使用rysnc同步,因此可以增量同步

具体说明:
# USB 增量同步(Syslog复用版)— 飞牛OS Docker App

该应用在检测到“指定USB设备”已挂载后,自动将该USB中的指定目录集合增量同步到目标路径。
同步完成/失败会写入 **syslog**(tag: `usb-sync`),以便你在飞牛系统中用“系统事件/告警规则”复用已配置好的邮件账号发送提醒。

## 1. 功能特性

- 仅当 **匹配的USB设备** 挂载后触发(支持 UUID / LABEL / by-id 子串)
- rsync 增量同步(可选 `--delete` 镜像同步)
- Web UI:配置匹配方式、源目录列表、目标目录、排除规则、策略选项
- 同步结果:
  - 写入 syslog:`usb-sync: INFO/ERROR ...`
  - 写入详细日志文件:`data/logs/sync-*.log`
  - Web 页面显示最近一次运行结果
- 防重复触发:
  - 运行锁(避免并发)
  - 冷却窗口(默认 120s)

## 2. 部署步骤(推荐目录)

建议放到:
- `/volume1/docker/usb-sync-syslog/`

目录结构:
```
usb-sync-syslog/
  docker-compose.yml
  app/...
  data/
    config.yaml
    logs/
    state/
```

### 2.1 启动

进入目录执行:

```bash
docker compose up -d --build
```

访问 Web UI:
- `http://NAS_IP:8787`

## 3. 配置说明(Web UI 或 data/config.yaml)

### 3.1 指定USB设备(强烈推荐 UUID)

在飞牛终端执行:

- 查看 UUID:
```bash
ls -l /dev/disk/by-uuid/
```

- 查看 LABEL:
```bash
ls -l /dev/disk/by-label/
```

- 查看 by-id(可用于子串匹配):
```bash
ls -l /dev/disk/by-id/ | grep -i usb
```

在 Web UI 中选择模式并填写匹配值:
- `fs_uuid`:填 UUID(例如 `1234-ABCD`)
- `fs_label`:填卷标(例如 `MYUSB`)
- `by_id_substr`:填 by-id 文件名中的稳定子串(例如 `usb-WD_My_Passport`)

### 3.2 源目录与目标目录

- sources:相对 USB 挂载点的路径,一行一个(Web UI)/ YAML 数组
  - 示例:`DCIM`、`Photos/Export`
- target:NAS 上的绝对路径
  - 示例:`/volume1/backup/usb_import`

同步策略:
- `delete: true` 会启用 rsync `--delete`,让目标严格镜像源(谨慎启用,可能删除目标中源不存在的文件)
- `checksum: true` 更严格但更慢
- `partial/inplace` 对大文件更友好

## 4. syslog 复用飞牛邮件提醒(关键)

应用会写入 syslog(tag:`usb-sync`):

- 同步开始:
  - `usb-sync: INFO Trigger=... START device=...`
- 同步成功:
  - `usb-sync: INFO FINISH SUCCESS; USB sync SUCCESS; ...`
- 同步失败:
  - `usb-sync: ERROR FINISH FAILED; USB sync FAILED; ...`

### 4.1 在飞牛系统中设置邮件规则

在飞牛 UI 中找到“通知/告警/系统事件(不同版本命名可能略有不同)”,建议设置规则:

- 触发条件(任选其一):
  - 关键词包含:`usb-sync`
  - 或级别为:ERROR(失败时更精准)
- 动作:
  - 发送邮件(使用飞牛系统已配置的邮箱)

这样你只需在飞牛系统配置一次邮箱,本应用不重复配置 SMTP。

## 5. 注意事项与排障

### 5.1 /dev/log 挂载点可能不同

本 compose 默认挂载 `/dev/log:/dev/log`。
如果你的飞牛系统 syslog socket 不在 `/dev/log`,则容器内写 syslog 可能失败,表现为:
- 飞牛系统事件里看不到 `usb-sync`
- 但容器日志/详细日志正常

排查方法(在宿主机):
```bash
ls -l /dev/log
ls -l /run/systemd/journal/dev-log
```

若实际存在的是 `/run/systemd/journal/dev-log`,则把 compose 改为:
```yaml
- /run/systemd/journal/dev-log:/dev/log
```

然后重启:
```bash
docker compose down
docker compose up -d
```

### 5.2 权限问题

目标目录必须可写(容器以 root 运行通常没问题)。
如果目标是 SMB 挂载或特殊权限目录,建议先在宿主机确认可写。

### 5.3 挂载点规则变化

应用不依赖固定挂载点,而是:
- 先根据 UUID/LABEL/by-id 找到设备节点
- 再从 `/proc/mounts` 找到当前挂载点

因此比写死路径更稳。

### 5.4 防止重复触发

默认 `COOLDOWN_SEC=120`。如果你插着USB不拔又希望“只跑一次”,可把冷却调大,例如 3600。

## 6. 文件位置

- 配置:`data/config.yaml`
- 运行状态:`data/state/last_run.json`
- 详细日志:`data/logs/sync-*.log`



## 7. 实时进度

配置页会每 1 秒轮询一次 `GET /progress`,实时展示 rsync 输出解析出的:当前目录、当前文件、百分比、速度、ETA。

注意:rsync 的百分比为“当前源目录(sources 中当前项)的整体进度”,切换到下一个源目录会从 0% 重新开始。


## 8. 目录挂载说明(V3变更)

为避免“单文件 bind-mount”在部分系统上出现原子替换失败,V3 将 `./data` 整目录挂载到容器 `/app/data`。配置写入位置为:`/app/data/config.yaml`。


## 9. 自动弹出USB(umount)

在配置页勾选“同步完成后自动弹出USB(umount)”后,任务完成会执行:

1) `sync`
2) `umount <挂载点>`(失败则重试,最后尝试 `umount -l`)

注意:`umount` 成功表示文件系统已安全卸载,但不保证设备断 电/停转;这取决于USB桥与系统是否支持电源管理。

若 `umount` 报 busy,通常是有进程占用挂载点(例如文件管理器/媒体索引)。可先关闭占用进程或改为手动弹出。

收藏
送赞
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

3

主题

6

回帖

0

牛值

🛩️ARM内测用户组

这个AI写的教程太笼统了,我部署之后发现一个问题,需要在Docker中映射USB设备的目录才能正常使用

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则