架构设计
三层分离
API 层 (Gin) → HTTP 路由、参数校验、中间件(鉴权/限流/审计)
Chain 层 → 业务编排(ChainBase + RunModule 调度原语)
Adapter/Service 层 → 站点适配、下载器控制、媒体匹配、通知、调度核心模式(借鉴 MoviePilot)
Chain / Module / Event
core/module.Run[T]:按优先级遍历已注册 Module,返回值按 Skip/Continue/Stop 三种语义聚合。这是整个架构的调度原语。chain.ChainBase:内嵌 ModuleManager + EventBus,各业务 Chain(SiteChain/DownloadChain/...)继承它。core/event:广播事件(并发扇出 + panic 隔离)+ 链式事件(优先级串行中间件)。
Oper 模式(数据访问)
每张表一个 Oper 类(SiteOper/DownloaderOper/...),封装 GORM 事务 + 敏感字段加解密。
配置即代码(站点定义)
站点定义(YAML)驱动抓取——选择器集中在 site/defaults.go 一处维护,站点 YAML 仅需 5 行(id/name/urls)。新增站点零代码。
后端包组织(47 包,~12.6 万行非测试代码)
数字口径:
ls internal | wc -l/find internal -name '*.go' ! -name '*_test.go' | xargs wc -l。 本节为导读地图而非逐包清单——新增包不再逐行登记,以目录实况为准。
internal/
├── api/ HTTP 边界层
│ ├── middleware/ auth(jwt+apikey) / cors / ratelimit / requestid / accesslog
│ │ / body_limit / security_headers / prommetrics / metricsauth
│ ├── errcode/ 统一错误码注册表(85+ 码,CI 唯一性测试)
│ └── v1/ handlers: auth, site, downloader, dashboard, media, backup,
│ entertainment, filemanager, notification, ops 中心
│ (docker/ssh/磁盘/终端/数据库), agent, llm_gateway, mcp, servarr...
├── chain/ 业务编排: site, download, media, keepseed, notification,
│ entertainment, dashboard, brushflow, contract, rss,
│ subscribe, transfer, cloud, savept, cookiecloud, mediaproxy,
│ recommend + ChainBase/RunModule
│ (SiteChain.credential 按 schema 分发:mteam→apiKey / 其余→cookie)
├── core/ config, log, security(jwt/aes/bcrypt/hkdf), event, module, safego
├── site/ 站点适配框架: types, selector(goquery), nologin, registry,
│ └── schemas/ defaults + nexusphp 系 + mteam/tnode 等特化(304 个 YAML 定义驱动)
├── downloader/ 统一接口 + qb(client/methods/rid-sync) + tr(RPC) + transmission 等
│ └── manager/ 多实例管理(缓存 + Invalidate)
├── workflow/ 可视化工作流引擎(nodes 编排 + 运行记录)
├── monitor/ 主机监控: agent 长连接(文件传输/终端) + SSH + 指标快照/告警
├── media/ TMDB + Douban + Bangumi + MusicBrainz + NFO
├── mediaserver/ Emby/Jellyfin/Plex 播放回调与直链
├── cloud/ 网盘客户端(115/夸克/阿里/天翼/百度)+ STRM
├── aiagent/ ReAct 智能体(46 工具 + 危险操作确认流 + 会话持久化)
├── llm/ llmgateway/ OpenAI/Anthropic 兼容 provider + 对外暴露网关(Cursor 直连)
├── mcp/ ocr/ MCP Server / PaddleOCR 验证码识别
├── httpclient/ 统一抓取: cookie/retry/UA/Cloudflare/SSRF(拨号时校验)
├── filemanager/ WebDAV + Alist + 本机
├── cookiecloud/ AES 解密 + host 匹配 + 内置服务端
├── keepseed/ iyuu/ 辅种评分 + IYUU 协同
├── entertainment/ 游戏框架 + 好学(jgg/magic_scratch/medal) + 各站特化
├── notification/ bark/telegram/webhook/ntfy/... 24 渠道 + Manager
├── scheduler/ robfig/cron + Recover
├── automation/ 7×24: stats-sync + checkin + cookie-keepalive + hr-check + registration + freeleech
├── backup/ 导出/导入(自身格式 + MoviePilot) + 口令加密信封
├── auth/ 好学 VIP 准入 + 激活码(HMAC) + guard + 一次性 ticket
├── plugins/ 插件系统(市场/调度/KV/日志)
├── transfer/ dirwatch/ subtitle/ torznab/ trakt/ savept/ doctor/ tgbot/
├── ws/ 前端实时推送(增量 diff 协议 + 周期 full 重同步)
├── web/ go:embed 内嵌前端 + SPA Handler
├── db/ GORM + SQLite/PG + AutoMigrate + 版本化迁移(schema_migrations)
│ ├── models/ 50+ 模型
│ └── oper/ 30+ Oper
└── app/ 依赖装配 + HTTP 生命周期 + cron 注册文件组织原则(可维护性)
- 每个文件单一职责(如 qb/ 拆为 client.go + methods.go + convert.go)
- 超过 ~400 行主动拆分
- 通用工具集中(helpers.go / defaults.go / convert.go)
- 站点 YAML 极简(5 行),选择器自动填充
数据流
移动端 WebView 登录 → 取 cookie → POST /sites/:id/cookie → 后端 AES 加密存储
↓
automation cron ───────────────────────────────────────────────────→ 站点抓取
├── stats-sync: FetchUserInfo → 写 SiteStat → /dashboard 聚合显示
├── checkin: POST attendance.php → 日志 + 通知
├── cookie-keepalive: 认证 GET 刷新 session + Set-Cookie 轮换回写 + 失效告警
├── hr-check: 抓 getusertorrentlist.php?type=hr → 未达标/临期告警
└── registration: 探测 signup.php → 关闭→开放转换通知
↓
Web UI / Flutter ← GET /dashboard (真实聚合) / GET /downloaders/:id/torrents