飞牛 NAS 用 Docker 搭 Navidrome:把本地音乐库变成随时能听的私有歌单
飞牛 NAS 用 Docker 搭 Navidrome:把本地音乐库变成随时能听的私有歌单
摘要:家里硬盘和 NAS 里攒了不少 MP3、FLAC、AAC 文件,真正想听的时候却总在翻文件夹。本文用 Docker 部署 Navidrome,把本地合法音乐文件整理成一个私有音乐库;局域网内用浏览器听,外出时用 cpolar 映射 Navidrome 的 Web 端口,再用手机浏览器或 Subsonic 兼容客户端连接。
标签:Navidrome、Docker、NAS、cpolar、内网穿透
说明:这篇只讨论个人自有、已购买、已授权或合法备份音频文件的整理和访问。Navidrome 负责管理你的本地音乐库,不提供音乐资源获取能力,也不适合拿来传播未授权内容。
前言
你有没有这种情况:NAS 里有一堆歌,手机里也存过几千首,但真正想听的时候,反而打开在线音乐软件随便点两下。
原因不是歌少,而是入口太散。电脑硬盘一个目录、NAS 共享盘一个目录、旧手机备份里还有一批,想在外面听一首老歌,还得先想文件放在哪里。
我之前写过一篇 Jellyfin 家庭影音库方案,适合整理电影、纪录片、课程视频这类内容。旧文内链位置:Jellyfin 家庭影音库不只在家看。这篇换个方向:Jellyfin 偏视频和家庭影音,Navidrome 偏音乐、歌单和低带宽远程听歌。一个管“看”,一个管“听”,放在 NAS 上刚好互补。
这次的目标很明确:
- 在飞牛 NAS 或普通 Linux 机器上,用 Docker 跑起 Navidrome;
- 把宿主机里的音乐目录只读挂进容器,避免服务端误改原文件;
- 本地访问跑通后,用 cpolar 给 Navidrome 的
4533端口开一个 HTTPS 访问入口; - 手机端用 Web 页面直接听,或者用 Subsonic 兼容客户端连接同一个地址。
1 什么是 Navidrome?这篇里它负责管音乐库
Navidrome 是一个轻量级自托管音乐服务。官方文档里把它定位成音乐集合的 Web 播放服务,同时兼容 Subsonic API,这意味着它既能用浏览器访问,也能接入一批 Subsonic 兼容客户端。
这篇里不用把它理解得太复杂。你只要记住三件事:
- Navidrome 服务端跑在 NAS、小主机或 Linux 服务器上;
- 你的 MP3、FLAC、AAC 等音频文件仍然放在自己的硬盘目录里;
- 手机、电脑、平板访问 Navidrome 后,看到的是整理好的艺术家、专辑、歌曲和歌单。
它和直接开 SMB 文件共享不一样。文件共享更像“远程翻文件夹”,Navidrome 更像“把自己的本地音乐变成一个私人播放器”。
这里别误会:Navidrome 只负责管理自有音频文件,不负责找歌、下歌、破解平台限制。音乐文件的版权边界要自己守住,家庭自用和个人备份是这篇的前提。
2 环境准备:飞牛 NAS 和通用 Linux 都按这个思路来
这次不写死飞牛 NAS 的专有路径,因为每个人的存储池、共享目录命名都不一样。更稳的写法是给一套通用目录,你在飞牛 NAS 的文件管理器里找到真实音乐目录后,把示例路径替换掉。
示例目录如下:
/opt/navidrome # Navidrome 部署目录,放 docker-compose.yml /opt/navidrome/data # Navidrome 数据目录,放数据库、缓存、播放列表等 /data/music # 你的音乐文件目录,按实际情况替换如果你在飞牛 NAS 上已经建好了共享目录,后面 Compose 里的/data/music换成真实音乐路径即可。
先用 SSH 登录 NAS 或 Linux 机器,准备目录:
sudo mkdir -p /opt/navidrome/data sudo mkdir -p /data/music cd /opt/navidrome如果音乐已经在 NAS 的共享目录里,直接用真实音乐路径。这里很容易填错:容器只能看到挂载进去的目录。
再确认当前用户的 UID 和 GID:
id输出里会看到类似下面这样的内容:
uid=1000(admin) gid=1000(admin) groups=1000(admin)后面 Compose 示例用1000:1000。你的机器输出不是这个值,就替换成自己的 UID 和 GID。这样做是为了减少权限问题,别让容器用 root 身份乱碰文件。
给 Navidrome 数据目录设置归属:
sudo chown -R 1000:1000 /opt/navidrome/data音乐目录建议只给读取权限。Navidrome 扫描音乐库时会读取音频文件和元数据,服务端数据、封面缓存、播放记录会写到/opt/navidrome/data,不需要改你的原始音乐文件。
3 用 Docker Compose 部署 Navidrome
在/opt/navidrome里创建docker-compose.yml:
cd /opt/navidrome nano docker-compose.yml写入下面这份配置:
services: navidrome: image: deluan/navidrome:latest container_name: navidrome user: "1000:1000" ports: - "4533:4533" restart: unless-stopped environment: ND_LOGLEVEL: info volumes: - /opt/navidrome/data:/data - /data/music:/music:ro这里有几个点别填错:
4533:4533:Navidrome 默认 Web 端口是4533,后面本地访问和 cpolar 映射都用这个端口;/opt/navidrome/data:/data:Navidrome 的数据库、缓存、播放列表等数据放这里;/data/music:/music:ro:把宿主机音乐目录挂到容器的/music,末尾ro表示只读挂载;user: "1000:1000":替换成你刚才id命令看到的 UID 和 GID。
如果你用飞牛 NAS 的图形化 Docker / 容器功能,也按同样参数创建:镜像deluan/navidrome:latest,端口4533,数据目录挂/data,音乐目录只读挂/music。
启动服务:
docker compose up -d查看容器状态:
docker compose ps正常会看到navidrome处于运行状态,并且端口里有0.0.0.0:4533->4533/tcp。如果容器反复重启,先看日志:
docker compose logs --tail=100 navidrome排错先盯三件事:镜像有没有拉下来、/opt/navidrome/data有没有写权限、音乐目录路径是不是真实存在。
4 打开本地页面,完成初始账号和音乐扫描
服务跑起来后,在同一个局域网里打开:
http://NAS-IP:4533把NAS-IP换成飞牛 NAS 或 Linux 机器的局域网 IP。例如你的 NAS 地址是192.168.31.20,浏览器访问:
http://192.168.31.20:4533第一次打开时,Navidrome 会要求创建管理员账号。这里建议直接用一个不容易猜的用户名和强密码,不要用admin/admin、生日、手机号后几位这种组合。后面要做公网访问,账号密码就是第一道门。
登录后,Navidrome 会扫描/music目录里的音频文件。你的文件标签越干净,页面里显示得越舒服。比如艺术家、专辑、曲目号、封面这些元数据提前整理好,Navidrome 展示时就不需要你再手动猜。
如果页面空空的,按下面顺序查:
# 1. 宿主机上确认音乐目录里有文件 find /data/music -maxdepth 2 -type f | head # 2. 容器里确认 /music 能看到文件 docker exec -it navidrome sh -c "find /music -maxdepth 2 -type f | head" # 3. 查看 Navidrome 日志 docker compose logs --tail=100 navidrome如果第 1 条能看到文件,第 2 条看不到,问题就在 Docker 卷挂载路径。回到docker-compose.yml,把/data/music换成真实音乐目录,再执行:
docker compose up -d这一步是确认“宿主机音乐目录 → 容器/music→ Navidrome 页面”已经打通。链路通了,后面远程访问才有意义。
5 用 cpolar 映射 Navidrome Web 端口
局域网内能打开http://NAS-IP:4533后,再处理外地访问。不要暴露 NAS 管理后台,也不要把一堆端口全映射出去。这里只映射 Navidrome 的4533。
如果你的 NAS 或 Linux 机器已经安装并登录 cpolar,可以直接创建 HTTP 隧道:
cpolar http 4533命令运行后,终端会输出一个公网访问地址。你也可以打开 cpolar Web UI:
http://127.0.0.1:9200在 cpolar 的“状态 → 在线隧道列表”里查看 Navidrome 对应的 HTTPS 地址。把这个 HTTPS 地址复制出来,在外地手机或电脑浏览器里打开,就会进入 Navidrome 登录页。
如果你更习惯 Web UI 创建隧道,参数按下面填:
- 隧道名称:
navidrome - 协议:
http - 本地地址:
4533 - 域名类型:免费套餐选随机域名
- 地区:按实际线路选择
创建后去“状态 → 在线隧道列表”看公网地址。免费随机地址适合临时访问和测试,官方规则是 24 小时内会变化;长期使用再考虑固定二级子域名,固定二级子域名需要基础套餐或以上。
安全提醒放在这里说清楚:
- Navidrome 管理员账号必须用强密码,别复用 NAS 后台密码;
- 只映射
4533,不要顺手暴露飞牛 NAS 后台、SSH、数据库端口; - 临时在外面听歌,用完就关闭隧道;
- 多人账号分开建,别把管理员账号给家人共用;
- 公网入口只给自己和可信设备使用。
如果 cpolar 地址能打开,但页面不是 Navidrome,先检查本地地址是不是填成了 NAS 后台端口。这个坑很常见:Navidrome 是4533,NAS 管理页面是另一套端口,不要混在一起。
6 手机怎么听:Web 访问和 Subsonic 客户端两条路
本地和公网入口都跑通后,手机端有两种用法。
第一种最省事:手机浏览器打开 cpolar 的 HTTPS 地址,登录 Navidrome Web 页面。这个方式不用装 App,适合先确认远程链路是否正常。
第二种更像日常播放器:安装 Subsonic 兼容客户端,在客户端里新增服务器。Navidrome 官方说明它兼容 Subsonic / OpenSubsonic 客户端生态,手机、桌面、车机方向都有对应播放器。
客户端里通常要填三项:
Server URL: cpolar 生成的 HTTPS 地址 Username: Navidrome 用户名 Password: Navidrome 密码这里注意两点。
一是Server URL直接填 HTTPS 根地址,不要在后面乱加/login。浏览器登录页地址和客户端 API 地址不是一回事,客户端会自己拼接 Subsonic API 路径。
二是免费随机地址变化后,客户端里的服务器地址也要跟着改。如果你准备长期用手机客户端听,固定二级子域名会省很多事。
如果客户端连不上,先用同一台手机浏览器打开这个 HTTPS 地址。浏览器都打不开,问题在 cpolar 隧道或本地服务;浏览器能打开但客户端失败,再检查客户端里的 URL、账号、密码和 HTTPS 证书提示。
7 和 Jellyfin 怎么分工:视频库归视频,音乐库归音乐
前面提到的 Jellyfin 旧文更适合家庭影音库。它的重点是影片、剧集、字幕、海报墙、电视端播放,还有不同设备间的视频体验。
Navidrome 的优势在另一边:音乐库、歌单、专辑、低带宽播放、Subsonic 客户端。音频文件体积比视频小,在外面听歌对带宽要求也低。地铁、办公室、酒店网络里临时听自己的歌,Navidrome 的负担比视频服务轻。
我的建议是分开部署:
- Jellyfin 管视频、课程、家庭录像,端口按旧文方案处理;
- Navidrome 管音乐、歌单、专辑,端口固定看
4533; - cpolar 只映射当前需要访问的服务,不把 NAS 后台当作公网入口。
这样排错也清楚。看不了电影就查 Jellyfin,听不了歌就查 Navidrome。两个服务都放在 Docker Compose 里,各自有独立的数据目录和媒体目录,后面迁移 NAS 或换硬盘也更稳。
8 总结
现在这套链路已经成型:音乐文件还在自己的飞牛 NAS 或 Linux 服务器上,Navidrome 负责扫描和整理,局域网里用http://NAS-IP:4533访问;出门时用 cpolar 临时映射4533,手机浏览器或 Subsonic 兼容客户端都能连回自己的私有音乐库。
关键步骤就三块:
- Docker Compose 部署 Navidrome,把
/data和/music两个目录挂清楚,音乐目录建议只读挂载; - 本地页面先跑通,确认账号、扫描、播放都正常,再去做远程访问;
- cpolar 只映射 Navidrome Web 端口,配强密码,用完关闭临时隧道,不暴露 NAS 后台。
如果你之前已经按 Jellyfin 旧文搭好了家庭影音库,这篇就是音乐库补全方案。一个负责视频,一个负责音乐,再配合 NAS 的长期存储能力,家里的数字媒体会从“散在硬盘里”变成“随时能打开的私人媒体中心”。
你更想看 Navidrome 客户端推荐、歌词封面整理,还是和 Jellyfin 组合成家庭媒体中心?评论区告诉我,我按呼声继续写下一篇。
