头图
不需要分别搭建 Navidrome、MusicTagWeb、MusicDL 三套服务,运行一条 docker compose up -d,你就能拥有一个集媒体库管理、元数据刮削、在线搜索下载、歌单同步于一身的私人音乐中枢。

痛点:搭建一套完整的私人音乐库,到底有多折腾?

每个喜欢收藏本地无损音乐的人,大概都经历过这样的折腾:

  1. 你有一堆音乐文件,散落在 NAS、本地硬盘、甚至 WebDAV 挂载的云盘里,想统一管理 —— 于是你搭建了 Navidrome,一个媒体库管理服务。
  2. 元数据一团糟,封面缺失、标题是乱码、艺人信息空白 —— 于是你又搭建了 MusicTagWeb,专门做标签刮削。
  3. 想找新歌,想从网易云、QQ 音乐等平台搜罗资源下载入库 —— 于是你又去折腾 MusicDL

三套服务,三个数据库,三种配置方式,互不相通。光是维护它们就已经让人心力交瘁,更别提「优雅地听歌」这件事了。

有没有一种可能,把这三件事合在一起?

这就是 MusicFree 诞生的初心。


MusicFree 是什么?

MusicFree 是一个基于 Go + Vue 3 + TypeScript 构建的开源个人音乐服务器,核心理念只有一句话:

让听歌这件事变得简单一点。

它不是某个单一功能的替代品,而是音乐全生命周期的管理中枢

从获取曲目到完美播放,一个服务就够了。


核心能力一图速览

🎧 音乐管理:搜索、去重、刮削,一站式搞定

MusicFree 的管理后台将三大音乐运维能力整合在同一个页面中:

Tab做什么怎么做的
音乐搜索从外部平台搜索歌曲并一键下载入库通过 WASM 插件接入各平台搜索/下载能力
音乐去重发现库内重复曲目并批量清理基于音频指纹(fpcalc)技术,识别转码、改名后的同一首歌
音乐刮削补全元数据:封面、歌词、艺术家、专辑信息多插件编排,依次尝试不同数据源直至命中

这不是三个独立的工具,而是同一套系统里无缝衔接的三个功能。

音乐管理 - 搜索、去重、刮削三合一

🧩 插件体系:能力边界,由你定义

MusicFree 的核心能力不写死在代码里,而是全部通过 WASM 插件 提供:

产品能力插件接口常见插件
在线搜索 / 下载RemoteSearch / RemoteDownloadmf-plugin-gomusicdl
元数据 / 封面 / 歌词ScraperSong / GetCover / GetLyrics网易云、QQ 音乐、MusicBrainz
专辑信息刮削GetAlbumInfo同上
艺术家信息与头像GetArtistInfo同上
歌单导入 / 同步FetchPlaylistmf-plugin-neteasemf-plugin-qqmusic

你只需要在插件商店中订阅一个注册表 URL,就能看到所有可用插件,点击安装即可使用。

插件商店

当多个插件实现同一能力时,还能通过插件编排设定优先级链,按序尝试——覆盖、歌词、专辑、艺术家、头像五个维度可分别指定插件链:

插件编排 - 五个维度的插件链配置

这意味着什么?—— 某个平台 API 变了?更新插件即可,你不需要等 MusicFree 发新版。远程搜索也由插件驱动,选好来源就能直接检索并下载入库:

远程搜索

🔌 客户端兼容:不只是 Web 播放器

MusicFree 实现了完整的 OpenSubsonic 1.16.1 接口规范,以及部分 Navidrome 风格 REST API。这意味着你可以用任何你喜欢的客户端来听歌:

  • 音流 — 国产精品 Subsonic 客户端,iOS/Android 双端
  • Supersonic — 跨平台桌面客户端,界面精美
  • Feishin、Symfonium、DSub — 更多兼容应用任你选

不需要被限制在某个特定的前端里。用你最顺手的播放器,连上 MusicFree 服务端,就像连上一个标准的流媒体服务器。

📁 多源接入:本地 + WebDAV,一盘统管

音乐不一定都存在本地硬盘上。MusicFree 支持两类媒体源:

  • 本地目录:直接扫描服务器上的音乐文件夹
  • WebDAV:挂载远程存储(NAS、云盘),统一管理

配置后可以手动触发扫描,也支持定时增量扫描(默认每 30 分钟)。你还可开启文件监听器(基于 fsnotify),本地目录一有变化就自动同步入库。

媒体源管理 - 本地目录 + WebDAV


技术架构:清晰分层,便于二次开发

如果你不只是使用者,还想在此基础上进行二次开发,MusicFree 的代码结构也非常友好:

后端(Go)

handler → service → repository
  • api/handler/:HTTP 请求处理
  • service/:业务逻辑层
  • repository/:数据库读写
  • scanner/:音乐扫描、媒体源抽象
  • scraper/:元数据刮削插件运行时
  • model/:数据模型(GORM)

数据库使用 SQLite,零配置,开箱即用。数据文件和封面缓存都存储在本地目录,方便备份和迁移。

前端(Vue 3 + TypeScript)

  • Element Plus 组件库,快速构建管理后台
  • Pinia 状态管理,登录、播放器等模块解耦清晰
  • Axios 统一封装,自动注入认证参数
  • Claymorphism(黏土拟态) 视觉风格,柔和而现代的观感

前后端通过 /rest 前缀统一通信,开发模式下 Vite 代理自动转发到后端,无需手动配置跨域。


一分钟部署

MusicFree 已经发布为 Docker 镜像,一条 Compose 即可启动:

services:
  music-free:
    image: ansgoo/music-free:latest
    container_name: music-free
    restart: unless-stopped
    ports:
      - "4533:4533"
    volumes:
      - /vol1/docker/music-free:/app/data
      - /vol1/music:/app/music
docker compose up -d

然后打开浏览器访问 http://<你的服务器IP>:4533,默认账号 admin / admin,进入后建议立刻修改密码。

不需要额外部署 Nginx,不需要单独启动前后端服务——Go 进程把静态页面和 API 合并在一个端口上,这就是「简单」的含义。


支持的音频格式

扫描器明确支持的格式覆盖了你的绝大多数收藏:

mp3 · flac · m4a · aac · ogg · opus · wav · wma · ape · dsf · dff


路线图与当前状态

MusicFree 是一个活跃开发中的项目,以下是当前完成度概览:

模块状态
音乐扫描(全量 + 增量)✅ 已完整实现
音频播放核心接口✅ 已完整实现
OpenSubsonic 基础兼容✅ 已完整实现
登录认证✅ 可用
播放记录与统计✅ 可用
刮削系统(插件管理 + 批量刮削)✅ 可用
媒体源管理(本地 / WebDAV)✅ 基本可用
首页(随机歌曲、热门、最近播放)✅ 可用
歌曲库 / 专辑 / 艺术家 / 歌单页面🚧 开发中
媒体源扫描联动🚧 部分实现
转码 / 高级播放策略🚧 实验阶段

项目当前已具备一个音乐服务原型里最关键的能力:能启动、能扫描、能播放、能刮削、能记录。如果你需要的是一个稳定的个人音乐服务器基础,它已经够用了。如果你想参与开发,补全路线图中的功能,也欢迎贡献 PR。


功能掠影

更多核心界面一览:

音乐刮削音乐去重专辑管理
歌曲刮削去重专辑
艺术家管理歌单管理歌单详情
艺术家歌单歌单详情

总结

对比维度传统方案(多服务组合)MusicFree
部署复杂度3 套服务,各自配置1 条 docker compose
数据互通割裂,各自独立数据库统一曲库
搜索下载单独工具内置插件,一键入库
元数据刮削单独工具内置,支持多源编排
客户端各有兼容范围OpenSubsonic 标准,多客户端可选
扩展性受限于各工具自身WASM 插件体系,无需改核心

MusicFree 不追求成为功能最庞杂的音乐平台,而是追求用最简洁的方式覆盖最核心的需求

它就是那个你想听歌的时候,不需要折腾环境的「一条龙」解决方案。


🐳 Docker 镜像ansgoo/music-free:latest

星星在线
26 声望2 粉丝