飞牛 NAS 部署 MiMusic:自建音乐服务器,六端同步听无损
MiMusic 是一个自托管的个人音乐服务器,用 Go 编写,单一可执行文件,不依赖系统运行时环境。服务端以二进制和 Docker 镜像形式分发,客户端基于 Flutter,支持 iOS、Android、macOS、Windows、Linux 和 Web。
项目在 github.com/mimusic-org/mimusic,Apache-2.0 协议。客户端已开源,服务端暂未开源。
功能
MiMusic 自动扫描音乐目录,支持 MP3、FLAC、WAV、APE、OGG、M4A 等格式,扫描时提取封面、歌词、艺术家等元数据。本地文件标签不完整,可以用"音乐标签刮削"插件从各平台补全。
插件跑在 WebAssembly 沙箱里,官方目前有三个:洛雪音源(聚合多平台网络音乐,可搜索导入)、音乐标签刮削(自动抓取封面、专辑、歌词)、小米音箱插件(登录小米账号后控制小爱音箱播放本地音乐,支持多账号)。
认证用 JWT 双 Token,REST API 遵循 OpenAPI 规范,文档在 http://NASIP:58091/swagger/index.html。
版本与部署
官方有两个版本。完整版(-full)内置 Web 前端,下载后直接运行,访问 http://NASIP:58091 就能用;精简版不含前端,适合配合 Flutter 客户端或前后端分离部署。第一次用选完整版。
飞牛 NAS Compose 部署
第一步:进入 Compose 项目管理
打开飞牛 NAS 的 Docker 管理界面,点左侧"项目",再点右上角"新建项目"。
第二步:填写项目信息
项目名称填 mimusic,存储路径选一个放 Compose 文件的目录,比如 /vol1/docker/mimusic。
第三步:编写 Compose 配置
在配置编辑框里粘贴以下内容:
services:
mimusic:
image: hanxi/mimusic:full
container_name: mimusic
restart: always
network_mode: host
volumes:
- /vol1/music:/app/music
- /vol1/mimusic/data:/app/data
environment:
- ADMIN_USERNAME=admin
- ADMIN_PASSWORD=你的密码
- LISTEN_PORT=58091
- MUSIC_DIR=/app/music
- DATA_DIR=/app/data几个地方按实际情况改:
/vol1/music换成 NAS 上存音乐文件的实际路径/vol1/mimusic/data换成存数据库和配置的路径,目录不存在飞牛会自动建ADMIN_PASSWORD必须改,默认admin暴露到外网谁都能登录LISTEN_PORT和其他容器冲突就换一个没被占的端口
这里用了 network_mode: host,让容器直接用宿主机网络。host 模式下 ports 配置无效,不用写,端口通过 LISTEN_PORT 指定。为什么要用 host 模式,后面"小爱音箱的网络模式问题"一节里说。
第四步:部署
点"部署",飞牛自动拉取 hanxi/mimusic:full 并启动容器。网络正常的话一两分钟完成。
第五步:访问 Web 界面
浏览器打开 http://NASIP:58091,用刚才设的账号密码登录。首次登录先确认音乐目录路径对,然后点"扫描"建库。
升级
飞牛 Docker 管理界面进"项目",找到 mimusic,点"更新",飞牛拉取最新镜像并重建容器。数据目录挂载不变,歌单和配置都在。
主要环境变量:
音乐库管理
MUSIC_DIR 挂载的是 NAS 上的实际音乐目录。挂载前先整理好目录结构,按"艺术家 / 专辑"分层存放,扫描后浏览顺手。平铺也能识别,但歌单自动生成时按文件夹路径分组,结构乱生成结果也会乱。
首次部署完成后,进 Web 界面点"扫描",系统遍历 MUSIC_DIR 下所有音频文件并提取元数据。扫描是增量的,后续新加文件再点一次只处理新增内容。
部分歌曲封面或歌词为空,打开"音乐标签刮削"插件,选中歌曲触发刮削,插件从各平台匹配写入。匹配失败的,歌曲详情页可以手动编辑标签。
外网访问
有公网 IP:路由器做端口转发,把外网端口映射到 NAS 的 58091,配合 DDNS 绑个域名,直接访问。延迟最低。
没有公网 IP(大多数家庭宽带):用 Tailscale。基于 WireGuard,在手机和 NAS 之间建加密隧道,不用配端口映射,免费版支持最多 100 台设备。手机和 NAS 都装上并登录同一账号,手机通过 Tailscale 分配的 IP 访问 NAS,和在家里局域网里一样。frp 也行,但需要一台有公网 IP 的云服务器做中转,速度看服务器带宽。
开外网访问前先改密码。默认账号密码都是 admin,暴露到公网就是裸奔。在 Compose 配置里把 ADMIN_PASSWORD 换掉,重新部署生效。
数据备份与迁移
运行数据全在 DATA_DIR 里,核心是 data/mimusic.db,一个 SQLite 数据库,存着歌单、收藏、配置和用户信息。音乐文件还在原来的 MUSIC_DIR 下,不在这里。
备份只需要定期复制 DATA_DIR。飞牛有计划任务,设每天自动备份一次就行。几千首歌的库,数据库通常也就几 MB。
换机或重建容器时,把 DATA_DIR 备份复制到新路径,新容器挂载同一目录,启动后歌单和配置都回来了。升级版本后出异常,官方 FAQ 建议删掉 data/mimusic.db 重启,但这会清空所有用户数据,操作前先备份。
多用户使用
目前只有一个管理员账号。家里多人共用时,所有人登同一个账号,播放历史和歌单不隔离。口味差异大的话,靠命名区分歌单,比如"张三的歌单""李四的歌单"。多账号在官方 TODO 里,进展可以看 GitHub 项目页。
小爱音箱的网络模式问题
小米音箱插件靠局域网广播发现音箱。Docker 默认 bridge 模式隔离了容器和宿主机网络,插件扫不到音箱。改成 host 模式,容器直接用宿主机网络接口,问题解决。
Compose 配置里已经写了 network_mode: host,不用额外操作。如果之前是手动建的容器,进容器设置把网络模式改成"host",重启生效。host 模式下 ports 映射失效,端口用 LISTEN_PORT 指定。
关于开源状态
客户端完全开源。服务端以预编译二进制和 Docker 镜像分发,代码目前无法审计。整体免费,对隐私要求高的用户自己判断。