架構
架構
milmil 系統架構同內部結構。
系統概覽
milmil 係一個單體式 Go 後端配搭 React SPA 前端,專為自託管部署而設計。
┌─────────────────────────────────────────────────┐
│ 用戶端 │
│ 瀏覽器 (PWA) │ Telegram/Discord 機械人 │
└───────────┬─────────────────────┬───────────────┘
│ HTTP/WS │ Bot API
┌───────────▼─────────────────────▼───────────────┐
│ milmil-api (Go) │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐│
│ │ REST API │ │WebSocket │ │ Bot Engine ││
│ └────┬─────┘ └────┬─────┘ └───────┬──────────┘│
│ │ │ │ │
│ ┌────▼─────────────▼───────────────▼──────────┐│
│ │ 服務層 ││
│ │ 媒體庫 │ 串流 │ 下載 │ 探索 ││
│ │ 收藏 │ 認證 │ 通知 ││
│ └────┬────────────────────────────────────────┘│
│ │ │
│ ┌────▼────────────────────────────────────────┐│
│ │ 基礎設施層 ││
│ │ PostgreSQL/SQLite │ Redis │ FFmpeg │ Rclone││
│ └─────────────────────────────────────────────┘│
└─────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
│ milmil-web (React SPA) │
│ 透過 Nginx 或開發伺服器提供服務 │
└─────────────────────────────────────────────────┘組件概覽
| 組件 | 說明 |
|---|---|
| REST API | Echo 路由器提供 JSON 端點。處理認證、CRUD、串流同搜尋。 |
| WebSocket | 即時事件推送,用於彈幕、通知同掃描進度。 |
| Bot Engine | 跨平台機械人引擎,支援 Telegram 同 Discord 適配器。 |
| 服務層 | 媒體庫掃描、中繼資料比對、下載管理同收藏同步嘅業務邏輯。 |
| FFmpeg | 媒體探測、容器重新封裝同 HLS 轉碼。 |
| Rclone | 支援 40+ 供應商嘅雲端儲存抽象層。 |
資料流程:媒體庫掃描
檔案發現
遍歷儲存後端(本機、SMB、rclone 等)列舉所有媒體檔案。
媒體探測
FFmpeg 探測每個檔案嘅編解碼器資訊、解析度、時長、內嵌字幕同音軌。
中繼資料比對
透過供應商管線將檔案比對到動畫條目:DandanPlay(雜湊)→ Bangumi(標題)→ AniList(標題)→ TMDB(備援)。
資料補充
從比對到嘅供應商擷取封面圖片、劇集標題、簡介同評分。
持久化
將所有中繼資料儲存到資料庫。發送掃描完成通知。
資料流程:串流
用戶端請求
│
▼
┌─────────────────┐
│ 編解碼器支援? │──係──▶ 直接播放(byte-range)
└────────┬────────┘
│ 否
▼
┌─────────────────┐
│ 只需換容器? │──係──▶ 重新封裝(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