作者ultimatevic (龟龟龟)
看板Headphone
标题[心得] 自架串流方案:navidrome
时间Sun Sep 14 20:01:40 2025
# Navidrome 开源串流播放方案
官方资料
https://www.navidrome.org/docs/usage/configuration-options/
* * *
## 基本介绍
### 简介与优缺点分析
Navidrome 网页介面
https://meee.com.tw/VsFE9vk.jpg
Feishin 介面 (Windows 客户端)
https://meee.com.tw/IeE7tdS.jpg
Amperfy 介面 (iOS 客户端)
https://meee.com.tw/m4QFJJS.jpg
本篇介绍最近成功架起来的自建串流方案,使用免费的开源软体 Navidrome 做为串流核
心。
Navidrome 是一款介面简洁,架设简单,操作流畅,且很稳定的开源串流软体服务,支援
Subsonic API,可用网页播放或是本地软体播放独占模式 (WASAPI)。客户播放软体只要
支持 Subsonic API 就能串接 Navidrome 资料库,选择很多。
**优点**
1. PC 客户端软体 Feishin + Mpv 能免安装使用 (能使用於公司电脑)。且支持
bit perfect 播放 (WASAPI even mode exclusive)。
2. Subsonic 有相当多的客户端软体可以选择。
3. 音乐可以直接在网页介面下载,方便分享。
4. 音乐资料库暴露於外网的安全性:
- Navidrome 介面无法修改音乐档案,只读取快取层 metadata。
- 本地 NAS 的 NFS 分享资料夹档案权限是唯读。
**缺点**
1. Feishin + Mpv 只支援 WASAPI even mode,不支援 ASIO 或是 push mode,对某些老
旧或是特定 USB 音讯设备支援度不佳。
2. Navidrome 没有直接管理音乐资料库档案的功能:
- 无法以资料夹结构浏览档案。
- Navidrome 无法修改 metadata。
3. 承上,通常後端还需要一个音乐资料库管理软体,比如 foobar2000。平时在内网环境
以 foobar2000 管理和播放资料库,在外网使用 Navidrome 串流资料库。
4. Navidrome 仰赖 tag 管理,所以可能不适合没有整理 tag 的音乐资料库。
5. foobar2000 的 subsonic component 2025 年已停止维护,所以此方案无法让
foobar2000 串接 Navidrome 伺服器。
6. 大部分浏览器无法原生支援 Apple Lossless(ALAC)档案串流,需要转档
(transcode)。
### 串流架构
客户端 → Nginx 反向代理伺服器 → Navidrome 串流伺服器 → NAS 音乐资料库
https://meee.com.tw/BVzzIZL.jpg
1. 客户端
- 电脑 (Windows):使用 Feishin + Mpv,支援独占播放 (WASAPI event mode)
- 手机 (iOS / Android):使用 amperfy 或 flo 等支援 subsonic 的客户端,选
择很多
2. Nginx 反向代理伺服器 (Linux):以 host-level 或是 docker 容器部署
3. Navidrome 串流伺服器 (Linux):以 docker 容器部署
4. 音乐资料库 (NAS):NFS 分享资料夹 (唯读)
### 需准备项目
1. NAS 或 伺服器主机,需支援容器部署环境:
- 安装 Nginx 反向代理伺服器 跟 Navidrome 串流伺服器。
- 音乐资料库存放的档案伺服器
2. Windows PC 或 行动装置:做为播放客户端,需安装播放软体
3. 需自有一个网域
4. 支援 DNS 改写的 DNS proxy (例如 AdGuardHome) 或是支援 NAT hairpin 的路由器
:让内网环境能使用相同网域 url 访问伺服器。这个可有可无,但为了让手机能在内
外网都能无缝串流,建议使用。
### 本篇范例使用设备
客户端 (A) → (
https://nd.domain.com) → Nginx 反向代理伺服器 (B) →
Navidrome 串流伺服器 (B) → NAS 音乐资料库 (C)
https://meee.com.tw/BVzzIZL.jpg
A. 客户端:
- Windows PC:Feishin + Mpv (wasapi exclusive)
- iOS:Amperfy
B. 伺服器主机 (192.168.20.1):Intel NUC13 i5 (32GB RAM)
- Ubuntu linux server LTS22.04
C. Synology NAS (192.168.20.2 /volume1/music):约1200张专辑,500GB资料库
- DSM 7
注:可以将 Nginx 反代跟 Navidrome 都部署在 NAS 上,架构比较简洁,因为我不喜欢执
行伺服器放在 NAS 上所以这里的范例采用比较复杂的架构。如果要集中放 NAS 上设
定会简单很多,Navidrome 容器设定应该大同小异,DSM 也有内建简单的反代,可自
己尝试。
* * *
## 安装步骤
注:以下步骤假设读者对 Linux/Docker 有基本操作经验
### A.购买网域:
此处不赘述,网路上有教学
个人推荐 Namecheap (Cloudflare 管理) 或是 Cloudflare
### B. 安装 ddclient 以网域供应商 API 更新 DNS 纪录:
此处不赘述,网路上有教学
### C. 用 certbot 向 Let's Encrypt 取得网域凭证:
此处不赘述,网路上有教学
如果是 cloudflare 网域也能用 acme.sh 或是 nginx 的 nginx-acme 模组
certbot \ acme.sh \ nginx-acme module 三者都能设定凭证自动续期
### D. 设定 Synology NAS DSM 共享资料夹(/volume1/music)的 NFS 分享权限
1. 指定 IP: 192.168.20.2
2. 权限唯读,squash to guest,启用非同步
3. 资料夹权限设定 guest 可读
### E. 在 Linux server 挂载 NFS 资料夹
===== bash 命令列区块 =====
# 文字为注解
# 建立挂载点
sudo mkdir /mnt/navidrome_music
# 编辑 fstab 文件启用自动挂载
sudo nano /etc/fstab
# 在 /etc/fstab 中填入这一行
192.168.20.2:/volume1/music /mnt/navidrome_music nfs nfsvers=4.1,_netdev
0 0
# 手动挂载
sudo mount /mnt/navidrome_music
===========================
### F. 在 Linux server 部署 Navidrome (docker 容器)
===== bash 命令列区块 =====
# 建立容器部署资料夹
sudo mkdir /opt/navidrome
# 建立专门运行容器的系统使用者,docker-user
# 该帐号不能登入,只给系统服务使用,不需设定密码
# 不建议使用预设权限部属容器
sudo useradd -r docker-user
# 将主要使用者加入 docker-user 群组,以便之後能够读写 docker-user 写入的档案
sudo usermod -a -G docker-user $USER
# 确认使用者的 uid 和 gid
id docker-user
id $USER
# 假设 docker-user 这个使用者 uid:gid=998:998
# 而主要使用者是预设值 uid:gid=1000:1000
# 调整资料夹拥有权和适当权限
# 1000:998 分别是主要使用者与 docker-user 群组的 uid/gid,请依自己环境调整
sudo chown 1000:998 /opt/navidrome
chmod 750 /opt/navidrome
# 进入部署资料夹内
cd /opt/navidrome
# 建立资料夹存放 navidrome 设定档案,并给予适当权限
mkdir navidrome_data
chown 1000:998 navidrome_data
chmod 750 navidrome_data
# 编辑 docker-compose.yml 文件,填入下方yml内容
nano docker-compose.yml
=========================
===== yml 文件内容 =====
services:
navidrome:
image: deluan/navidrome:latest
container_name: navidrome
restart: unless-stopped
user: 998:998
ports:
- "4533:4533"
environment:
- ND_BASEURL=
https://nd.domain.com
- ND_SCANNER_SCHEDULE=0 0 * * *
volumes:
- /mnt/navidrome_music:/music:ro
- ./navidrome_data:/data
networks:
- navidrome_net
networks:
navidrome_net:
driver: bridge
=======================
===== bash 命令列区块 =====
# 检查语法错误
docker compose config
# 建立容器
docker compose up -d
# 查看 logs 是否有错误
docker compose logs
===========================
### G. 设定 Nginx reverse proxy
Nginx 安装不赘述 (请参阅网路资料)
本篇以 host-level nginx 为例,并假设凭证在预设储存位置。
也可以使用容器化的 nginx 并整合进 docker compose。
===== bash 命令列区块 =====
# 建立 nginx 设定档
sudo nano /etc/nginx/sites-available/nd.domain.com
===========================
===== nginx 设定档 nd.domain.com 内容 =====
server {
listen 443 ssl http2;
server_name nd.domain.com;
ssl_certificate /etc/letsencrypt/live/nd.domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/nd.domain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=63072000;
includeSubDomains; preload" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options nosniff always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=()" always;
access_log /var/log/nginx/navidrome_access.log;
error_log /var/log/nginx/navidrome_error.log;
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;
proxy_set_header X-Forwarded-Host $host;
location / {
proxy_pass
http://127.0.0.1:4533;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
proxy_cache_bypass $http_upgrade;
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
proxy_pass
http://127.0.0.1:4533;
expires 30d;
add_header Cache-Control "public, immutable";
}
location ~* \.(mp3|flac|m4a|wav|aac|aiff)$ {
proxy_pass
http://127.0.0.1:4533;
proxy_buffering off;
proxy_read_timeout 3600s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
add_header Accept-Ranges bytes;
}
}
server {
listen 80;
server_name nd.domain.com;
return 301
https://$server_name$request_uri;
}
======================================
### H. Navidrome 初次设定
#### H-1. 开启 ufw 防火墙,先在内网设定 Navidrome 管理员帐户
注1:尚未创建管理员帐户时,不建议把服务放上外网,避免他人抢登
注2:可事先创建 navidrome.toml 档案建立帐户,详情可见官方文件
===== bash 命令列区块 =====
# 建立防火墙规则,允许内网设备访问 Navidrome 网页介面
sudo ufw allow from any to any port 4533 proto tcp
===========================
浏览器访问 192.168.20.1:4533 (请自行替换伺服器内网 IP),创建管理员帐户
#### H-2. 管理员帐户创建完毕後,启用 nginx reverse proxy,将服务上外网
===== bash 命令列区块 =====
# 建立软连结以启用该设定
sudo ln -s /etc/nginx/sites-available/nd.domain.com /etc/nginx/sites-enabled
# 检查 nginx 语法
sudo nginx -t
# 重新载入 nginx 设定
sudo systemctl reload nginx
===========================
#### H-3. 检查路由器 port forwarding 设定(不赘述)
现在就能在外网利用
https://nd.domain.com 进入 Navidrome 网页介面
如果在内网环境需要用 DNS 改写或是 NAT hairpin 使用 url 进入介面
#### H-4. 可选步骤:增加 fail2ban 保护
I. Feishin + Mpv 独占播放
1. Feishin 下载:
https://github.com/jeffvli/feishin/releases
2. Mpv 下载:
https://mpv.io/installation/ 选 shinchiro (git)
1. 目前 windows 可选版本: mpv-x86_64-20250908-git-77dee9b.7z (此为撰文时
的最新版本,请至官方下载页确认最新版本)
下载後解压缩,进到 mpv.exe 所在的资料夹
#### I-1. 测试 mpv 命令
在 Mpv 资料夹内右键选单开启 Windows 终端(powershell),执行以下命令测试是否可
用
注:如果终端是 CMD 直接用 mpv 做为命令即可
===== powershell 命令列区块 =====
.\mpv
=================================
#### I-2. 列出音讯设备
===== powershell 命令列区块 =====
# 列出可用音讯设备
.\mpv --audio-device=help
# 音讯设备结果(举例)
List of detected audio devices:
'auto' (Autoselect device)
'wasapi/{183025c0-0d3b-4d76-9360-c1bfe13982e2}' (喇叭 (Steam Streaming
Microphone))
'wasapi/{357f6ae2-c3ef-4272-837a-c23aa517f553}' (喇叭 (Steam Streaming
Speakers))
'wasapi/{aedc8312-491c-4ac1-85ae-5437bc7768e7}' (Echo Cancelling
Speakerphone (DELL Slim Soundbar SB522A))
'wasapi/{e0c575aa-f646-4281-91b3-79cec07d60e5}' (喇叭 (2- PureAudio Lotus
DAC5))
'openal' (Default (openal))
'sdl' (Default (sdl))
=================================
#### I-3. Feishin 播放设定
范例:
https://i.meee.com.tw/gcYTkND.png
1. 指定 mpv.exe 路径
2. Mpv 参数(只列出常用的):
https://mpv.io/manual/stable/#audio
--ao=<driver> 指定输出的音讯模式(可以选 WASAPI)
--audio-exclusive=<yes/no> 是否启用独占模式
--audio-device=<name> 指定音讯设备
--audio-fallback-to-null=<yes/no> 是否启用「null(无声)」输出(预设是 no)
--volume=<value> mpv 预设音量
--replaygain=<no|track|album> replaygain 预设模式(预设是 no)
--replaygain-clip=<yes|no> mpv 是否能让 gain 造成 clip(预设是 no)
由於 Feishin 本身的 audio settings 就有重复的参数,且会覆盖 mpv 参数,因此使用
者只要填入 Feishin 本身没有的 mpv 参数即可。但要留意 Feishin 参数会覆盖 mpv 参
数,所以要记得开启 Feishin 相关的设定。
注1:如果不介意播放时独占声音,参数可留空,mpv 会自动以系统预设播放设备播放
举例:
如果我想以上述条列出的音讯设备 "PureAudio Lotus DAC5" 作为播放端,使用 wasapi,
启用 exclusive mode 并能自动切换采样率
Feishin mpv block 参数填入:
--audio-device=wasapi/{e0c575aa-f646-4281-91b3-79cec07d60e5}
--wasapi-exclusive-buffer=default
--audio-fallback-to-null=yes
然後调整 Feishin 其他的设定(settings > 播放)
1. 无间隔音讯(Gapless): 关闭或是 weak (如果使用 yes 会无法自动切换采样率)
2. 取样率:留空
3. 音讯独占模式:开启
4. Replaygain 模式:请自行选择
* * *
## 总结与心得
1. Navidrome 伺服器与客户端软体的搭配,UI 操作非常流畅,在 mobile 端体验接近
Spotify 等商业软体,不会有载入卡顿等问题。
2. PC 客户端可以免安装,不用 VPN 就能连到自己的资料库,也支援 bit perfect 播
放,非常适合那些想要在公司堆放昂贵设备并且有时间偷懒的玩家。
3. 不能支持 ASIO 或是调整 WASAPI 细项有时候还是蛮麻烦的,毕竟像我会丢去办公室
用的东西都是古物,对於 WASAPI event 支援度不好。
4. Navidrome 可以创建智慧播放清单,但需要额外写 conf 手动放入指定资料夹,详情
可以参考官方文件。
5. 其他几个远端开源串流方案的优缺点分析
**foobar2000 使用 webdav 抓取远端资料库 (不需 VPN)**
这是个兼顾管理和外网串流可行方案,但 webdav 在 foobar 有一些小问题,比如封面显
示和资料库抓取的速度没那麽快,不利大型资料库。500GB 的资料库可能要抓半天才能读
完 tag。
**foobar2000 使用 SMB 或 Upnp 伺服器 (需要 VPN)**
需要 VPN,多个步骤,且比较需要远端安装环境配合,外网桌面端不一定能使用 VPN
(公司环境)
**foobar2000 使用 foo_subsonic 插件串接 navidrome 资料库 (不需 VPN)**
我觉得这是最全面的开源外网串流兼管理的解决方案,但 foo_subsonic 插件已经停止维
护。
**foobar2000 使用 webdav 抓取 Nextcloud 音讯档案 (不需 VPN)**
原则可行,但应该没人想碰含有大型音乐资料库的 Nextcloud 资料维护。
Nextcloud 的维护真的很血尿。
**Jellyfin / Emby / Plex**
这类软体 UI 设计比较偏向综合影音而非纯发烧友取向
**Lyrion Music Server + Squeezelite / Squeezelite-X (需要VPN)**
这应该是最接近 Roon 区网串流的开源方案
UI的设计、稳定性和操作流畅度都比 foobar + Upnp 好上一大截
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.242.31.247 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Headphone/M.1757851310.A.EAF.html
1F:推 breadf: 古物让他入土为安吧 09/14 20:18
压榨到最後一刻 XD
2F:→ raidcrash: 安卓推荐Symfonium 算是用起来最舒服的客户端了 09/14 20:50
3F:→ raidcrash: 智慧型播放清单可以用Feishin创建跟编辑 比较简单点 09/14 20:51
原来 Feishin 可以建,还没玩到这一块,感谢
4F:→ raidcrash: 最近在玩AudioMuse-AI Plex/Subsonic版本的Sonic Analy 09/14 20:55
5F:→ raidcrash: sis 挺有趣的 有兴趣可以玩玩 09/14 20:56
6F:→ raidcrash: 更正 *Jellyfin/Subsonic 09/14 20:56
这个很酷!又有东西可以玩!
8F:推 whydan: 龟~~神~~ 09/14 21:24
这很好玩欸 坏蛋大要不要来开一个
9F:→ comipa: 推教学文! 09/15 08:07
10F:推 tritonCKL: 推教学,目前是用gonic搭配feishin(pc), Symfonium(安 09/15 09:29
11F:→ tritonCKL: 卓), airsonic-refix(web), gonic有支援资料夹浏览蛮符 09/15 09:29
12F:→ tritonCKL: 合我需求的xD 09/15 09:29
感谢推荐,我先 starred/watch 起来
13F:推 Pixmi: 推教学文,之前我是NAS架设Volumio串流,後来是AM简单听了 09/15 10:31
Volumio 应该也能做外网串流,但需要订阅 premium 的样子。
以前用过一阵子但觉得 Volumio 的 UI 流畅度不佳就没继续用了。
14F:推 lll156k1529: 纯推不下 09/15 12:56
20250918 更新:
1. 修正和优化 Nginx reverse proxy 设定
2. 修正部属後创建管理员帐号的步骤,提高安全性
3. 修正: 范例预设关闭 Navidrome 档案分享选项
20251005 更新:
1. 修正命令列区块的表达方式
2. 增加 LMS + squeezelite 替代选项
20251110 更新:
1. 修正 Feishin mpv 音讯设定
※ 编辑: ultimatevic (60.248.53.79 台湾), 11/10/2025 11:58:57
※ 编辑: ultimatevic (60.248.53.79 台湾), 11/10/2025 13:54:15
※ 编辑: ultimatevic (60.248.53.79 台湾), 11/10/2025 13:55:46