Advertise with Googlier.com 枫叶飘落 https://cheen.cn Sun, 14 Jun 2026 10:00:36 +0000 en-US hourly 1 https://cheen.cn/wp-content/uploads/2021/06/cropped-fengye-128-32x32.png 枫叶飘落 https://cheen.cn 32 32 基于 [PicoClaw] 的 QNAP QTS 专属 AI 管理助手 https://cheen.cn/1392 https://cheen.cn/1392#respond Sun, 14 Jun 2026 06:52:14 +0000 https://cheen.cn/?p=1392

QNAP Agent

基于 PicoClaw 的 QNAP QTS 专属 AI 管理助手
以 QPKG 插件形式安装,深度适配 QTS 5.x 非标准 Linux 环境。


为什么要做这个

QNAP QTS 是 QNAP 基于 Linux 内核深度定制的闭源系统,与标准 Linux 差异显著——没有 apt/yum,没有 systemctl,配置路径不一样,大量 QNAP 专有命令。通用 AI 对 QTS 了解有限,经常给出无效甚至危险的操作建议。

这个项目基于自己多年使用QNAP NAS的经验,从中获取一些积累,最终的代码实现、文档整理设计交给 AI Agent 完成。我们要做的是把控安全策略:要求 Agent 在 QNAP 这种非标准 Linux 环境中,以更安全、更稳定、更克制的方式运行,尽量遵循QNAP NAS系统的特有命令代码。

之前有一次郁闷的经历,曾经因为以为给 AI 足够高的系统权限,它可以更好管理系统。当 AI 获得权限的第一时间,为了测试拦截机制是否生效,执行了 rm -rf /,而那次拦截代码恰好有一个变量失效 —— 7T 数据就此消失,数据恢复历时一周。
这让我想起《三体》里章北海拿到"自然选择号"指挥权的第一时间,下令:前进四!

因此 qnap-agent 的核心目标不是让 AI "什么都能做",而是让 AI 在明确边界内做正确的事。


功能特性

能力 说明
🧠 QTS 专属知识库 内置 QNAP 系统知识技能包,理解 QTS 与标准 Linux 的差异
📁 文件管理 共享文件夹的文件搜索、整理、批量操作、权限管理
🎬 媒体管理 影音文件分析、媒体库整理、格式识别、流媒体服务管理
🐳 Docker 管理 容器部署、状态查询、日志分析、Compose 项目管理
☁️ OpenList 网盘 40+ 存储源文件管理、直链获取、分享链接、离线下载、存储挂载
🔍 系统诊断 QTS 日志分析、磁盘健康、内存/CPU 监控
🔒 命令安全沙箱 基于正则黑白名单拦截危险命令,防止误操作损坏系统
🗑️ 安全删除工具 safe-rm.sh 将文件移至 @Recycle 回收站而非永久删除
📡 MCP 工具集成 通过 QNAP MCP Assistant 无需完整 Shell 权限即可安全操作 NAS
💬 多渠道接入 Web 界面(18800 端口)/ 微信 / QQ Bot / Telegram Bot
⏰ 定时心跳巡检 每 30 分钟自动检查磁盘空间、容器状态、系统日志异常
🔄 持续学习 Agent 将操作中学到的新知识自动整理为技能包,持续积累
♻️ 自升级机制 看门狗自动完成二进制升级与回滚,无需手动干预

系统要求

项目 要求
QNAP QTS 版本 ≥ 5.0.0
CPU 架构 x86_64、arm64、armv7(含 arm-x31 / arm-x41)
内存 建议 ≥ 2GB 可用
存储空间 ≥ 200MB(安装路径)
网络 需能访问外部 LLM API
可选依赖 Container Station(使用 Docker 管理功能时需要)

安装方法

通过 App Center 手动安装

  1. 从 Releases 页面 下载最新 .qpkg 文件
  2. 登录 QTS Web 管理界面,打开 App Center
  3. 右上角齿轮图标 → 手动安装 → 上传 .qpkg 文件
  4. 安装完成后点击打开,浏览器访问 http://NAS-IP:18800
  5. 完成初始配置:
    • 添加至少一个 LLM 模型并设为默认
    • 在 Launcher 中启动 Gateway

配置 LLM 模型

配置文件位于 ${QPKG_ROOT}/workspace/config.json,安装时由模板自动生成,填写 API Key 后即可使用。

推荐的 LLM 服务提供商:

提供商 推荐模型 api_base
火山引擎(豆包) doubao-seed-1.6、doubao-seed-1.6-flash https://ark.cn-beijing.volces.com/api/v3
通义千问(阿里) qwen3-max、qwen3-plus、qwen3-flash https://dashscope.aliyuncs.com/api/v1
DeepSeek(深度求索) deepseek-chat、deepseek-reasoner https://api.deepseek.com
月之暗面 Kimi kimi-k2.5、kimi-k2-thinking https://platform.moonshot.cn/api/v1
智谱 GLM glm-5、glm-4.6、glm-4-flash https://open.bigmodel.cn/api/paas/v4
文心一言(百度) ernie-4.5、ernie-3.5、ernie-speed https://qianfan.baidubce.com/v2
MiniMax MiniMax-M2.7、abab6.5s-chat https://api.minimaxi.com/v1
腾讯混元 hunyuan-large、hunyuan-turbo https://hunyuan.tencentcloudapi.com/v1
OpenAI gpt-4o、gpt-4o-mini https://api.openai.com/v1
Anthropic Claude(via OpenRouter) anthropic/claude-sonnet-4-5 https://openrouter.ai/api/v1

详细配置说明参考 PicoClaw 文档


权限模型

⚠️ 默认封闭原则:安装即锁,按需开锁

安装完成后,Agent 默认没有系统访问权限:

  • ✅ 能访问的:${QPKG_ROOT}/workspace/ 工作目录(沙箱内)
  • ❌ 不能访问的:/share/ 共享文件夹、/etc/config/ 系统配置(未授权前)
  • ❌ 不能执行的:系统包管理、防火墙修改、用户管理、磁盘格式化、固件升级

当你需要 Agent 管理共享文件夹时,需要在 config.json 的 custom_allow_patterns 中手动添加对应路径的授权。你也可以直接命令 Agent 开放对应文件夹权限,Agent 会告知你具体需要修改的配置。

这样设计的目的:NAS 上的数据往往不可替代,"默认开放"会让你在还没搞清楚 Agent 能做什么之前,就已经暴露了全部数据。


MCP Assistant 集成

QNAP 官方推出了 MCP Assistant QPKG,提供基于标准 MCP 协议的 NAS 管理接口。QNAP Agent 已完整集成对 MCP 工具的调用能力。

为什么推荐 MCP 方式

方式 权限要求 安全性 适用场景
MCP 工具调用 只需 Token,无需开放 Shell ✅ 高,细粒度权限 日常查询、文件管理、用户管理
直接 Shell 命令 需要开放沙箱路径 ⚠️ 取决于配置 Docker 管理、复杂脚本

通过 MCP,Agent 可以在不需要完整 Shell 权限的情况下完成绝大多数日常任务,包括:

  • 查询系统状态(CPU、内存、磁盘、温度、进程)
  • 浏览和搜索共享文件夹中的文件
  • 查看系统日志(支持按级别和关键词筛选)
  • 管理用户和用户组
  • 全文搜索文件内容(需安装 Qsirch)

安装与配置

  1. 在 NAS 的 App Center 中加入 Beta 测试计划,搜索并安装 MCP Assistant

    QTS 5.2.0 版本需从官网手动下载 .qpkg 后通过 App Center 手动安装。

  2. 打开 MCP Assistant → Credentials → Create 创建 Token

    • Name:填写便于辨识的名称,如 qnap-agent
    • Key Type:选择 Secret Key
    • Read-only Mode:
      • ☑ 勾选 → 只读权限(日常查询推荐,最安全)
      • ☐ 不勾选 → 完全权限(创建/删除操作时需要)
    • 点击 Create,记录生成的 Token 字符串
  3. 记录 Token 和 NAS 局域网 IP,直接在对话框中告诉 Agent:

    帮我配置 MCP Assistant 连接,NAS IP 是 192.168.x.x,Token 是 xxxx

    Agent 会读取内置的 QNAP MCP 技能文档,无需重启 Agent 即可使用。

安全提示: Token 代表完整用户权限,请勿将其写入代码仓库或公开场合。MCP 服务使用 HTTP 明文(8442 端口),建议仅在局域网内使用。

配置完成后,向 Agent 提问即可,指明以后调用QNAP MCP工具操作:

"帮我看看 NAS 目前磁盘用了多少?"
"在 Public 文件夹里有没有叫'发票'的文件?"
"最近有没有系统错误日志?"
"现在哪个进程 CPU 占用最高?"

详细的工具文档和调用规范见 skills/qnap-mcp/SKILL.md


OpenList 网盘管理集成

QNAP Agent 已完整集成对 OpenList(AList 社区分支)的 HTTP API 调用能力,通过内置的 qnap-openlist 技能包实现对远程网盘、云盘聚合站点的完整文件管理。

为什么集成 OpenList

方式 适用场景 优势
OpenList API 调用 管理网盘聚合站、远程云盘 ✅ 支持 40+ 存储源(阿里云盘、百度网盘、OneDrive、Google Drive、Quark 等)
MCP 工具调用 管理 QNAP 本地共享文件夹 ✅ 细粒度权限、无需开放 Shell
直接 Shell 命令 复杂脚本、Docker 管理 ⚠️ 取决于沙箱配置

通过 OpenList,Agent 可以跨多个云盘统一管理文件,包括:

  • 浏览和搜索所有已添加存储中的文件
  • 获取文件的下载直链(302 重定向或代理下载)
  • 上传、重命名、移动、复制、删除文件
  • 创建分享链接(支持密码和有效期设置)
  • 管理离线下载任务
  • 管理存储挂载点和驱动配置
  • 索引构建与搜索维护

配置与使用

首次使用时,直接告诉 Agent 你的 OpenList 实例信息:

帮我配置 OpenList 连接,地址是 http://192.168.x.x:5244,用户名 admin,密码 xxx

Agent 会执行 login 命令并将凭据保存至 skills/qnap-openlist/openlist-config.json。后续所有操作无需重复认证。

配置完成后,可以直接向 Agent 下达网盘管理指令:

"在阿里云盘里有没有'发票'相关的文件?"
"帮我把 /Quark/report。pdf 复制到 /Backup/ 目录"
"给 /Aliyundrive/photos 目录下的所有 .jpg 文件创建下载直链"
"搜索所有网盘中关键词为'合同'的文件"

详细的命令参考和最佳实践见 skills/qnap-openlist/SKILL.md


安全删除与回收站

执行删除操作时,Agent 优先使用 tools/safe-rm.sh 将文件移至共享文件夹的 @Recycle 回收站,而非永久删除。删除后可通过 File Station 界面恢复文件。

使用安全删除前,需要为共享文件夹开启回收站功能:

控制台 → 共享文件夹 → 编辑每个共享文件夹 → ☑️ 启用回收站

自升级机制

看门狗(watchdog.sh)每 5 分钟检查 update/ 目录:

  • 支持压缩包(.tar.gz、.zip)和直接二进制文件两种投放方式
  • 发现升级包 → 校验可执行性 → 停服务 → 备份旧版本 → 替换 → 重启
  • 升级失败自动回滚到备份版本
  • 重启不影响对话记忆(memory/ 目录完整保留)

默认不开启自动检查更新。 你可以直接让 Agent 检查更新:

"帮我检查一下 qnap-agent 有没有新版本"

Skills 技能库

Agent 在执行操作前会优先查阅技能库,确保在 QTS 非标准环境中使用正确的命令和安全的操作方式。

技能 覆盖内容
qnap-system QTS 与标准 Linux 差异、QNAP 专有命令、路径约定
qnap-storage 存储池、RAID、逻辑卷、磁盘空间分析
qnap-raid RAID 故障排查、降级恢复、磁盘更换流程
qnap-docker Container Station、容器管理、Compose 项目
qnap-media 媒体文件分析、Plex/Emby/Jellyfin、Arr 全家桶
qnap-network 网络诊断、端口查询、Windows 11 SMB 兼容性
qnap-security 安全加固、Deadbolt 勒索病毒应急处理
qnap-backup HBS3、快照策略、3-2-1 备份原则
qnap-ssl Let's Encrypt 证书申请、stunnel 部署
qnap-plugins ZeroTier、Tailscale、OpenList、NPS 等第三方插件
qnap-mcp MCP Assistant 安装配置、24 个工具完整文档
qnap-openlist OpenList 网盘 API 集成、文件管理、分享、离线下载、存储管理
qnap-forbidden 绝对禁止操作清单,防止误操作损坏系统
qnap-learned-* Agent 自动积累的使用经验(持续增长)

下载


]]>
https://cheen.cn/1392/feed 0
威联通QNAP gocron 定时任务管理系统 https://cheen.cn/1368 https://cheen.cn/1368#respond Thu, 07 Nov 2024 11:47:49 +0000 https://cheen.cn/?p=1368 QNAP gocron 定时任务管理系统 Release

Go语言开发的定时任务集中调度和管理系统, 用于替代Linux-crontab

全新版本 v1.6.1

  • 改用全新项目,从老版本的gocron克隆过来进行了全面升级
  • 新版本在旧版本的基础上做了优化,增加了更多功能。
  • 不兼容旧版本数据库
  • 旧版本数据库不会被删除,保留在conf\gocron.db,新版本数据库在安装目录下data\gocron.db

核心特性

  • ⚡️ 高性能:基于 Go 语言开发,性能卓越,资源占用低

  • 🎯 易于使用:Web 界面管理,简单直观,无需复杂配置

  • 🔐 安全可靠:支持双因素认证(2FA)和 TLS 双向认证

  • 📊 日志管理:完善的任务执行日志,支持自动清理和归档

  • 🌐 分布式:支持多节点部署,任务分发执行

  • 🔔 通知提醒:任务执行失败时支持多种方式通知

✨ 功能特性

  • Web 界面管理:直观的定时任务管理界面
  • 秒级定时:支持 Crontab 时间表达式,精确到秒
  • 高可用:基于数据库锁的 Leader 选举,秒级自动故障转移
  • 任务重试:支持任务执行失败重试设置
  • 任务依赖:支持配置任务依赖关系
  • 多用户权限:完善的用户和权限控制
  • 双因素认证:支持 2FA,提升系统安全性
  • Agent 自动注册:支持 Linux/macOS 一键安装注册
  • 多数据库支持:MySQL / PostgreSQL / SQLite
  • 日志管理:完整的任务执行日志,支持自动清理
  • 消息通知:支持邮件、Slack、Webhook 等多种通知方式

截图

下载

阿里云盘

Github Releases

如何使用

在QNAP系统,通过App Center手动安装 .qpkg 后辍程序。

  • 支持 x86_64 构架的QNAP存储设备
  • 支持 arm64 构架的QNAP存储设备

安装准备

  • 默认使用Sqlite3数据库,首次登陆需要设置用户密码
  • 如果要用MySQL数据库,安装前去威联通的管理页面打开MariaDB5服务(原MySQL服务),位置在:控制台→应用程序→MariaDB
]]>
https://cheen.cn/1368/feed 0
备份QNAP的相册QuMagie人像数据 https://cheen.cn/1354 https://cheen.cn/1354#respond Wed, 06 Nov 2024 12:18:30 +0000 https://cheen.cn/?p=1354

QuMagie Face Metadata Backup Tool

项目简介

QuMagie 版本 v2.4.0 支持了人脸识别元数据的备份和恢复,但目前每次备份仍需通过网页端手动操作。

为了简化这一过程,我编写了一个基于 QuMagie 备份程序代码的自定义备份命令工具。这款工具能够自动化备份操作,不再需要每次都手动进行备份。

此命令工具是基于QuMagie安装目录的CLI文件 qumagie/v2.4.0/cli/qm_export 提取的相关运行命令,不会对原文件进行更改。

QuMagie 元数据备份机制

在之前的文章中,我介绍过通过备份 MySQL 相册数据 S01 库来实现人脸识别数据的备份。在 QTS 旧版本中,这种方法能够正常导入和识别。然而,在 QTS 5.0 及以上版本的更新,系统会自动重新索引数据,导致已导入的数据丢失,并且人脸识别数据被重新识别。

这次 QuMagie 新发布的版本采用了新的备份原理:将每张图片或视频的元数据保存为 JSON 文件。每次备份时,系统会生成一个对应的 JSON 文件,并将其存储在照片文件夹下的隐藏目录 . @__thumb 中,文件名与照片或视频文件名一致,后缀为 .json。这个 JSON 文件包含了照片和视频的详细元数据、相册 ID、人脸识别信息等重要数据。

JSON 文件结构示例内容:

每个备份的 JSON 文件都包含了与图片或视频相关的所有元数据。以下是一个 JSON 文件的示例:

{
    "MediaType": "photo",
    "Path": "/share/Photo/全家福/01.jpg",
    "Title": "01 (17)",
    "Comment": "null",
    "Keywords": "null",
    "ColorLevel": "0",
    "Longitude": "null",
    "Latitude": "null",
    "Time": "2022-07-15 18:30:56",
    "Favorite": "0",
    "Rating": "0",
    "Objects": [
        {
            "object": {
                "id": "k2jlff",
                "name": "Wedding"
            }
        },
        {
            "object": {
                "id": "GtGVc0",
                "name": "Person"
            }
        },
        {
            "object": {
                "id": "tCyPUP",
                "name": "Clothing"
            }
        },
        {
            "object": {
                "id": "kwg2xK",
                "name": "Wedding dress"
            }
        },
        {
            "object": {
                "id": "bdoUmX",
                "name": "Bride"
            }
        }
    ],
    "Faces": [
        {
            "face": {
                "name": "爸爸",
                "FaceId": "HmPbzl",
                "X": "201",
                "Y": "105",
                "Width": "136",
                "Height": "152",
                "GroupId": "cTinsP",
                "iFaceCover": "M92WZX"
            }
        },
        {
            "face": {
                "name": "妈妈",
                "FaceId": "tu1TsA",
                "X": "295",
                "Y": "285",
                "Width": "121",
                "Height": "160",
                "GroupId": "TGcDVc",
                "iFaceCover": "t0Ys2S"
            }
        }
    ],
    "Albums": [],
    "Qtag": "32febe21201f4fbfb94d02b58d15b3972ec9d78803e5",
    "DataVersion": "1.0"
}

使用方法

将qumagie-backup.sh文件上传到你的 QNAP 设备中,并赋予0755系统权限。

编辑qumagie-backup.sh代码,填入相关的备份用户名以及保存地址。
关键数据是第10-13行

export_type="metadata"   
可选:metadata ,仅元数据。表示从帐户导出元数据(例如相册、标签、人物等)
可选:full,文件和元数据。从帐户导出媒体文件和元数据(例如相册、标签、人物等)

target_folder="备份/照片备份/QuMagie"
 备份路径,是在/share/目录下的文件夹,所以前戳不需要再加/share/路径

uname="admin"
当前用户名,如果是最高权限管理员,可以备份其他用户的数据。

password=""
可选密码。为空则密码为系统默认`qnapqnap`,如果这里设置为`123456`,则密码为`qanpqnap123456`

可执行文件

[阿里云盘] https://www.alipan.com/s/T1LGsXY4P4d

相关截图

command
数据类型

]]>
https://cheen.cn/1354/feed 0
QNAP QuFirewall 防火墙的规则 https://cheen.cn/1321 https://cheen.cn/1321#comments Fri, 01 Mar 2024 12:45:23 +0000 https://cheen.cn/?p=1321

QNAP QuFirewall 防火墙配置和虚拟网络设备管理

QNAP QuFirewall 防火墙概览

QuFirewall 是 QNAP NAS 设备上的防火墙功能,用于管理网络流量、控制数据包的流向和访问权限。在启用 QuFirewall 防火墙时,默认不会存在开放所有端口的规则,以提高网络安全性。

  • 默认规则和安全策略
    当 QuFirewall 开启时,默认不会有如下规则:

    ☑️ - 接口[ALL] - 服务端口[任何] - 协议[任何] - 来源[任何] - 权限[允许]

因为这样的规则将导致防火墙不再限制任何端口的流量,仅进行一些基础的安全防护。例如,在指定时段内多次尝试登录失败时,系统将自动阻止恶意 IP 地址,提高对 SSH、FTP、HTTP/HTTPS 等服务的破解抵抗能力。

  • 防火墙策略的配置

在大局域网中,NAS 设备相对较为安全。但在公网环境下,用户可能希望开放部分服务端口以供外部访问,同时又需要限制不必要的 IP 段的扫描。这时可以配置 QuFirewall 仅允许来自中国的流量,以有效保护免受互联网上的恶意扫描攻击。

当用户使用 ZeroTier、Tailscale 等服务时,它们通常会创建虚拟网络设备。由于 QNAP 防火墙无法识别第三方创建的虚拟网络设备,导致流量无法通过这些设备进入 NAS,只能从 NAS 流出。这可能导致 NAS 可以 ping 通其他设备,但其他设备无法 ping 通 NAS 的 IP。
QNAP 无法识别虚拟网络设备的情况下,可能导致 NAS 无法建立到虚拟网络的双向通信。这是因为防火墙默认不会包含虚拟设备的规则,导致进入 NAS 的流量被阻止,仅有流出的权限。

手动添加虚拟网络设备规则

为了解决虚拟网络设备流量无法进入 NAS 的问题,可以使用 Linux 系统命令 iptables 手动配置防火墙规则。当启用 QuFirewall 防火墙时,系统会自动创建一个名为 QUFIREWALL 的链,用于配置防火墙策略。通过运行命令 iptables -L QUFIREWALL -v 可以查看当前防火墙规则。

  • 首先要查看虚拟网络设备名,ZeroTier 创建的设备名是 ztfp6pggry
    当ZeroTier加入第二个Network ID后,会新增加类似ztrf2u52bz的名字,以zt开头的设备,这时就存在多个虚拟网络设备。
    第二个命令可以查找以zt开头的设备名字

    ip link show
    ip link show | awk -F'[[:space:]]|:' '/zt/ && NF>2 {print $3}'

  • 要手动添加虚拟网络设备,可以使用以下命令:

    iptables -I QUFIREWALL 1 -i ztfp6pggry -j ACCEPT

  • 也可以使用下面代码,避免多次运行导致规则列表中出现冗余的重复规则

    iptables --check QUFIREWALL -i ztfp6pggry -j ACCEPT || iptables -I QUFIREWALL 1 -i ztfp6pggry -j ACCEPT

这将允许虚拟网络设备 ztfp6pggry 的所有流量通过QUFIREWALL防火墙。
运行 iptables -L QUFIREWALL -v 可以查看数字部分(如 pkts bytes),表示有多少数据包和字节数通过该规则,如果这个数值不断变大,表示该设备有流量通过,证明我们说的这个设备已经被系统防火墙接纳。
以下是运行iptables -L QUFIREWALL -v 的示例输出:

Chain QUFIREWALL (1 references)
 pkts bytes target     prot opt in     out     source               destination
  250 85642 ACCEPT     all  --  ztfp6pggry any     anywhere             anywhere
    0     0 ACCEPT     all  --  docker0 any     anywhere             anywhere
    0     0 ACCEPT     all  --  lxdbr0 any     anywhere             anywhere
    0     0 NFLOG      all  --  !lo    any     anywhere             anywhere             match-set PSIRT.ipv4 src nflog-prefix  "RULE=4 ACT=DROP"
   48 21272 ACCEPT     all  --  br0    any     192.168.1.0/24       anywhere
    9   456 ACCEPT     all  --  !lo    any     anywhere             anywhere             -m geoip --source-country CN
   18  5684 NFLOG      all  --  !lo    any     anywhere             anywhere             nflog-prefix  "RULE=15 ACT=DROP"
   18  5684 NFLOG      all  --  !lo    any     anywhere             anywhere             nflog-prefix  "RULE=15 ACT=DROP" nflog-group 1
   18  5684 DROP       all  --  !lo    any     anywhere             anywhere

删除虚拟网络设备规则

如果需要删除已添加的虚拟网络设备,可以使用以下命令:

iptables -D QUFIREWALL -i ztfp6pggry -j ACCEPT

注意

  • 当关闭/开启防火墙后,我们手动配置的 ztfp6pggry 在防火墙列表里会看不到,但是流量转发规则还存在。
  • 当 QNAP 系统重启后,此条规则会失效,需要重新手动配置。
  • 通过以上配置,用户可以更灵活地管理防火墙策略。

以上内容是在配置 ZeroTier 过程中发现的问题和解决方法,顺便写下来,作为备忘录。

]]>
https://cheen.cn/1321/feed 1
QNAP 威联通插件 ZeroTier 虚拟局域网 https://cheen.cn/1302 https://cheen.cn/1302#comments Thu, 29 Feb 2024 08:49:39 +0000 https://cheen.cn/?p=1302 ZeroTier For QNAP With WebUI Release

ZeroTier是一款异地组网工具,能够将多个网络设备连接到一个虚拟网络中,通过局域网IP即可轻松访问所有服务。
ZeroTier builds modern, secure multi-point virtual networks, connecting peer-to-peer networks and multi-cloud mesh infrastructure.

介绍

  • 本项目地址: https://github.com/iranee/qnap-zerotier
  • v1.16.1 更新

    • 跟随官方全新LOGO
    • 增加新版控制中心入口
    • 增加配置界面未登录QNAP验证
    • 修改退出Network ID逻辑,保证新版可用

    v1.14.0 更新

    • 增加设置选项 allow Managed 【默认开启】
    • 增加设置选项 allow DNS
    • 增加设置选项 allow Default
    • 增加设置选项 allow Global
    • 优化防火墙命令,避免频繁调用
    • 二进制可执行文件来自:https://download.zerotier.com/RELEASES/

    v1.12.2.2

    • 自动添加虚拟网络设备到防火墙QuFirewall的规则
    • 关于防火墙的说明:https://cheen.cn/1321

    第一版 v1.12.2.1

    • 暂时只支持加入1个Network ID
    • ARM版本受限于没有设备,无法测试。

    网络状态说明

    • ACCESS_DENIED(🚫未授权): 表示节点尝试加入网络,但被拒绝。这可能是由于网络管理员配置的限制或权限设置。
    • NOT_FOUND(🚫无效网络): 表示尝试加入的网络不存在。可能是因为网络ID不正确或网络已经被删除。
    • OK(✅正常): 表示成功加入网络,一切正常。
    • REQUESTING_CONFIGURATION(⌛配置中): 表示节点正在请求配置信息。
    • AUTHORIZING(⌛授权中): 表示节点正在进行授权过程,等待网络管理员的批准。
    • ROUTER_CANT_READ_NETWORK_CONFIG(🚫无配置): 表示路由器无法读取网络的配置信息。
    • DENY(🚫拒绝): 表示加入请求被拒绝。
    • OFFLINE(🚫离线): 表示节点当前处于离线状态,可能是由于网络连接问题。

    如何使用

    在QNAP系统,通过App Center手动安装 .qpkg 后辍程序。

    打开WEBUI界面,输入要加入的 Network ID,等待10秒。

    • 支持 x86_64 构架的QNAP存储设备【x86_64】
    • 支持 aach64 构架的QNAP存储设备 【arm_64】
    • 支持 ARM 构架的QNAP存储设备 【arm-x41】
    • WebUI

    交流群

    • 群名称: QQ群号: 529743094
    • 可以交流各种QNAP技术、技巧、问题。

      QQ GRPUP

    Starchart

    Star History Chart

    注意事项

    • 建议路由器放行9993端口,尤其是有公网IP的用户。
    • 如果加入网络后不能访问,请尝试安装QVPN插件后重启系统
    • 如果加入网络后不能访问,请检查QuFirewall防火墙设置是否禁用了外国IP访问

    下载链接

    ]]>
    https://cheen.cn/1302/feed 6
    清理QNAP中多余的苹果Live Photo MOV文件 Plus版 https://cheen.cn/1282 https://cheen.cn/1282#comments Sat, 01 Apr 2023 12:22:21 +0000 https://cheen.cn/?p=1282

    Delete the Live Photo MOV file that corresponds to a non-existent Live photo.

    代码

    #!/bin/bash
    DIR_PATH="/share/Photo/手机相册备份/"
    FFPROBE_PATH="/share/CACHEDEV1_DATA/.qpkg/MediaSignPlayer/CodexPackExt/static/bin/ffprobe"
    SHORT_VIDEOS_FILE="/share/CACHEDEV2_DATA/备份/照片备份/find-5s-mov.short_videos.txt"
    ERROR_VIDEOS_FILE="/share/CACHEDEV2_DATA/备份/照片备份/find-5s-mov.ERROR_videos.txt"
    PROCESSED_VIDEOS_FILE="/share/CACHEDEV2_DATA/备份/照片备份/processed_videos.txt"
    GREEN='\033[32m'  # 设置绿色文本颜色
    RED='\033[31m'    # 设置红色文本颜色
    NC='\033[0m'      # 恢复默认文本颜色
    
    # 创建 processed_videos.txt 文件如果不存在
    touch "$PROCESSED_VIDEOS_FILE"
    
    # 设置是否已跳过检测文件的标志
    is_skipped=false
    
    # 使用 while read 读取 find 命令的输出,并用双引号包裹变量,以处理含有空格的文件名和路径
    find "$DIR_PATH" \( -iname "*.mov" -o -iname "*.mp4" \) ! -path "*/@Recycle/*" ! -path "*/.@__thumb/*" -print0 | while IFS= read -r -d '' mov_file; do
        if grep -Fxq "$mov_file" "$PROCESSED_VIDEOS_FILE"; then
            # 视频文件已经处理过,跳过检测并提示
            if ! $is_skipped; then
                echo "正在跳过已检测文件..."
                is_skipped=true
            fi
            continue
        fi
    
        if [ ! -f "${mov_file%.*}.JPG" ] && [ ! -f "${mov_file%.*}.jpg" ] && [ ! -f "${mov_file%.*}.HEIC" ] && [ ! -f "${mov_file%.*}.heic" ]; then
            output="$("$FFPROBE_PATH" -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$mov_file" 2>&1)"
    
            # 逐行检查输出内容,找到有效的时长信息
            duration=""
            while IFS= read -r line; do
                # 判断该行是否为数字(时长信息)
                if [[ "$line" =~ ^[0-9]+\.[0-9]+$ ]]; then
                    duration="$line"
                    break
                fi
            done <<< "$output"
    
            # 判断是否成功获取到时长信息
            if [[ -n "$duration" ]]; then
                if [ "$(echo "$duration < 5" | busybox bc)" -eq 1 ]; then
                    echo -e "${GREEN}$mov_file - $duration${NC}"  # 符合条件,显示绿色
                    echo "rm \"$mov_file\"" >> "$SHORT_VIDEOS_FILE"
                else
                    echo "$mov_file - $duration"  # 不符合条件,显示正常颜色
                fi
            else
                echo -e "${RED}$mov_file - 错误的视频文件${NC}"  # 无法获取时长的视频,显示红色
                echo "rm \"$mov_file\"" >> "$ERROR_VIDEOS_FILE"
            fi
    
            # 将处理过的视频文件路径添加到 processed_videos.txt 中
            echo "$mov_file" >> "$PROCESSED_VIDEOS_FILE"
        fi
    done
    echo -e "\033[32m完成!\033[0m"
    

    为什么有这个脚本

    iPhone的Live Photo照片由一张照片+一个小于5秒的MOV视频组成。
    通过工具或者手机App将iPhone照片上传到QNAP里,会自动分解成2个文件。
    当在QNAP中,通过QuMagie AI相册删除Live Photo照片,系统仅仅删除了照片文件本身,配套的Live Photo MOV文件还保留。

    ChatGPT 讲解工作原理

    这个脚本的目的是搜索同名的图片是否存在Live Photo MOV文件,如果存在,则跳过检测,因为Live Photo通常包含一个MOV视频文件和一个同名的JPG或HEIC图像文件。如果只有视频文件而没有图片文件,则检测视频的时长是否小于5秒,小于5秒则表示这个视频不是必须的,可以删除。

    具体来说,这段代码的执行过程如下:

    • 将目录路径"/share/Photo/手机相册备份/"和ffprobe程序路径"/share/CACHEDEV1_DATA/.qpkg/MediaSignPlayer/CodexPackExt/static/bin/ffprobe"分别赋值给变量DIR_PATH和FFPROBE_PATH。

    • 将空字符串的内容写入名为"short_videos.txt"的文件。

    • 使用"find"命令在指定目录下查找所有扩展名为.mov的文件,同时使用"! -path"参数排除掉包含字符串"@Recycle"和".@__thumb"的文件夹。然后使用一个for循环遍历所有查找到的视频文件。

    • 使用if条件语句判断视频文件是否存在与其同名的JPG或HEIC格式的图片文件。如果不存在,则执行以下步骤:
      使用ffprobe程序获取视频文件的时长。

    • 判断视频时长是否小于5秒,如果小于5秒,则将该视频文件记录到输出文件find-5s-mov.shshort_videos.txt中,并标记为绿色。
      对于无法获取时长的视频文件(例如由于文件格式错误等原因),将其记录到输出文件find-5s-mov.ERROR_videos.txt中,并标记为红色。

    注意

    用这个代码的前提是已经安装CAYIN MediaSign Player,并且购买了11.9USD的H.265授权。
    其中文件short_videos.txt里面是搜索到的MOV文件绝对路径,为了安全起见,可以手动查看生成的文件列表是否正确,查看对应MOV文件是否有同名的JPG/HEIC照片,如果没有,证明生成的文件是正确的。
    对于无法获取时长/损坏/不可识别的视频文件,会在窗口显示红色文字,并且输出到find-5s-mov.ERROR_videos.txt中,可以手动查看该文件或删除。
    脚本会保存已经检测过的视频文件名,下次运行会跳过这些文件,检测新的文件。
    之后在shell里运行 short_videos.txt 里面的代码即可删除对应MOV文件。

    ]]>
    https://cheen.cn/1282/feed 4
    QNAP 威联通挂载多个网盘、WebDAV,支持阿里云盘、百度云盘等 https://cheen.cn/1210 https://cheen.cn/1210#comments Fri, 07 Oct 2022 08:23:23 +0000 https://cheen.cn/?p=1210 多云盘挂载集成工具 for QNAP

    Alist webdav for QNAP Release

    A file list program that supports multiple storage, powered by Gin and Solidjs.

    介绍

    一款支持多种网络存储、挂载本地存储、阿里云盘、百度网盘、OneDrive、Google Drive 等,支持网页浏览和 WebDAV 的文件列表程序。

    v3.13.2 Update:

    • 建议卸载v3.13.2之前版本,安装最新版,以便使用最新数据库形态
    • 手动挂载网盘,不要恢复之前备份内容。(可以将token记录后复制)

    对应系统内核

    文件名 对应内核
    x86_64 linux-amd64 & x86_64
    arm_64 linux-arm64
    arm-x41 linux-musl-amd64

    如何使用

    在QNAP系统,通过App Center手动安装 .qpkg 后辍程序。

    • 支持 x86_64 构架的QNAP存储设备
    • 支持 ARM 构架的QNAP存储设备
    • 支持 aach64 构架的QNAP存储设备

    插件安装包:https://www.aliyundrive.com/s/VaejJeNJMoY

    WebDAV 存储支持

    存储类型 列出文件 / 文件夹 下载文件 / 创建目录 / 重命名 / 移动 复制 上传文件/文件夹
    本地存储 ✅ ✅ ✅ ✅
    阿里云盘 ✅ ✅ ✅ ✅
    Onedrive ✅ ✅ ✅ ✅
    天翼云盘 ✅ ✅ ✅ ✅
    GoogleDrive ✅ ✅ ❌ ✅
    123pan ✅ ✅ ❌ ✅
    FTP ✅ ✅ ❌ ✅
    SFTP ✅ ✅ ❌ ✅
    PikPak ✅ ✅ ✅ ✅
    S3 ✅ ✅ ✅ ✅
    USS ✅ ✅ ✅ ✅
    WebDAV ✅ ✅ ✅ ✅
    Teambition ✅ ✅ ✅ ✅
    分秒帧 ✅ ✅ ✅ ✅
    和彩云 ✅ ✅ ✅ ✅
    YandexDisk ✅ ✅ ✅ ✅
    百度网盘 ✅ ✅ ✅ ✅
    夸克网盘 ✅ ✅ ✅ ✅

    工作

    配置

    类型 配置
    默认用户名 admin
    默认密码 123456
    访问Url http[s]://localhost:5244
    webdav 用户名 同上
    webdav 密码 同上
    webdav Url http[s]://localhost:5244/dav/

    交流群

    • 群名称: Alist for QNAP QQ群号: 529743094
    • 可以交流各种QNAP技术、技巧、问题。

    QQ GRPUP

    注意

    • 威联通HBS3挂载的名称必须为英文,不能挂载/dav/根目录,要带网盘的挂载路径
    • 例如阿里云盘的alist挂载目录名称是aliyundrive
    • 挂载URL:http://127.0.0.1:5244/dav/aliyundrive

    本软件为免费开源项目,无任何形式的盈利行为。

    1. 本软件为免费开源项目,无任何形式的盈利行为。
    2. 本软件服务于各种网盘,旨在让各大网盘功能更强大。如有侵权,请与我联系,会及时处理。
    3. 本软件皆调用官方接口实现,无任何“Hack”行为,无破坏官方接口行为。
    4. 本软件仅做流量转发,不拦截、存储、篡改任何用户数据。
    5. 严禁使用本软件进行盈利、损坏官方、散落任何违法信息等行为。
    6. 本软件不作任何稳定性的承诺,如因使用本软件导致的文件丢失、文件破坏等意外情况,均与本软件无关。
    ]]>
    https://cheen.cn/1210/feed 46
    WordPress Bark 推送评论通知 https://cheen.cn/1143 https://cheen.cn/1143#comments Thu, 20 Jan 2022 12:27:04 +0000 https://cheen.cn/?p=1143

    Comment to Bark for WordPress

    WordPress Bark 推送评论通知

    • 支持自定义推送铃声
    • 支持自定义推送图标
    • 支持自动跳转到评论页面
    • 支持检测是否为作者ID

    变量

    $comment       评论结构
    $post_name      被评论的文章
    $bark_key       bark token
    $bark_icon      bark 推送图标
    $bark_group     bark 群组
    $bark_goto_url  bark 文章链接
    $bark_sound     bark 推送声音
    $bark_archive   bark 保存信息   1-启用 0-停用 启用后客户端自动保存推送信息
    $isMyself       检测作者ID      1-启用 0-停用 启用后当评论者为 $customName 时不通知 
    $customName     作者评论ID      如果此值为空,则停用检测
    

    获取Bark token

    • 适合iPhone的客户端:App Store 商店
    • 适合Android的客户端:PushLite
    • Bark客户端和服务端均已开源,也可以自己部署
    • 安装后打开bark App,将红线上方的token填入变量$bark_key = ""里面

    如何使用

    编辑主题目录下的functions.php,在最后一行加入以下内容:

    /**
     * WordPress Bark 推送评论通知
     * Comment to Bark for WordPress
     * 作者bbis
     * 版本1.0
     * 博客 https://cheen.cn
     * 
     * $comment 评论结构
     * $post_name       被评论的文章
     * $bark_key        bark token
     * $bark_icon       bark 推送图标
     * $bark_group      bark 群组
     * $bark_goto_url   bark 文章链接
     * $bark_sound      bark 推送声音
     * $bark_archive    bark 保存信息   1-启用 0-停用 启用后客户端自动保存推送信息
     * $isMyself        检测作者ID      1-启用 0-停用 启用后当评论者为 $customName 时不通知 
     * $customName      作者评论ID      如果此值为空,则停用检测
     * 
     **/
    
    function bark_push_msg($comment, $post_name)
    {
            $bark = "https://api.day.app/";
            $bark_key = "********";
            $bark_icon = "";
            $bark_group = "Blog";
            $bark_goto_url = get_permalink( $comment->comment_post_ID );
            $bark_sound = "gotosleep";
            $bark_archive = "1";
            $isMyself = "1";
            $customName = "admin";
    
            if($isMyself == '1') {
                if (!empty($customName)) {
                    if ($comment->comment_author == $customName) {
                        return $comment;
                    }
                } elseif ($comment->comment_author == 1) {
                    return  $comment;
                }
            }
    
            $title = "博客收到了新的评论";
            $message = $comment->comment_author . "在『 $post_name 』评论:\n" . $comment->comment_content;
    
            $postdata = array(
                'title' => $title,
                'body' => $message
            );
    
            !empty($bark_icon) ? $postdata["icon"] = $bark_icon : "";
            !empty($bark_group) ? $postdata["group"] = $bark_group : "";
            !empty($bark_archive) ? $postdata["isArchive"] = $bark_archive : "";
            !empty($bark_sound) ? $postdata["sound"] = $bark_sound : "";        
            !empty($bark_goto_url) ? $postdata["url"] = $bark_goto_url : "";
    
            $opts = array('http' =>
                array(
                    'method'  => 'POST',
                    'header'  => 'Content-type: application/x-www-form-urlencoded',
                    'content' => http_build_query($postdata)
                ),
                "ssl" => array(
                    "verify_peer" => false,
                    "verify_peer_name" => false
                )
            );
    
            $context  = stream_context_create($opts);
            $result = file_get_contents($bark.$bark_key, false, $context);
            return  $comment;
    }
    
    add_action('comment_post', 'comment_bark_notify');
    function comment_bark_notify($comment_id) 
    {
        $comment = get_comment($comment_id);
        bark_push_msg($comment, get_the_title($comment->comment_post_ID));
    }
    
    ]]>
    https://cheen.cn/1143/feed 1