推荐采用:统一任务编排层 + 协议内核适配层 + 双下载内核。
qBittorrent-noxaria2share-adapter,优先走服务端转存,失败降级真实下载任务download-orchestrator 暴露统一 REST/WebSocket API、统一任务模型、统一权限与通知能力因为 615 版本的重点不是“做一个通用下载框架”,而是:
单内核想同时把 BT/PT 体验和 HTTPS 能力都做强,短期并不划算。双内核 + 编排层,是当前最现实的快速落地方案。
qBittorrent-nox + aria2 + 自研编排层libtorrent + libcurl 的“自研内核路线”Transmission daemon结合 [[我的笔记/NAS需求文档/下载器/NAS下载器应用V1.0(615版本)产品需求文档]],615 版本对技术方案的硬约束主要有:
这意味着:下载引擎不能直接裸暴露给前端,必须有一层统一编排层做状态收敛、权限治理、错误码标准化与多端同步。
非常适合承担 615 版本的 BT/PT/Magnet 内核。
适合作为低配 NAS 机型、资源敏感机型的 BT 内核备选。
非常适合承担 HTTPS 直链下载内核;若走极简单内核路线,也可作为全能备选,但不建议作为 615 的唯一主内核。
最适合中长期平台化,但不适合作为 615 首发的唯一交付路径。
| 方案 | BT/PT | Magnet | HTTPS直链 | 文件选择 | Tracker状态 | 做种规则 | 远程API | 资源占用 | License友好度 | 615落地速度 |
|---|---|---|---|---|---|---|---|---|---|---|
| qBittorrent-nox | 强 | 强 | 弱 | 强 | 强 | 强 | 强 | 中 | 中低 | 高 |
| Transmission daemon | 强 | 强 | 弱 | 强 | 强 | 强 | 强 | 高 | 中 | 高 |
| aria2 | 中上 | 中上 | 强 | 强 | 中 | 中上 | 强 | 高 | 中低 | 高 |
| libtorrent | 强 | 强 | 无 | 强 | 强(需自封装) | 强(需自封装) | 无 | 高 | 高 | 低 |
textWeb / App / NAS Local UI │ ▼ Download BFF / API Gateway │ ▼ Download Orchestrator(核心编排层) ├─ Task Service(统一任务模型) ├─ Protocol Router(协议识别与路由) ├─ PT Safety Guard(PT安全策略) ├─ Conflict Resolver(重复/同名冲突) ├─ Notification Service(完成/失败通知) ├─ File Link Service(打开目录联动) ├─ AuthZ / Path Permission(权限校验) └─ Event Bus / WebSocket Push(多端状态同步) │ ├─ qB Adapter(BT/PT/Magnet) ├─ aria2 Adapter(HTTPS) └─ Share Adapter(品牌分享转存/下载) │ ├─ 品牌分享元数据接口 ├─ 提取码校验 ├─ 转存接口 └─ 下载降级接口 Persistent Store ├─ SQLite(任务主数据/事件/设置) ├─ Engine Mapping(统一 task_id -> engine job id) └─ Operation Log / Error Log
原因:
原因:
存储内容:
原因:
要求:
建议不要直接把 qB / aria2 原始模型暴露给前端,而是统一映射成你们 PRD 的任务模型。
除 PRD 中已有字段外,建议再补充:
| 字段 | 说明 |
|---|---|
| engine_type | qb / aria2 / share_transfer |
| engine_task_id | 对应底层引擎任务 ID |
| source_kind | torrent_file / magnet / https / share_link |
| capability_flags | 是否支持做种 / tracker / 文件选择 / 续传 |
| duplicate_key | 用于重复任务检测 |
| share_mode | save / download |
| visibility_scope | 管理员/个人可见范围 |
| last_event_time | 最近事件时间 |
| last_event_message | 最近一条人类可读事件 |
| 统一状态 | qBittorrent | aria2 | 分享链路 |
|---|---|---|---|
| waiting | queued / stalled | waiting | waiting |
| metadata_fetching | metaDL | active(元数据阶段) | metadata_fetching |
| downloading | downloading | active | downloading |
| seeding | uploading / stalledUP | seeding | - |
| paused | paused* | paused | paused |
| verifying | checking* | 校验中(需内部映射) | - |
| completed | completed | complete | saved / completed |
| failed | error / missingFiles 等 | error | failed |
| invalid | - | - | expired / canceled |
说明:底层引擎状态很多,前端只暴露统一状态;更细节的信息下钻到详情页和日志页签。
输入:用户粘贴内容 / 上传 torrent 文件。
识别逻辑:
magnet:? -> qB Adapter.torrent -> qB Adapterhttps://品牌域名/... -> Share Adapterhttps://其他域名/... -> aria2 Adapter补充建议:
这是 615 的关键差异化模块,建议单独做,不要散落在 UI。
task_type=pt建立一份 pt_policy_snapshot,用于记录任务创建时实际生效的 PT 策略,方便客服排障。
虽然从长期看,libtorrent + libcurl + 自研任务内核 是更优雅的架构,但 615 直接这么做的问题是:
615 的目标是先稳定上线,不是先做底座理想化重构。
因此更合理的路线是:
如后续确认 License、商业可控性、品牌差异化都很重要,则逐步演进到:
libtorrent 内核服务libcurl 下载服务这也是为什么 615 一开始必须先做“编排层与统一任务模型” —— 因为它能保护后续换核成本。
| 风险 | 描述 | 应对 |
|---|---|---|
| GPL 商用合规 | qB / aria2 都要做 License 审查 | 615 先审查;不通过则切 libtorrent+libcurl |
| 双内核状态不一致 | qB 和 aria2 模型不同 | 一切以前台统一 task_id 为准,不直接暴露引擎模型 |
| PT 安全模式不彻底 | 仅靠 UI 默认值不可靠 | 独立 PT Safety Guard + 自动化回归测试 |
| 下载恢复不稳定 | 引擎状态与数据库状态可能漂移 | 启动时做 reconcile,对账恢复 |
| 分享链接接口波动 | 品牌分享接口变更 | share-adapter 独立版本化,避免污染下载主链路 |
| 低配机型资源吃紧 | 双 daemon 常驻 | 低配机型评估 Transmission / aria2-only 备选 |
615 版本建议直接采用:
Go 编排层 + qBittorrent-nox(BT/PT/Magnet) + aria2(HTTPS) + 自研 Share Adapter + SQLite + Vue3
qBittorrent-nox + aria2libtorrent + libcurlTransmission daemon本文作者:oyph
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!