作者 ultimatevic (龜龜龜)
標題 [心得] 自架串流方案:navidrome
時間 Sun Sep 14 20:01:40 2025


# Navidrome 開源串流播放方案

官方資料
https://www.navidrome.org/docs/usage/configuration-options/
Navidrome Configuration Options | Navidrome
How to customize Navidrome to your environment ...

 

* * *

## 基本介紹

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 檔案權
    限是唯讀。

**缺點**

1.  Feishin + Mpv 只支援 WASAPI even mode,不支援 ASIO 或是 push mode,對某些老
    舊或是特定 USB 音訊設備支援度不佳。
2.  Navidrome 沒有直接管理音樂資料庫檔案的功能:
        1.  無法以資料夾結構瀏覽檔案。
        2.  Navidrome 無法修改 metadata。
3.  承上,通常後端還需要一個音樂資料庫管理軟體,比如 foobar2000。平時在內網環境
    以 foobar2000 管理和播放資料庫,在外網使用 Navidrome 串流資料庫。
4.  Navidrome 仰賴 tag 管理,所以可能不適合沒有整理 tag 的音樂資料庫。
5.  foobar2000 的 subsonic component 2025 年已停止維護,所以此方案無法讓
    foobar2000 串接 Navidrome 伺服器。
6.  這個方案不支援 Apple Lossless(ALAC)檔案串流。


### 串流架構

客戶端 → 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 或 伺服器主機,需支援容器部署環境:
        1.  安裝 Nginx 反向代理伺服器 跟 Navidrome 串流伺服器。
        2.  音樂資料庫存放的檔案伺服器
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)
C.  Synology NAS (192.168.20.2 /volume1/music):約1200張專輯,500GB資料庫

註:可以將 Nginx 反代跟 Navidrome 都部署在 NAS 上,架構比較簡潔,因為我不喜歡執
    行伺服器放在 NAS 上所以這裡的範例採用比較複雜的架構。如果要集中放 NAS 上設
    定會簡單很多,Navidrome 容器設定應該大同小異,DSM 也有內建簡單的反代,可自
    己嘗試。


* * *

## 安裝步驟

**環境:Ubuntu Linux Server 22.04 LTS**
**以下步驟假設讀者對 Linux/Docker 有基本操作經驗**


### A.購買網域:

此處不贅述,網路上有教學


### B. 安裝 ddclient 以網域供應商 API 更新 DNS 紀錄:

此處不贅述,網路上有教學


### C. 用 certbot 向 Let's Encrypt 取得網域憑證:

此處不贅述,網路上有教學


### 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
```

```bash
# 編輯 fstab 文件啟用自動掛載
sudo nano /etc/fstab
```

```bash
# 在 /etc/fstab 中填入
192.168.20.2:/volume1/music  /mnt/navidrome_music  nfs  nfsvers=4.1,_netdev
0  0
```

```bash
# 手動掛載
sudo mount /mnt/navidrome_music
```


### F. 在 Linux server 部署 Navidrome (docker 容器)

```bash
# 建立容器部署資料夾
sudo mkdir /opt/navidrome
```

```bash
# 建立專門運行容器的系統使用者,docker-user:不能登入,只給系統服務使用,不需設
定密碼
sudo useradd -r docker-user
```

```bash
# 將主要使用者加入 docker-user 群組,以便之後能夠讀寫 docker-user 寫入的檔案
sudo usermod -a -G docker-user $USER
```

```bash
# 確認使用者的 uid 和 gid
id docker-user
id $USER
```

    - 假設 docker-user 這個使用者 uid:gid=998:998
    - 而主要使用者是預設值 uid:gid=1000:1000


```bash
# 調整資料夾擁有權和適當權限
# 1000:998 分別是主要使用者與 docker-user 群組的 uid/gid,請依自己環境調整
sudo chown 1000:998 /opt/navidrome
chmod 750 /opt/navidrome
```

```bash
# 進入部署資料夾內
cd /opt/navidrome
```

```bash
# 建立資料夾存放 navidrome 設定檔案,並給予適當權限
mkdir navidrome_data
chown 1000:998 navidrome_data
chmod 750 navidrome_data
```

```bash
# 編輯 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:
      - "127.0.0.1:4533:4533"        # 只綁定到 localhost,不需開防火牆
    environment:
      - ND_LOGLEVEL=info
      - ND_BASEURL=https://nd.domain.com
      - ND_SCANNER_SCHEDULE=@every 12h
      - ND_ENABLESHARING=true
    volumes:
      - /mnt/navidrome_music:/music:ro
      - ./navidrome_data:/data
    networks:
      - navidrome_net

networks:
  navidrome_net:
    driver: bridge
```

```bash
# 檢查語法錯誤
docker compose config
```

```bash
# 建立容器
docker compose up -d
```

```bash
# 查看 logs 是否有錯誤
docker compose logs
```


### G. 設定 Nginx reverse proxy

Nginx 安裝就不贅述,可以考慮使用容器部署整合 docker compose

```nginx
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_ciphers
ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options nosniff always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Content-Security-Policy "default-src 'self'; script-src 'self'
'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src
'self' data: blob:; media-src 'self' blob:; connect-src 'self'; font-src
'self'; worker-src 'self' blob:;" always;

    client_max_body_size 200M;

    proxy_buffering on;
    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;

    proxy_connect_timeout 60s;
    proxy_send_timeout 60s;
    proxy_read_timeout 300s;

    access_log /var/log/nginx/navidrome_access.log;
    error_log /var/log/nginx/navidrome_error.log;

    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;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_cache_bypass $http_upgrade;
    }

    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        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;

        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    location ~* \.(mp3|flac|m4a|ogg|wav|aac)$ {
        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;

        #一般頁面走快取,音樂串流則關閉快取
        proxy_buffering off;
        add_header Accept-Ranges bytes;
    }
}
```


### H. Navidrome 初次設定

部署完畢後就能利用 https://nd.domain.com 進入 Navidrome 網頁介面
如果在內網環境需要用 DNS 改寫或是 NAT hairpin 使用 url 進入介面
第一次進入需要創建 admin 帳號密碼


### I. Feishin + Mpv 獨佔播放

1.  Feishin 下載:https://github.com/jeffvli/feishin/releases
Releases ·  jeffvli/feishin ·  GitHub
A modern self-hosted music player. Contribute to jeffvli/feishin development by creating an account on GitHub. ...

 
2.  Mpv 下載:https://mpv.io/installation/ 選 shinchiro (git)

 
    1.  目前 windows 可選版本: mpv-x86_64-20250908-git-77dee9b.7z (此為撰文時
        的最新版本,請至官方下載頁確認最新版本)

下載後解壓縮,進到 mpv.exe 所在的資料夾


#### 測試 mpv 命令

在 Mpv 資料夾內右鍵選單開啟 Windows 終端(powershell),執行以下命令測試是否可


註:如果終端是 CMD 直接用 mpv 做為命令即可

```
.\mpv
```


#### 列出音訊設備

```
.\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))
```


#### Feishin 播放設定

https://meee.com.tw/uUkZjk4.jpg
[圖]

1.  指定 mpv.exe 路徑

2.  Mpv 參數:
https://mpv.io/manual/stable/#audio

 
--ao=<driver>:指定輸出的音訊模式(WASAPI)
--audio-device=<name>:指定音訊設備

註1:如果不介意播放時獨佔聲音,參數可留空,mpv 會自動以系統預設播放設備播放
註2:目前嘗試沒辦法單純透過 Mpv 參數啟用獨佔輸出,要用 Feishin 自己的獨佔輸出設
     定

舉例:如果我想以上述條列出的音訊設備 "PureAudio Lotus DAC5" 作為播放端,參數填
      入
--ao=wasapi
--audio-device=wasapi/{e0c575aa-f646-4281-91b3-79cec07d60e5}


* * *

## 總結與心得

1.  Navidrome 伺服器與客戶端軟體的搭配,UI 操作非常流暢,在 mobile 端體驗接近
    Spotify 等商業軟體,不會有載入卡頓等問題。

2.  PC 客戶端可以免安裝,不用 VPN 就能連到自己的資料庫,也支援 bit perfect 播
    放,非常適合那些想要在公司堆放昂貴設備並且有時間偷懶的玩家。

3.  不能支持 ASIO 或是調整 WASAPI 細項有時候還是蠻麻煩的,畢竟像我會丟去辦公室
    用的東西都是古物,對於 WASAPI event 支援度不好。

4.  Navidrome 可以創建智慧播放清單,但需要額外寫 conf 手動放入指定資料夾,詳情
    可以參考官方文件。

5.  其他幾個遠端開源串流方案的優缺點分析

**foobar2000 使用 webdav 抓取遠端資料庫 (不需 VPN)**
這是個兼顧管理和外網串流可行方案,但 webdav 在 foobar 有一些小問題,比如封面顯
示和資料庫抓取的速度沒那麼快,不利大型資料庫。

**foobar2000 使用 SMB 或 Upnp 伺服器 (需要 VPN)**
需要 VPN,多個步驟,且比較需要遠端安裝環境配合,外網桌面端不一定能使用 VPN
(公司環境)

**foobar2000 使用 foo_subsonic 插件串接 navidrome 資料庫 (不需 VPN)**
我覺得這是最全面的開源外網串流兼管理的解決方案,但 foo_subsonic 插件已經停止維
護。

**foobar2000 使用 webdav 抓取 Nextcloud 音訊檔案 (不需 VPN)**
原則可行,但應該沒人想碰含有大型音樂資料庫的 Nextcloud 資料維護。
Nextcloud 的維護真的很血尿。

**Jellyfin / Emby / Plex**
這類軟體 UI 設計比較偏向綜合影音而非純發燒友取向

--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.242.31.247 (臺灣)
※ 作者: ultimatevic 2025-09-14 20:01:40
※ 文章代碼(AID): #1engwkwl (Headphone)
※ 文章網址: https://www.ptt.cc/bbs/Headphone/M.1757851310.A.EAF.html
breadf: 古物讓他入土為安吧1F 09/14 20:18
壓榨到最後一刻 XD
raidcrash: 安卓推薦Symfonium 算是用起來最舒服的客戶端了
智慧型播放清單可以用Feishin創建跟編輯 比較簡單點2F 09/14 20:50
原來 Feishin 可以建,還沒玩到這一塊,感謝
raidcrash: 最近在玩AudioMuse-AI Plex/Subsonic版本的Sonic Analysis 挺有趣的 有興趣可以玩玩
更正 *Jellyfin/Subsonic
https://github.com/NeptuneHub/AudioMuse-AI4F 09/14 20:55
GitHub - NeptuneHub/AudioMuse-AI: AudioMuse-AI leverages Librosa and TensorFlow for sonic analysis, powering similar song discovery and smart playlists within Jellyfin and Navidrome API. AudioMuse-AI leverages Librosa and TensorFlow for sonic analysis, powering similar song discovery and smart playlists within Jellyfin and Navidrome AP ...

 
這個很酷!又有東西可以玩!
whydan: 龜~~神~~8F 09/14 21:24
這很好玩欸 壞蛋大要不要來開一個
comipa: 推教學文!9F 09/15 08:07
tritonCKL: 推教學,目前是用gonic搭配feishin(pc), Symfonium(安卓), airsonic-refix(web), gonic有支援資料夾瀏覽蠻符合我需求的xD10F 09/15 09:29
感謝推薦,我先 starred/watch 起來
Pixmi: 推教學文,之前我是NAS架設Volumio串流,後來是AM簡單聽了13F 09/15 10:31
Volumio 應該也能做外網串流,但需要訂閱 premium 的樣子。
以前用過一陣子但覺得 Volumio 的 UI 流暢度不佳就沒繼續用了。
※ 編輯: ultimatevic (111.242.31.247 臺灣), 09/15/2025 11:28:44
※ 編輯: ultimatevic (111.242.31.247 臺灣), 09/15/2025 11:35:34
lll156k1529: 純推不下14F 09/15 12:56

--
作者 ultimatevic 的最新發文:
點此顯示更多發文記錄