Docker 部署 Navidrome,搭建自托管音乐库并连接移动端app
- 一、为什么选择 Navidrome
- 二、Docker 部署 Navidrome
- 2.1 准备工作
- 2.2 方式一:docker run 单条命令(快速上手)
- 2.3 方式二:docker-compose.yml(推荐,便于管理)
- 2.4 关键参数说明
- 三、启动 + 创建管理员
- 四、用客户端连接 Navidrome
- 4.1 iOS 用户注意(HTTPS)
- 五、进阶与踩坑
- 5.1 反向代理(HTTPS 访问)
- 5.2 扫库与性能
- 5.3 备份
- 5.4 常见问题
- 六、结尾
- 附:本文使用的环境版本
目标读者:拥有 NAS、Linux 服务器或 VPS 的自托管爱好者,具备基本的 Docker 使用经验。
适用平台:任何能跑 Docker 的环境 —— 威联通 QNAP、群晖 Synology、绿联 UGREEN、Ubuntu / Debian / CentOS 服务器、树莓派,甚至一台迷你主机。
阅读时间:约 10 分钟,部署操作约 20 分钟。
一、为什么选择 Navidrome
订阅 Apple Music / Spotify 几年后,很多人会意识到同一个问题:无损 FLAC 本地文件越攒越多,每次想听都得连数据线或开 SMB 共享;流媒体平台要么不收你的小众专辑,要么偷偷把音轨换成低码率 AAC。于是「自托管音乐流媒体」成了刚需。
Navidrome 是一个用Go编写的开源音乐服务器,主打「轻量、快、专注音乐」。它实现了 Subsonic API,因此任何兼容 Subsonic 的客户端(手机、电脑、Web、第三方 App)都能直接接入。它和 Plex / Emby / Airsonic 不是同一个定位:
| 服务 | 定位 | 资源占用 | 音乐体验 | 维护成本 |
|---|---|---|---|---|
| Plex | 全能媒体服务器 | 大(流媒体同步需 Plex Pass) | 一般 | 高 |
| Emby | 全能媒体服务器 | 大 | 一般 | 高 |
| Airsonic | Subsonic 老牌社区分支 | 中(Java 虚拟机) | 中 | 中(更新慢) |
| Navidrome | 专注音乐 | 小(Go,单二进制) | 好(自动匹配歌词、艺人头像) | 低 |
Navidrome 没有 Plex / Emby 那种「全能压力」,扫库飞快,x86 和 ARM 架构都能流畅运行,天然适合 Docker 部署。
二、Docker 部署 Navidrome
2.1 准备工作
开始前先确认两件事:
- 音乐目录路径:把你要听的音乐整理到一个目录里(例如 Linux 服务器的
/srv/music、群晖的/volume1/music、威联通的/share/Music)。记住它的宿主机绝对路径,稍后要作为「音乐卷」挂进容器。 - 数据目录路径:创建一个空目录存放 Navidrome 的数据库和缓存(例如
/srv/navidrome/data)。数据卷与音乐卷要分开,不要混在一起。
挂载建议:音乐目录以只读(
:ro)方式挂载,这样 Navidrome 不可能误删你的音乐文件,是最重要的安全实践。
2.2 方式一:docker run 单条命令(快速上手)
把下面两处路径换成你自己的实际路径,然后直接运行:
dockerrun-d\--namenavidrome\--restartunless-stopped\-p4533:4533\-eND_SCANNER_ENABLED=true\-eND_SCANNER_SCHEDULE="@every 1h"\-eND_LOGLEVEL=info\-eND_DEFAULTLANGUAGE=zh-cn\-eND_MUSICFOLDER=/music\-v/srv/navidrome/data:/data\-v/srv/music:/music:ro\deluan/navidrome:latest运行后查看日志确认正常启动:
dockerlogs-fnavidrome看到Navidrome is ready!或类似启动信息即成功。
2.3 方式二:docker-compose.yml(推荐,便于管理)
新建一个目录,写入docker-compose.yml:
services:navidrome:image:deluan/navidrome:latestcontainer_name:navidromerestart:unless-stoppedports:-"4533:4533"environment:ND_SCANNER_ENABLED:"true"ND_SCANNER_SCHEDULE:"@every 1h"ND_LOGLEVEL:infoND_DEFAULTLANGUAGE:zh-cnND_MUSICFOLDER:/musicvolumes:-/srv/navidrome/data:/data-/srv/music:/music:ro注意:请把
/srv/navidrome/data和/srv/music替换成你自己的实际路径。
保存后在文件所在目录执行:
dockercompose up-d查看状态:
dockercomposepsdockercompose logs-fnavidrome2.4 关键参数说明
| 参数 | 说明 |
|---|---|
4533:4533 | 左为宿主机端口、右为容器端口。默认 Web UI 用 4533,想换端口改左边即可(换完记得客户端那边同步改)。 |
ND_MUSICFOLDER | 容器内的音乐目录路径,与-v ...:/music:ro挂载点一致即可,一般保持/music不用动。 |
ND_SCANNER_ENABLED/ND_SCANNER_SCHEDULE | 自动扫库开关与周期。@every 1h表示每 1 小时扫描一次;刚拷完新专辑想立刻看到可临时改成@every 5m。 |
ND_DEFAULTLANGUAGE | 设为zh-cn可让中文文件名 / 艺人名匹配得更准,建议保留。 |
ND_LOGLEVEL | 日常用info;排查问题时临时改成debug。 |
ND_BASEURL | 留空即可;若用反向代理挂在子路径下(如https://xxx.com/music),可设为/music。 |
若需要接入 Last.fm 记录播放、Spotify 补齐封面等,可额外添加
ND_LASTFM_APIKEY、ND_SPOTIFY_ID、ND_SPOTIFY_SECRET,详见 Navidrome 官方配置文档。
三、启动 + 创建管理员
浏览器打开http://你的服务器IP:4533,首次访问会自动进入创建管理员流程:
- 填用户名 + 密码。注意:这个密码同时就是 Subsonic API 的密码,后面客户端连接时要原样填写。
进入后到Settings → Music Folders,确认/music被正确识别。第一次扫全库会比较慢,等进度条跑完,回到主页应该就能看到所有专辑了。
首次元数据匹配(艺人头像 / 歌词)需要联网,之后会缓存到
/data卷;NAS 或服务器无法联网时,可以提前离线准备元数据。
四、用客户端连接 Navidrome
服务端搭好后,还需要一个兼容 Subsonic 协议的客户端来播放。Navidrome 实现的是 Subsonic API,所以客户端选择非常多,iOS / Android / 桌面端都有对应 App。常见的几款如下:
| 客户端 | 平台 | 特点 |
|---|---|---|
| DSub | Android | 老牌客户端,功能全面 |
| Symfonium | Android | 界面现代,支持离线缓存 |
| substreamer | iOS / Android / Web | 开源免费 |
| Sonixd | Windows / macOS / Linux | 跨平台桌面端 |
| 归流 | iOS / Android / 桌面 | 中文界面,面向 NAS 自部署场景 |
下面以「归流」为例演示连接步骤——它是一款支持 NAS 自部署服务的中文客户端,音乐子系统同样走 Subsonic 协议。其他客户端的配置项大同小异,可对照参考:
打开归流 App,进入设置 → 添加服务 → 音乐服务器:
| 字段 | 填写内容 |
|---|---|
| 服务类型 | Subsonic / Navidrome |
| 服务器地址 | http://192.168.x.x:4533(换成你服务器 / NAS 的内网 IP 或域名) |
| 用户名 | 刚才创建的 Navidrome 管理员用户名 |
| 密码 | 同一个密码 |
点连接,客户端会请求/rest/ping.view验证凭据,成功即自动进入音乐主页,随后自动同步全部专辑、艺人和歌单。
4.1 iOS 用户注意(HTTPS)
iOS 默认只允许 HTTPS 出口,直连 HTTP 内网 IP 时系统可能拒绝。三种解法:
- 本地 ATS 例外(零配置):部分客户端在
Info.plist中已配置NSAllowsLocalNetworking = YES,局域网 IP 直连可直接使用。 - 反向代理 HTTPS:用 Nginx / Caddy / Nginx Proxy Manager 配一个
music.xxx.com子域名 + Let’s Encrypt 证书。 - 公网 + HTTPS:DDNS + 反代 + 证书,实现外网访问。
局域网用户优先用方案 1;需要跨网络访问时再上方案 2 / 3。
五、进阶与踩坑
5.1 反向代理(HTTPS 访问)
用 Nginx 或 Caddy 反代 Navidrome,示例(Nginx):
server { listen 443 ssl; server_name music.example.com; ssl_certificate /etc/letsencrypt/live/music.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/music.example.com/privkey.pem; location / { proxy_pass http://127.0.0.1:4533; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }推荐用 Nginx Proxy Manager(Docker 一键部署),图形化配证书,省去手写配置。
5.2 扫库与性能
- scanner 周期:
ND_SCANNER_SCHEDULE默认 1 小时;拷贝新专辑后不会立刻出现,要么等,要么临时改5m。 - 数据库:Navidrome 默认 SQLite,10 万首歌以内基本无压力;更大的库可把
ND_DB指向外部 PostgreSQL(详见官方文档)。 - 转码:默认不转码、源文件直推。若客户端不支持 FLAC,可在 Settings 开启转码,但会吃 CPU,家用环境一般不开。
5.3 备份
最关键的卷是/data(本例宿主机路径为/srv/navidrome/data):
navidrome.db:所有扫库结果、播放计数、收藏夹都存在这里,最需要备份。cache/:封面 / 艺人头像缓存。
备份示例:
tar-czfnavidrome-backup-$(date+%F).tar.gz /srv/navidrome/data建议把它纳入你现有的备份计划(NAS 的 HBS3 / Hybrid Backup Sync,或服务器的 cron 定时任务)。
5.4 常见问题
| 现象 | 原因 | 解决 |
|---|---|---|
| 扫库后库是空的 | 音乐目录挂载路径不对 | docker exec -it navidrome ls /music查看容器内是否有内容 |
| 客户端连不上 | 端口 4533 未放行 | 检查宿主机防火墙 / 安全组放行 4533 端口 |
| iOS 报 ATS 错误 | URL 不在 ATS 白名单 | 用局域网 IP,或上 HTTPS 反代 |
| scanner 卡在 0% | 容器读不到文件权限 | 给音乐目录加读权限,或容器加user: "0"参数 |
| 同一首歌反复扫库 | 文件名有变动 | 避免频繁改名,scanner 周期适当调长 |
六、结尾
至此,你就拥有了一套完全自托管的音乐流媒体服务:无损本地文件静静躺在你的服务器 / NAS 上,手机、平板、Web 客户端随时访问,不依赖任何第三方订阅、不怕平台下架、不怕音质被偷换。
服务端交给 Navidrome,客户端选择任何一款兼容 Subsonic 协议的 App 即可;如果你更习惯中文界面、且希望在手机和电脑上统一管理多个自托管服务,可以试试上文的「归流」。
附:本文使用的环境版本
- Docker:20.10+(支持
docker compose命令) - Navidrome 镜像:
deluan/navidrome:latest(发布时版本号见镜像 tag)
相关链接
- Navidrome 官网:https://www.navidrome.org/
- Navidrome 配置文档:https://www.navidrome.org/docs/operators/configuration/
- Nginx Proxy Manager:https://nginxproxymanager.com/