飞牛 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 和 GIDid输出里会看到类似下面这样的内容uid1000(admin) gid1000(admin) groups1000(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.ymlcd /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:4533Navidrome 默认 Web 端口是4533后面本地访问和 cpolar 映射都用这个端口/opt/navidrome/data:/dataNavidrome 的数据库、缓存、播放列表等数据放这里/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 --tail100 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 --tail100 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 UIhttp://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 是4533NAS 管理页面是另一套端口不要混在一起。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 管音乐、歌单、专辑端口固定看4533cpolar 只映射当前需要访问的服务不把 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 组合成家庭媒体中心评论区告诉我我按呼声继续写下一篇。