Navidrome 完整教學 2026:24K 星開源音樂串流伺服器,用自己的歌庫取代 Spotify(Docker 部署、權限陷阱、中文標籤亂碼修正、手機 App 選型與 Jellyfin API 一次學會)

Navidrome 是 GitHub 上 24,165 stars(GPL-3.0,Go 撰寫)的開源音樂串流伺服器,把你硬碟裡的 MP3/FLAC/Opus 變成一個自己的 Spotify:瀏覽器、手機、CarPlay、Sonos 都能聽,支援多使用者、多音樂庫、智慧播放清單、歌曲分享連結,最新版 v0.64.2(2026/9/24)。本文從零開始:可直接複製的 docker-compose.yml、實際會遇到的權限錯誤訊息對照表(PUID/PGID 根本沒用)、navidrome.toml 與 ND_ 環境變數、中文與日文標籤亂碼的修正做法、102 個相容 App 的選型表、掃描與備份 CLI、Jellyfin API(0.64 新功能)與 AudioMuse-AI 本機 AI 相似歌曲。

  • Dennis
  • 13 分鐘閱讀
Navidrome 完整教學 2026:24K 星開源音樂串流伺服器,用自己的歌庫取代 Spotify(Docker 部署、權限陷阱、中文標籤亂碼修正、手機 App 選型與 Jellyfin API 一次學會)

Navidrome 是免費開源的音樂串流伺服器:把你硬碟裡的 MP3、FLAC、Opus 變成一個自己的 Spotify,瀏覽器、手機、CarPlay 與 Sonos 都能播,多使用者、多音樂庫、分享連結與智慧播放清單全部免費。2026 年 9 月的最新穩定版是 v0.64.2。

為什麼 2026 年還值得自架一套音樂伺服器?

理由和自架影音庫很像,但音樂這一塊在 2026 年多了一個新變數。第一,你的歌庫不會被平台下架或改版;串流平台的目錄、推薦與廣告策略一直在動,自己那份 FLAC 永遠在。第二,AI 音樂正在稀釋「人做的音樂」:Deezer 每日收到近 9 萬首全 AI 生成曲目、佔每日上傳量超過五成,平台端開始加標籤、做過濾,但對「只想聽自己選的歌」的人來說,最徹底的過濾方式就是自己養一份歌庫(背景見文末延伸閱讀)。第三,冷門音樂只有自架找得到:獨立樂團的現場盤、自己轉的黑膠、買不到的數位單曲,平台沒有就是沒有。

項目Navidrome(自架)SpotifyApple MusicYouTube Music
收費模式開源免費,成本=硬體+硬碟電費月訂閱月訂閱月訂閱
音源你自己的檔案(MP3/FLAC/ALAC/Opus/AAC 幾乎全吃)平台曲庫平台曲庫平台曲庫
離線播放由 App 下載,容量自己決定有(限裝置數)有有
冷門/已下架曲目有,只要你有檔案常常找不到常常找不到常常找不到
多使用者有(各自獨立播放次數、清單、最愛)家庭方案家庭方案家庭方案
音樂 AI 推薦需自行加裝(AudioMuse-AI 外掛)平台演算法平台演算法平台演算法
手機 App102 個相容 App 可選(見下文)官方 App官方 App官方 App
維護成本要自己顧 Docker、備份、憑證幾乎為零幾乎為零幾乎為零

用法建議很直白:主力聽串流、自架庫當「保底與冷門盤」,兩者並存最舒服。Navidrome 一個人維護、一台舊筆電或 NAS 就跑得動。

項目內容
定位網頁版音樂收藏伺服器與串流器,README 自稱「your personal Spotify」
語言/授權Go 撰寫/GPL-3.0
GitHub 星數24,165 stars、1,757 forks(2026/10/14 查證)
首次釋出2016/2/24(已十年)
最新版本v0.64.2(2026/9/24 發布,bug fix 版)
相容協定Subsonic/Madsonic/Airsonic API+OpenSubsonic 擴充
官方客戶端生態官網 Apps 頁列 102 個相容 App
介面語言已翻譯 34 種語言(含繁體中文)
平台Linux/macOS/Windows、Docker(amd64/arm64/armv6/armv7)、官方 Raspberry Pi 執行檔

核心特色:極低資源占用(文件明寫連 Raspberry Pi Zero 都能跑)、大歌庫處理、自動監看資料夾匯入新檔與更新標籤、每位使用者獨立的播放次數/清單/最愛、多音樂庫與個別存取權限、轉碼(per user/player,支援 Opus 編碼)、歌詞(外掛字幕檔 .lrc/.srt/.ttml/.txt 與內嵌標籤)、智慧/動態播放清單(Beta)、分享公開連結、Scrobbling(Last.fm/ListenBrainz/Maloja)、外部驗證整合、Jukebox 模式(用伺服器接的音效裝置播放)、外掛系統。

用 Docker 部署:可直接複製的 docker-compose.yml

官方映像檔是 deluan/navidrome。這份設定是從官方文件改寫的最小可運作版本:

services:
  navidrome:
    image: deluan/navidrome:latest
    container_name: navidrome
    user: "1000:1000"      # 必須同時擁有 data 目錄寫入權與 music 目錄讀取權
    ports:
      - "4533:4533"
    restart: unless-stopped
    environment:
      # 以下都可省略,範例值就是預設值
      ND_LOGLEVEL: info
      ND_SCANSCHEDULE: "@every 24h"
      ND_ENABLEINSIGHTSCOLLECTOR: "false"   # 關掉匿名統計回傳
    volumes:
      - "/srv/navidrome/data:/data"         # 資料庫、快取、外掛(可寫)
      - "/srv/music:/music:ro"              # 音樂庫(唯讀即可)
mkdir -p /srv/navidrome/data
sudo chown -R 1000:1000 /srv/navidrome/data     # 換成你自己的 uid:gid
docker compose up -d
docker compose logs -f navidrome

啟動後開 http://<主機IP>:4533,第一次登入會要你建立管理員帳號(預設帳密 admin/admin,務必立刻改掉)。

內網先用就好:Navidrome 內建帳號系統沒有 2FA,直接曝露到公網風險很高。要外網存取請走反向代理+HTTPS,或直接用 Tailscale/WireGuard 這類 VPN 打進內網。

權限陷阱:實際會看到的錯誤訊息對照表

新手卡關 90% 都在這裡。兩個掛載目錄的失敗方式不一樣,看 log 就能判斷哪一個錯:

症狀/log 訊息原因解法
Error applying PRAGMA optimize / unable to open database file / 啟動即 panic 退出/data 不可寫mkdir -p 後 chown -R $(id -u):$(id -g) 給它
網頁正常但音樂庫永遠是空的;Error starting watcher ... permission denied、Scanner: Target folder does not exist容器使用者讀不到 /musicchown -R 換擁有者,或 chmod -R a+rX /srv/music
想用 PUID/PGID 控制權限但沒反應那組變數是 linuxserver.io 的慣例,Navidrome 映像檔直接忽略改用 compose 的 user: 指令
拿掉 user: 之後錯誤全消失容器變成 root 在跑,什麼都寫得進去不要這樣做,回去修資料夾權限

補充兩個實務細節:/music 掛成 :ro(唯讀)完全沒問題,Navidrome 只需要讀;多音樂庫的進階用法則是為每個庫再掛額外的磁碟區。

反向代理與 BaseUrl:/music 或子網域都能走

放在 Nginx/Caddy/Cloudflare Tunnel 後面時,記得設定 BaseUrl,否則分享連結與 Jellyfin API 路徑會組錯:

# /srv/navidrome/data/navidrome.toml
BaseUrl = "https://music.example.com"
Port = 4533
  • 走子網域:BaseUrl = "https://music.example.com"
  • 走子路徑:BaseUrl = "/music"
  • 分享連結格式是 http://yourserver.com/share/XXXXXXXXXX,反向代理要放行 /share;用子路徑時記得把 /music 前綴一起轉發。

設定方式:環境變數、設定檔、命令列三選一

官方規則:任何設定選項都能用環境變數設定,只要加上 ND_ 前綴並全大寫,例如 ND_LOGLEVEL=debug。優先順序(高到低)是環境變數 → 命令列參數 → 設定檔。Docker 使用者若想要設定檔,把 navidrome.toml 放進對應到 /data 的資料夾,Navidrome 會自動讀取;也能用 ND_CONFIGFILE=/data/navidrome.toml 指定路徑,或 -c/--configfile 帶入(支援 toml/json/yml/ini)。

# 常用選項範例(/data/navidrome.toml)
LogLevel = 'info'
MusicFolder = '/music'
Scanner.Schedule = '@every 24h'      # cron 或 @every 語法
TranscodingCacheSize = '150MiB'
Agents = 'deezer,lastfm,listenbrainz'  # 藝人簡介/圖片的資料來源與優先序
EnableSharing = true
DefaultShareExpiration = '8760h'       # 分享連結預設 1 年到期
環境變數用途預設
ND_MUSICFOLDER音樂庫路徑(可唯讀;多音樂庫時作為預設庫)./music
ND_DATAFOLDER資料庫與快取所在./data
ND_CACHEFOLDER轉碼與圖片快取<DataFolder>/cache
ND_PORT / ND_ADDRESSHTTP 埠(4533)/綁定位址0.0.0.0、::
ND_BASEURL反向代理用的基底網址空
ND_LOGLEVELerror/warn/info/debug/traceinfo
ND_SCANSCHEDULE掃描排程(cron 或 @every)@every 24h
ND_TRANSCODINGCACHESIZE轉碼快取上限150MiB
ND_ENABLESHARING對外分享連結開關true
ND_AGENTS藝人資訊來源順序deezer,lastfm,listenbrainz
ND_ENABLEINSIGHTSCOLLECTOR匿名使用統計回傳true

中文/日文標籤亂碼怎麼修(台灣使用者最常踩的坑)

Navidrome 完全依照檔案內的 metadata 標籤來組織音樂,不看資料夾名稱、也不看檔名。 這件事的實際後果是:你的 Music/周杰倫/范特西/01 - 愛在西元前.flac 檔名再漂亮,只要標籤是空的或亂碼,介面上就會顯示亂碼或變成「Unknown Artist」。

最少要填的欄位:Title、Artist、Album、Album Artist、Track Number;選填 Genre、Year/Date、Disc Number。其中 Album Artist 是專輯不被拆散的唯一關鍵——同專輯所有曲目必須一致;合輯則統一填「Various Artists」,並把 Compilation 標記設為 1(MP3/ID3 是 TCMP=1,FLAC/Vorbis 是 COMPILATION=1)。

亂碼的三種成因與修法

成因症狀解法
舊 CD 轉檔或對岸來源寫入 Big5/GBK 編碼的 ID3v2.3 標籤中文變成一串「燙燙」或問號用 Mp3tag(Windows)或 MusicBrainz Picard 重新以 UTF-8/ID3v2.4 寫入標籤
ID3v1 與 ID3v2 標籤並存且內容不一致同一首歌在不同 App 顯示不同名字兩個都對齊,或直接移除 ID3v1
日文曲目用了 Shift-JIS 且無 UTF-8 標籤日文漢字/假名亂碼、專輯被拆成兩張以 Picard/beets 批次重寫;beets 可用 beet write 統一寫回

批量處理的實務流程是:先用 Picard 依 MusicBrainz 指紋比對(一次修正整張專輯的曲序與標籤),剩下查不到的再由 beets 或 Mp3tag 手動補。改完標籤後回 Navidrome 按一次重新掃描即可,資料庫會更新;Navidrome 也會自動監看資料夾變化。若某些檔案永遠不該入庫(例如練團用的母帶、sample 庫),可在資料夾放 .ndignore 排除。

標籤整理是一次性投資:整理乾淨之後,未來就算換到別的音樂伺服器(Jellyfin、Plex、Emby)或播放軟體,整份歌庫都能無痛搬過去。

掃描、備份與診斷:CLI 就夠用

Navidrome 內建 CLI,常見指令如下(Docker 就在 docker compose exec navidrome navidrome <指令>):

navidrome scan                 # 手動觸發掃描(會顯示新增/更新曲目數)
navidrome backup               # 備份資料庫與設定
navidrome doctor               # 環境自我檢查
navidrome inspect <path>       # 檢查單一檔案被解析出的標籤
navidrome missing              # 找出資料庫裡對應不到檔案的曲目
navidrome user list            # 使用者管理
navidrome pls ...              # 播放清單相關操作
navidrome service ...          # 背景服務管理

備份鐵則:真正要備份的是 /data(資料庫與設定),不是音樂檔本身——音樂檔的備份屬於另一個題目。navidrome backup 之外,直接把 /data 目錄定期打包/同步即可;資料庫是 SQLite,備份時要先停容器或用內建 backup,硬拷正在寫入的 SQLite 檔可能拿到不一致的內容。

手機與桌面 App 怎麼挑(102 個相容 App 的選型法)

只要支援 Subsonic/OpenSubsonic API,任何 App 都能連上 Navidrome。官方 Apps 頁目前列出 102 個,實際挑選建議按平台與需求:

平台推薦 App亮點
AndroidSymfonium(付費)、Substreamer、Chora、CapAudioSymfonium 功能最完整;Chora 支援 Android Auto;CapAudio 有裝置端 AI 播放清單
iOS/macOSAmperfy(開源)、Arpeggi、AmpSonic、Cassette、CadenceAmperfy 支援 CarPlay、離線、ReplayGain;Arpeggi/AmpSonic 走 SwiftUI 原生體感
桌面Feishin、Aonsoku(Electron)、Aura(Rust)Feishin 同時支援 Navidrome 與 Jellyfin;Aura 記憶體占用極小
網頁/PWA內建 Web UI、Airdrome、Airsonic Refix不想裝 App 時最省事
音響整合bonob(Sonos SMAPI)讓 Sonos 喇叭直接吃自架歌庫
Jellyfin 生態Finamp、Jellify透過 Navidrome 的 Jellyfin API 連線(見下文)

連線設定都一樣:伺服器位址(外網就用你的 HTTPS 網址)、帳號密碼、可選是否轉碼。每位連上的裝置會在 Settings > Players 出現一筆播放器設定,你可以在那裡替個別裝置指定轉碼格式(例如手機在外用 Opus 降流量、家中 WiFi 直出 FLAC)。

轉碼怎麼想

Navidrome 能即時轉碼,而且是按使用者/播放器設定。原則:內網有頻寬就別轉(保留原始無損),外網或行動網路再轉(Opus 是官方支援的編碼,流量效率好)。轉碼需要 FFmpeg,Docker 映像檔已內含;自行安裝執行檔時要設定 FFmpegPath。轉碼快取預設上限 150MiB,大量轉碼的站台可以再調高。

進階玩法:分享、Scrobbling、多音樂庫、智慧播放清單

  • 分享連結:任何曲目/專輯/藝人/播放清單都能產生 http://yourserver.com/share/XXXX 的公開連結,對方不用有帳號就能聽或下載。每個使用者只看得到自己建立的分享,管理員可管理全部;預設 1 年到期,可用 DefaultShareExpiration 調整。不想讓使用者對外開連結就關掉 ND_ENABLESHARING——這是一個全站總開關,沒有 per-user 設定。
  • Scrobbling:支援 Last.fm、ListenBrainz,也能透過自訂 ListenBrainz URL 走 Maloja。
  • 多音樂庫:可掛多個音樂資料夾,並用個別使用者的存取權限區隔(例如家人庫與自己的庫分開)。
  • 智慧/動態播放清單(Beta):類似 iTunes 的條件式清單;另支援自動匯入並同步 .m3u 檔。
  • Jukebox 模式:伺服器接著 DAC 或音響時,可用手機當遙控器叫伺服器自己播。
  • 外掛系統:<DataFolder>/plugins 放外掛,Plugins.AutoReload 開啟後可自動載入。

兩個 0.64 之後才有的新東西

1. Jellyfin API(實驗性):讓 Jellyfin 音樂 App 直接連 Navidrome

從 0.64.0 起,Navidrome 能回應一部分 Jellyfin API,所以為 Jellyfin 寫的音樂 App 可以連上 Navidrome——你不需要架 Jellyfin。它預設關閉:

environment:
  ND_JELLYFIN_ENABLED: "true"
  # 想讓客戶端自動搜尋到伺服器再加這行:
  ND_JELLYFIN_AUTODISCOVERY: "true"

啟用後 API 在 /jellyfin 路徑(例:http://192.168.1.10:4533/jellyfin;有 BaseUrl 時是 https://example.com/music/jellyfin)。客戶端就填這個網址+Navidrome 帳密。官方測試過的 App 是 Finamp、Jellify、Feishin;影片、Live TV 與 Jellyfin 管理後台不在支援範圍。自動搜尋走 UDP 7359,Docker 預設 bridge 網路收不到廣播,必須用 network_mode: host(此時 ports: 會被忽略,直接用主機的 4533/7359)。

2. AudioMuse-AI:本機音訊分析做出「Instant Mix」

外部 metadata 代理(Deezer/Last.fm)靠的是別人的資料庫,冷門與未發行作品常常查不到。AudioMuse-AI 是自架服務,直接分析你檔案裡的節奏、音色、能量等聲音特徵,找出「聽起來相似」的歌,透過 AudioMuse-AI-NV-plugin 外掛接進 Navidrome。裝好之後你會得到:

  • Instant Mix:在 Web UI 對任一首歌點右鍵就能生出相似歌曲佇列;
  • 相似歌曲/相似藝人:在 Symfonium、Feishin、Substreamer 等 App 裡透過標準 getSimilarSongs 端點直接生效;
  • OpenSubsonic sonicSimilarity 擴充:提供 getSonicSimilarTracks(附相似分數)與 findSonicPath(指定起訖歌,串出一條逐步過渡的播放路徑)。

安裝流程簡述:跑起 AudioMuse-AI 核心服務並在 Setup Wizard 設一組 API token → 到外掛頁下載最新 audiomuseai.ndp → 丟進 <DataFolder>/plugins → 重啟 Navidrome(或開 Plugins.AutoReload 讓它自動載入)→ 在 Settings > Plugins 啟用外掛,填 API URL(例如 http://192.168.1.50:8000,不能用 localhost,要用容器實際連得到的位址)與同一組 token。除錯口訣:401 Unauthorized 是 token 不一致;AudioMuse 端完全沒有請求進來就是 URL/網路不通;結果很爛通常只是分析還沒跑完。

常見問題排查速查

症狀檢查順序
網頁打不開docker compose logs 有沒有 panic → ND_PORT 是否被占用 → 防火牆
音樂庫空白/music 權限(見前表)→ ND_MUSICFOLDER 路徑 → 標籤是否全空
專輯被拆成好幾張Album Artist 不一致(最常見)→ 合輯缺 Compilation 標記 → 多片裝 Disc Number 沒填
掃描卡住/UI 凍結0.64.0 在慢速儲存(USB 硬碟、網路磁碟)曾有 database is locked 問題,升到 v0.64.2 已修(掃描期間暫停封面處理、ANALYZE 不再長時間持有寫鎖)
手機 App 連不上先確認內網 IP 能連 → 再測外網 HTTPS/VPN → 檢查 BaseUrl 是否正確
分享連結在聊天軟體沒預覽反向代理要放行 /share,並保留 meta-tags
想省資源關掉 EnableInsightsCollector、降低掃描頻率、內網不要轉碼

結語

Navidrome 最漂亮的設計是它「什麼都不做太多」:不幫你下載音樂、不做音樂目錄,只管好你已經擁有的一切——用一個 24K 星的 Go 服務、24MB 級別的記憶體占用,把你那份歌庫變成全家可用的串流服務。部署大約 10 分鐘,真正花時間的是把標籤整理乾淨;而那份整理過的中文/日文標籤,會一路陪你換過下一個十年的播放工具。

如果你正在建立自己的自架全家桶,建議搭配閱讀:照片交給 Immich、影片交給 Jellyfin、檔案同步交給 Syncthing,四件事湊齊就是一套沒有訂閱費的個人雲。


站內延伸閱讀

原始來源

版本與數據查證時間:2026-10-14(stars/forks 取自 GitHub API,最新版本 v0.64.2 發布於 2026-09-24)。Jellyfin API 為實驗性功能,不同客戶端可能仍會打到 Navidrome 尚未實作的請求。

📬 訂閱 most.tw 電子報

每週精選 AI 工具教學與技術乾貨,直接送到你的信箱。免費、隨時可退訂。

訂閱即表示同意收到 most.tw 電子報,隨時可一鍵退訂。

💬 有問題想討論?加 LINE 聯絡我

歡迎透過 LINE 官方帳號直接留言,我會盡快回覆你的問題。

加入 LINE 好友