目标读者:拥有 NAS、Linux 服务器或 VPS 的自托管爱好者,具备基本的 Docker 使用经验。 适用平台:任何能跑 Docker 的环境 —— 威联通 QNAP、群晖 Synology、绿联 UGREEN、Ubuntu / Debian / CentOS 服务器、树莓派,甚至一台迷你主机。 阅读时间:约 10 分钟,部署操作约 20 分钟。


一、为什么是 Navidrome

订阅 Apple Music / Spotify 几年后,很多人会意识到同一个问题:无损 FLAC 本地文件越攒越多,每次想听都得连数据线或开 SMB 共享;流媒体平台要么不收你的小众专辑,要么偷偷把音轨换成低码率 AAC。于是「自托管音乐流媒体」成了刚需。

Navidrome 是什么?

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 准备工作

开始前先确认两件事:

  1. 音乐目录路径:把你要听的音乐整理到一个目录里(例如 Linux 服务器的 /srv/music、群晖的 /volume1/music、威联通的 /share/Music)。记住它的宿主机绝对路径,稍后要作为「音乐卷」挂进容器。

  2. 数据目录路径:创建一个空目录存放 Navidrome 的数据库和缓存(例如 /srv/navidrome/data)。数据卷与音乐卷要分开,不要混在一起。

挂载建议:音乐目录以 只读(:ro) 方式挂载,这样 Navidrome 不可能误删你的音乐文件,是最重要的安全实践。

2.2 方式一:docker run 单条命令(快速上手)

把下面两处路径换成你自己的实际路径,然后直接运行:

docker run -d \
  --name navidrome \
  --restart unless-stopped \
  -p 4533:4533 \
  -e ND_SCANNER_ENABLED=true \
  -e ND_SCANNER_SCHEDULE="@every 1h" \
  -e ND_LOGLEVEL=info \
  -e ND_DEFAULTLANGUAGE=zh-cn \
  -e ND_MUSICFOLDER=/music \
  -v /srv/navidrome/data:/data \
  -v /srv/music:/music:ro \
  deluan/navidrome:latest

运行后查看日志确认正常启动:

docker logs -f navidrome

看到 Navidrome is ready! 或类似启动信息即成功。

2.3 方式二:docker-compose.yml(推荐,便于管理)

新建一个目录,写入 docker-compose.yml:

services:
  navidrome:
    image: deluan/navidrome:latest
    container_name: navidrome
    restart: unless-stopped
    ports:
      - "4533:4533"
    environment:
      ND_SCANNER_ENABLED: "true"
      ND_SCANNER_SCHEDULE: "@every 1h"
      ND_LOGLEVEL: info
      ND_DEFAULTLANGUAGE: zh-cn
      ND_MUSICFOLDER: /music
    volumes:
      - /srv/navidrome/data:/data
      - /srv/music:/music:ro

注意:请把 /srv/navidrome/data 和 /srv/music 替换成你自己的实际路径。

保存后在文件所在目录执行:

docker compose up -d

查看状态:

docker compose ps
docker compose logs -f navidrome

2.4 关键参数说明

参数

说明

4533:4533

左为宿主机端口、右为容器端口。默认 Web UI 用 4533,想换端口改左边即可(换完记得归流 App 那边同步改)。

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 的密码,后面归流 App 连接时要原样填写。

进入后到 Settings → Music Folders,确认 /music 被正确识别。第一次扫全库会比较慢,等进度条跑完,回到主页应该就能看到所有专辑了。

首次元数据匹配(艺人头像 / 歌词)需要联网,之后会缓存到 /data 卷;NAS 或服务器无法联网时,可以提前离线准备元数据。


四、用「归流」App 连接 Navidrome

到这里,你的自托管音乐服务就架好了。但服务端只是「库」,真正决定体验的是客户端。强烈推荐用「归流」App 来连接 —— 它就是为了 NAS 自部署场景而生的原生客户端。

4.1 归流是什么

归流(Klusto) 是一款支持 NAS 自部署服务的 Flutter 原生客户端,音乐子系统原生实现了 Subsonic 协议,与 Navidrome 无缝对接。它的几个核心体验:

  • 🎧 原生音乐体验:专辑网格 / 列表、全屏播放器、后台播放、锁屏 / 控制中心 / AirPods 上一首下一首,开箱即用。

  • ⚡ 细节到位:专辑封面缓存、歌词、播放队列,连接后自动同步专辑 / 艺人 / 歌单。

  • 📱 跨平台:iOS / Android / 桌面端均已发布,一套服务多端访问。

  • 🔌 不止音乐:后续还会接入视频、笔记、记账等更多 NAS 自部署服务,一个 App 管所有自托管。

📲 立即下载归流 App:

👉 https://apps.apple.com/cn/app/归流/id6782746622

App Store 搜索「归流」即可下载,或直接点上方链接跳转。

4.2 添加服务器

打开归流 App,进入 设置 → 添加服务 → 音乐服务器:

字段

填写内容

服务类型

Subsonic / Navidrome

服务器地址

http://192.168.x.x:4533(换成你服务器 / NAS 的内网 IP 或域名)

用户名

刚才创建的 Navidrome 管理员用户名

密码

同一个密码

点 连接,归流会请求 /rest/ping.view 验证凭据,成功即自动进入音乐主页,随后自动同步全部专辑、艺人和歌单。

4.3 iOS 用户注意(HTTPS)

iOS 默认只允许 HTTPS 出口,直连 HTTP 内网 IP 时系统可能拒绝。归流已经帮你处理好了三种情况:

  1. 本地 ATS 例外(推荐,零配置):归流在 Info.plist 中已配置 NSAllowsLocalNetworking = YES,局域网 IP 直连可直接使用,无需任何额外操作。

  2. 反向代理 HTTPS:用 Nginx / Caddy / Nginx Proxy Manager 配一个 music.xxx.com 子域名 + Let's Encrypt 证书。

  3. 公网 + 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 -czf navidrome-backup-$(date +%F).tar.gz /srv/navidrome/data

建议把它纳入你现有的备份计划(NAS 的 HBS3 / Hybrid Backup Sync,或服务器的 cron 定时任务)。

5.4 常见问题

现象

原因

解决

扫库后库是空的

音乐目录挂载路径不对

docker exec -it navidrome ls /music 查看容器内是否有内容

App 连不上

端口 4533 未放行

检查宿主机防火墙 / 安全组放行 4533 端口

iOS 报 ATS 错误

URL 不在 ATS 白名单

用局域网 IP(归流已自带本地 ATS 例外),或上 HTTPS 反代

scanner 卡在 0%

容器读不到文件权限

给音乐目录加读权限,或容器加 user: "0" 参数

同一首歌反复扫库

文件名有变动

避免频繁改名,scanner 周期适当调长


六、结尾

至此,你就拥有了一套完全自托管的音乐流媒体服务:无损本地文件静静躺在你的服务器 / NAS 上,手机、平板、Web 客户端随时访问,不依赖任何第三方订阅、不怕平台下架、不怕音质被偷换。

服务端交给 Navidrome,客户端交给「归流」—— 一个为 NAS 自部署而生的原生 App,音乐只是它的起点,后续还会接入更多自托管服务。

📲 下载归流 App:

👉 https://apps.apple.com/cn/app/归流/id6782746622

App Store 搜索「归流」即可下载。

如果你也用威联通、群晖或其他品牌 NAS,欢迎留言告诉我你最想看哪个自托管服务的部署教程。


附:本文使用的环境版本

  • Docker:20.10+(支持 docker compose 命令)

  • Navidrome 镜像:deluan/navidrome:latest(发布时版本号见镜像 tag)

  • 归流 App 版本:1.x.x(发布时以 App 内为准)


相关链接