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 管理界面,点左侧"项目",再点右上角"新建项目"。

0-Kygo

第二步:填写项目信息

项目名称填 mimusic,存储路径选一个放 Compose 文件的目录,比如 /vol1/docker/mimusic

0-oQAd

第三步:编写 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 和其他容器冲突就换一个没被占的端口

0-CLjY

这里用了 network_mode: host,让容器直接用宿主机网络。host 模式下 ports 配置无效,不用写,端口通过 LISTEN_PORT 指定。为什么要用 host 模式,后面"小爱音箱的网络模式问题"一节里说。


第四步:部署

点"部署",飞牛自动拉取 hanxi/mimusic:full 并启动容器。网络正常的话一两分钟完成。

0-LYIv

第五步:访问 Web 界面

浏览器打开 http://NASIP:58091,用刚才设的账号密码登录。首次登录先确认音乐目录路径对,然后点"扫描"建库。

0-YjFY

升级

飞牛 Docker 管理界面进"项目",找到 mimusic,点"更新",飞牛拉取最新镜像并重建容器。数据目录挂载不变,歌单和配置都在。


主要环境变量:

变量名

说明

默认值

ADMIN_USERNAME

管理员用户名

admin

ADMIN_PASSWORD

管理员密码

admin

LISTEN_PORT

服务端口

58091

MUSIC_DIR

音乐文件目录

./music

DATA_DIR

数据存储目录

./data


音乐库管理

MUSIC_DIR 挂载的是 NAS 上的实际音乐目录。挂载前先整理好目录结构,按"艺术家 / 专辑"分层存放,扫描后浏览顺手。平铺也能识别,但歌单自动生成时按文件夹路径分组,结构乱生成结果也会乱。

首次部署完成后,进 Web 界面点"扫描",系统遍历 MUSIC_DIR 下所有音频文件并提取元数据。扫描是增量的,后续新加文件再点一次只处理新增内容。

0-EPRB

部分歌曲封面或歌词为空,打开"音乐标签刮削"插件,选中歌曲触发刮削,插件从各平台匹配写入。匹配失败的,歌曲详情页可以手动编辑标签。

0-dNBm
0-GQbn

外网访问

有公网 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 镜像分发,代码目前无法审计。整体免费,对隐私要求高的用户自己判断。