把 NAS 里的音乐变成一个能搜、能播、能下载无损的网页。 自带中文界面,手机和电脑打开浏览器就能用;曲库、封面、歌词、播放队列全在本地,不依赖任何订阅服务。
镜像里已经内置了 5 个音源(咪咕、hi.cn、雀乐、网易云、歌曲宝),装好就能用。 代码和配置都做了混淆处理,镜像里翻不到可读的源码。
今日推荐 + 精选专题,各音源独立,一块挂了不影响另外。
- 自己的音乐想怎么听就怎么听 —— 曲库是你 NAS 上的文件,不是某个 App 的私有目录。换手机、换电脑、家里人都能用。
- 不用按月付费 —— 一次部署,长期用。音源是可替换的,哪天某个源不好用了,在「源」页面加一个自己的就行,不用等作者发版。
- 音质不被降级 —— 支持 FLAC 无损直取(咪咕 SQ 音质)。
- 在哪都能听 —— 人在外面也能连:容器可以走群晖的 QuickConnect 域名挂你的 NAS。
| 你 | 能得到什么 |
|---|---|
| 家里有 NAS、存了一堆音乐 | 一个全家都能用的音乐站,界面比群晖自带的网页播放器好用得多 |
| 嫌各家的音乐 App 锁音质、锁曲库 | 无损直取 + 本地曲库,文件始终在你手里 |
| 想给家人做点东西 | 中文界面、深色模式、手机上也能用,不用教 |
| 自己写音乐/整理独立音乐 | 「雀乐」这个源专门收独立音乐作品集 |
docker run -d \
--name yu-music \
-p 5106:80 \
-v yu-music-data:/data \
-e YuMusic__Admin__Password='<你自己设的密码>' \
--restart unless-stopped \
ghcr.io/zhongbiran/yu-music:latest浏览器打开 http://localhost:5106 就能用了。
5106是你自己定的端口,随便换。-v yu-music-data:/data是数据盘(曲库数据库 + 音频缓存), 别忘了它,删了容器曲库就没了。
⚠️ 密码那个环境变量在容器里叫YuMusic__Admin__Password(.NET 的配置写法,两个下划线)。 用 compose 的话不用管 —— 上面那份 compose 已经帮你把.env里的YU_ADMIN_PASSWORD映射好了。 不传这个变量 = 免密码进管理页,公网机器上千万别漏。
# docker-compose.yml
services:
music:
image: ghcr.io/zhongbiran/yu-music:latest
container_name: yu-music
ports:
- "5106:80"
volumes:
- ./data:/data
environment:
# 管理页密码。留空 = 进管理页不用密码(只在自己局域网里用可以这样)
YU_ADMIN_PASSWORD: "${YU_ADMIN_PASSWORD:-}"
restart: unless-stoppeddocker compose up -d出厂默认不要密码就能进管理页(管理页能改曲库、改音源、改设置)。 只要这台机器不在你家的局域网里 —— 或者你只是图个安心 —— 就去 管理 › 通用 › 密码 填一个,填完全部登录立刻失效,用新密码重新进。
改密码之后,旧密码和所有已登录的 token 全部作废,这是故意的。
管理 › 源 能看到 5 个内置音源:
| 音源 | 能搜 | 能播 | 额外说明 |
|---|---|---|---|
| 咪咕音乐 | ✅ | ✅ | 无损 FLAC / 320K / 128K 自动降级;需要中国大陆出口 IP |
| hi.cn 无损 | ✅ | ✅ | 偏无损 |
| 雀乐(独立音乐) | — | ✅ | 没有关键词搜索,从「推荐」页进;带歌词 |
| 网易云音乐 | — | — | 只做推荐(歌单、今日推荐) |
| 歌曲宝 | ✅ | ✅ | 只有 MP3;需要另外跑一个抓取服务,见下 |
咪咕为什么有时候搜不出来:咪咕对海外 IP 只返回歌单信息不给音频地址(错误码 440001)。
容器走宿主机的出口,所以宿主机在国内就没问题。
默认下载的音频落在容器里的 /data/media(也就是你的数据盘)。
想让文件直接出现在群晖上,见下面的「连接 NAS」。
有两种方式,SMB 优先(同局域网和不在局域网都能用)。
群晖上先把这个目录导出(控制面板 → 共享文件夹 → 编辑 → NFS 权限), 然后:
environment:
MEDIA_NFS: "192.168.1.28:/volume1/music/YuMusic"群晖的 DSM 网页端口只监听 IPv4,所以人在外面时 WebDAV 那条路走不通; 但 SMB 监听 IPv6,而群晖的 QuickConnect 域名正好解析到它当前的 IPv6。
域名在群晖「控制面板 → 登录门户 → 快速连接」里拿:
environment:
MEDIA_SMB: "//<你的 QuickConnect 域名>/music"
MEDIA_SMB_USER: "<群晖用户名>"
MEDIA_SMB_PASS: "<群晖密码>"
# 共享文件夹里真正的缓存目录(共享根下还有别的音乐文件夹时填)
MEDIA_SMB_SUBDIR: "YuMusic"密码只写在这两处,别写进任何会被提交到 git 的文件。
容器还需要挂载权限(compose 里):
cap_add:
- SYS_ADMIN
- DAC_READ_SEARCH
- LINUX_IMMUTABLE
networks:
default:
nas:
enable_ipv6: true
ipam:
config:
- subnet: fd00:dead:beef::/64所有配置都用环境变量传(YuMusic__ 开头的是 .NET 的配置节写法)。
| 变量 | 默认 | 说明 |
|---|---|---|
YU_ADMIN_PASSWORD |
空 | 管理页密码。留空 = 免密码进管理页 |
MEDIA_NFS |
空 | 192.168.1.28:/volume1/music/YuMusic |
MEDIA_SMB |
空 | //<QuickConnect 域名>/music |
MEDIA_SMB_USER / MEDIA_SMB_PASS |
空 | 群晖账号密码 |
MEDIA_SMB_SUBDIR |
空 | 共享里的子目录名 |
YuMusic__Migu__BaseAddress |
内置 | 自定义咪咕端点(一般不用改) |
YuMusic__Indie__BaseAddress |
内置 | 自定义雀乐端点 |
YuMusic__Gequbao__FetcherBaseAddress |
http://fetcher:8080/ |
抓取服务地址 |
「歌曲宝」这个源整站挂在 Cloudflare 的托管挑战后面 —— 普通的 HTTP 客户端 (curl、各种爬虫库)拿到的都是 403 加一个「Just a moment…」页面,只有真浏览器能过。
所以抓取它要单独跑一个装了无头 Chromium 的小容器。它只服务歌曲宝这一个源, 不要这个源就可以完全不起它。
# docker-compose.yml 里加这一段
fetcher:
image: ghcr.io/zhongbiran/yu-music:fetcher
container_name: yu-music-fetcher
environment:
GEQUBAO_BASE: "https://www.gequbao.com"
ipc: host
restart: unless-stopped这个镜像有 2.6GB(Chromium 占的)。介意体积的话就用上面那个 350MB 的主镜像, 只用咪咕 / hi.cn / 雀乐 / 网易云这四个源。
- 推荐 —— 今日推荐、精选专题、歌单广场;雀乐的独立音乐作品集也在这
- 搜索 —— 搜歌名/艺人/专辑;曲库里已有的歌会排在最前面,点一下就能播
- 管理 › 曲库 —— 三块:需要处理(待同步 / 未入库 / 缓存失败,每条自带处理按钮)、曲目(带封面、状态、时长)、存储(本地 / NAS 各多少)
- 管理 › 源 —— 看内置源、加自己的源、改地址;不用改代码、不用等发版
- 管理 › 通用 —— 配色(浅色 / 暗色)、应用标题、管理密码、首页通知
- 底部播放条 —— 上一首 / 下一首 / 自动播放 / 进度 / 码率;手机上会自动精简
- 只有一个地址(
/admin),URL 里不会泄露你翻到哪一页
命中的结果直接点一下就开始播;要存一份就在播放条上点「缓存」。
「需要处理」和下面的曲目表是同一批数据 —— 点上面那条,下面对应的行会亮起来。
地址、平台、扩展参数都在页面上改,存完立刻生效,不用重启服务。
| 标记 | 含义 |
|---|---|
| 🟢 绿色点 | 就绪 —— 已缓存到 NAS(或本机),可以播 |
| ⚪ 灰色点 | 无事可做 —— 还没缓存,也没出问题 |
| 🔴 红色点 | 出错了 —— 下载/同步失败,点它看原因 |
| 曲目行左侧的竖条 | 这首需要你动手(待同步 / 未入库 / 缓存失败) |
颜色只表示状态,不表示好坏;「要动手」靠位置(行左侧竖条)区分,不靠色相 —— 颜色看不清的人也能用。
同一个地址,手机上自动切成窄屏布局,播放条只留必要的几个键。
镜像里的代码是混淆过的:
- 前端 JS:标识符改成无意义名字、字符串 rc4 加密、不带 sourcemap(有 sourcemap 等于把源码直接发出去)
- 后端 DLL:类型/方法/字段改名 + 字符串加密
- 镜像里没有 pdb、没有明文的上游端点、没有你的任何配置
但请注意:
- 免密码 = 任何能访问这个服务的人都能进管理页(删歌、改 NAS、���设置)。暴露到公网前一定要设密码。
- 想放到公网的话,前面再加一层反向代理 + HTTPS(Traefik / Caddy / Nginx 都行),别直接把 5106 暴露出去。
- 混淆只提高读源码的成本,不是法律上的保护。
打开是 502 / 白屏
后端还在起(第一次要装依赖、建数据库)。等 30 秒再刷新,或者 docker logs yu-music 看一眼。
搜得到歌但播不了 多半是音源的音频地址取不到。换另一个源试试;咪咕还要确认机器在中国大陆出口。
NAS 挂不上
docker logs 里会写具体原因。注意挂 SMB 需要 SYS_ADMIN 能力和一条开了 IPv6 的网络。
改了密码之后登不上了
密码是加密存进曲库数据库的。忘了的话,删掉数据盘里的 db/yu-music.db 重来(曲库会空,歌要重新扫)。
手机上看不清 / 操作别扭 底部播放条在窄屏会自动精简;管理页的表格会重排。
| 镜像 | ghcr.io/zhongbiran/yu-music |
| 标签 | latest(主服务,约 350MB)、fetcher(抓取服务,约 2.6GB) |
| 架构 | linux/amd64、linux/arm64 |
| 端口 | 容器内 80,对外自己映射 |
| 数据 | /data/db(曲库)、/data/media(音频缓存) |
- Fluent UI 2 —— 界面框架
- LiteDB —— 嵌入式数据库
- .NET / nginx / Playwright
- 各个音乐源的站点和版权方
本项目是个人自用的工具。内置音源会访问第三方站点并抓取它们的数据, 请自行判断使用方式是否符合相关服务的条款;下载的音频版权属于各自的权利人。





