milmilmilmil
系统架构

系统架构

milmil 系统架构与内部实现。

系统概览

milmil 是一个单体 Go 后端搭配 React SPA 前端的应用,专为自托管部署而设计。

┌─────────────────────────────────────────────────┐
│                   客户端                         │
│         浏览器 (PWA)  │  Telegram/Discord 机器人  │
└───────────┬─────────────────────┬───────────────┘
            │ HTTP/WS             │ Bot API
┌───────────▼─────────────────────▼───────────────┐
│                milmil-api (Go)                  │
│  ┌──────────┐ ┌──────────┐ ┌──────────────────┐│
│  │ REST API │ │WebSocket │ │ 机器人引擎       ││
│  └────┬─────┘ └────┬─────┘ └───────┬──────────┘│
│       │             │               │           │
│  ┌────▼─────────────▼───────────────▼──────────┐│
│  │              服务层                          ││
│  │  媒体库 │ 串流 │ 下载 │ 发现               ││
│  │  收藏 │ 认证 │ 通知                         ││
│  └────┬────────────────────────────────────────┘│
│       │                                         │
│  ┌────▼────────────────────────────────────────┐│
│  │           基础设施层                         ││
│  │  PostgreSQL/SQLite │ Redis │ FFmpeg │ Rclone││
│  └─────────────────────────────────────────────┘│
└─────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────┐
│              milmil-web (React SPA)             │
│  通过 Nginx 或开发服务器提供服务                 │
└─────────────────────────────────────────────────┘

组件概览

组件说明
REST APIEcho 路由器提供 JSON 接口。处理认证、CRUD、串流和搜索。
WebSocket实时事件推送,用于弹幕、通知和扫描进度。
机器人引擎跨平台机器人,支持 Telegram 和 Discord 适配器。
服务层媒体库扫描、元数据匹配、下载管理和收藏同步的业务逻辑。
FFmpeg媒体探测、容器重封装和 HLS 转码。
Rclone云存储抽象层,支持 40+ 提供商。

数据流:媒体库扫描

文件发现

遍历存储后端(本地、SMB、rclone 等)以枚举所有媒体文件。

媒体探测

FFmpeg 探测每个文件的编解码器信息、分辨率、时长、内嵌字幕和音轨。

元数据匹配

通过提供商管道将文件匹配到动画条目:DandanPlay(哈希)→ Bangumi(标题)→ AniList(标题)→ TMDB(后备)。

信息补充

从匹配的提供商获取封面图片、剧集标题、简介和评分。

持久化

将所有元数据存储到数据库。发送扫描完成通知。

数据流:串流

客户端请求
    │
    ▼
┌─────────────────┐
│ 编解码器支持?   │──是──▶ 直接播放(字节范围)
└────────┬────────┘
         │ 否
         ▼
┌─────────────────┐
│ 仅容器不兼容?   │──是──▶ 重封装(MKV→MP4,无需重编码)
└────────┬────────┘
         │ 否
         ▼
    HLS 转码(FFmpeg)

技术栈

技术说明
后端Go — Chi 路由器、sqlc、golang-migrate、anacrolix/torrent
前端React — Vite、TanStack Router、TanStack Query、Tailwind CSS
数据库PostgreSQL/SQLite — 使用 golang-migrate 管理数据库结构
缓存Redis — 可选,支持内存回退
媒体FFmpeg — 探测、重封装、HLS 转码
存储Rclone — 40+ 云服务提供商后端
文档Fumadocs — 基于 Next.js 的文档系统,支持多语言

仓库结构

go.mod
Makefile
docker-compose.yml
Makefile

本页内容