新手自建 Docker 伺服器 - (5) 建立自己的音樂串流服務 Navidrome

把CD變成串流!

這一系列文章,是我自己完成 Docker Server 建立的經歷以及過程,包含以下章節內容:

  1. 新手自建 Docker 伺服器 - (0) 簡介與架構說明
  2. 新手自建 Docker 伺服器 - (1) Ubuntu 主機建立 docker 服務
  3. 新手自建 Docker 伺服器 - (2) 建立 Nginx 代理伺服器
  4. 新手自建 Docker 伺服器 - (3) 建立應用,以靜態網頁為例
  5. 新手自建 Docker 伺服器 - (4) 建立 Joplin 筆記軟體
  6. 新手自建 Docker 伺服器 - (5) 建立自己的音樂串流服務 Navidrome

自建 Docker 伺服器 - (5) 建立自己的音樂串流服務 Navidrome

終於來到最後一篇了,這一篇要去介紹我使用了 Docker 之後,最常使用的系統,也就是把自己的音樂變成串流伺服器的服務 Navidrome

為什麼要做音樂串流呢

七年級尾端出生,人生的第一張專輯是國中時買的周杰倫專輯 - 十一月的蕭邦,當時每天睡前都會將整張專輯聽過一遍,上課時也會看歌詞本來背歌詞(國中時期把周杰倫歌詞背起來是很屌的事情)。可能是因為國中以前都沒有聽音樂的習慣,因次當擁有自己的音樂專輯後也特別珍惜,也培養出了每次收到專輯後,都要從第一首開始聽到結束,總覺得要跟著順序聽完一整張才會了解製作人的目的。

時光飛逝,長大之後也同樣訂閱了如 Spotify 的串流服務,然而即使現在 99% 的聆聽習慣已在串流上,還是覺得擁有一個檔案在電腦內,才是真正擁有這首歌曲的方式,也因此我還是會繼續買 CD,或是在 iTunes、Bandcamp、HDTrack 上買數位音樂,是一種自己擁有音樂資料庫以及品味的所在。

而問題就出現了,在 2025 年的現在,我的聆聽場所、設備都與以前不同,我不可能在移動設備內包含如手機、工作電腦裝下我所有的音樂,因此情況就變成了:

  1. 我購買的音樂只能放在家裡的 Mac 裡面(貪圖 Itunes 管理),要聽就只能回家聽
  2. 平常還是聽 Spotify、Youtube 的音樂

有解決方案嗎?問就是 Roon,但是…

如果去尋找自建 Music Server,一定會找到 Roon 這套解決方案,他可以完美的解決自己手邊的音樂資料庫與串流並存,並且在各種終端設備上並存的問題,而我自己在前幾年有試過,也動過乾脆刷下去買終身會員的想法,但評估之後有幾個考量:

  1. 我並沒有大量訂閱串流的整合需求,基本上只有 Spotify
  2. Roon 有點肥,Server 端滿吃資源的
  3. 費用 $500 美元以上,覺得只是找自建串流服務這使用費偏高,更不想訂閱

秉持著網路開源以及虛擬化的精神,其實也很快的找到了解決方案,最早看到比較多的討論是 Jellyfin,很多 NAS 玩家使用這套 Solution 建立影音伺服器,而我在比較之後選了 Navidrome 這套解決方案,他最主要的目的就是 將你的因為檔案透過串流在你的各種設備聆聽,而我挑選的原因為以下:

  1. 與 Jellyfin 相比而言專注在音樂串流
  2. 可以接 Spotify API,撈取專輯資料
  3. 可以自己設定不同聆聽設備的轉檔邏輯,例如我 Mac 都不轉用轉檔(AIFF 直接聽),Windows 設備會統一轉為 FLAC

歡迎大家到 Navidrome 的 官方網站查看資料,或者可以直接看他的 Demo site來感受使用方式

# Navidrome Demo Site 帳號密碼
User: demo
Password: demo

navidrome

步驟零:User Story

與其說我是要 安裝完成 Navidrome,不如說我想要的是 增進我的音樂體驗,因此先列出我的幾個需求點

我可以:

  • 把我的把我的 CD 與購買音樂存放進資料庫內,自動幫我做好整理
  • 我可以在我的各別設備上聆聽我的音樂
    • 公司的 Mac
    • iphone 手機
    • Windows 串 DAC 用 HD700 耳機聽(foobar2000)

那這裡先直接放上我最後完成的架構圖來說明,這是透過 Plantuml 來畫的,所以排版可能沒有很好看XD

  
@startuml
skinparam actorStyle awesome
actor "HD700" as hd700
actor "公司Mac" as mac
actor "iPhone" as iphone
cloud "https:navidrome.domain" as domain
Node "CD RIP 之後" as cd
Node "DAC U4" as dac
Node "Bandcamp, HDTrack 買的音樂" as buymusic
rectangle "Windows 電腦" as win {
  folder winfolder [
    \\1.1.1.1\shared_folder
    ----
    從 Server
    Mount 過來的
    ]
  usecase "Foobar2000" as foo
}
rectangle "My Ubuntu Server" as server {
  package Docker {
    usecase "Navidrome" as navi
    usecase "Samba" as smb
    usecase "Nginx" as ng
  }
    folder musicfolder [
    /home/yoyo/music
    ----
    真正的 music 資料夾
    ]
}
cd ..> winfolder
buymusic ..> winfolder
foo -> winfolder : 掃描抓資料
foo --> dac : Foobar2000上設定專用聽音樂
musicfolder <->  winfolder : 經由Samba實現同步
smb --> musicfolder : 把資料夾分享給區網
navi --> musicfolder : 建立串流服務
ng .> domain : 設定轉發 navidrome 服務
domain --> iphone : 用Amperfy聽
domain --> mac : 用Feishin聽
dac -> hd700
@enduml

  

這個架構下的重點在於:

  1. 音樂檔案只存放在 Server 內的 /home/yoyo/music 資料夾內
  2. 透過 Navidrome 來作為主要的音樂服務
  3. 用 Samba 服務來使 Windows 電腦掛載 /home/yoyo/music 資料夾,
  4. 要在外面(非區網,例如公司)使用,可以用我之前寫的 Nginx 代理伺服器方法方法,或者其他內網穿透方案

步驟一:在 Server 端用 Docker 建立 Samba 服務

因為對我來說 Samba 是輔助 Navidrome 的方式,並不是同一個依賴,因此我會分開 docker compose,我們先從 Samba 開始

建立 docker 資料夾與 docker compose

mkdir samba
cd samba
#建立docker compose
nano docker-compose.yml

填入以下,講解就直接放裡面了喔

services:
  samba:
    image: dperson/samba:latest
    container_name: samba_server #container 的名字
    environment:
      - TZ=Asia/Taipei
    ports:
      - "137:137/udp" #這是為了給予 Samba 被服務所需要的權限
      - "138:138/udp"
      - "139:139/tcp"
      - "445:445/tcp"
    volumes:
      - /home/yoyo/music:/shared_folder #把 server 內的 /home/yoyo/music 資料夾掛載給 samba 的 shared folder
    restart: unless-stopped
    command: > #創建一個 Samba 用戶,格式為 用戶名;密碼。這裡用戶名是 yoyo,密碼是 password,其他慢慢了解就好
      -p
      -u "yoyo;password" 
      -s "shared_folder;/shared_folder;yes;no;yes;all;yoyo;yoyo;Windows Share"
      -g "client min protocol=SMB2"
      -g "client max protocol=SMB3"
      -g "map to guest=Bad User"
      -g "log level=1"
    networks:
      - net
networks:
  net:
    external: true

完成 docker compose 後,接著透過指令部署。

docker compose up -d

啟用之後可以到你的 Windows 電腦,在資料夾路徑輸入

\\1.1.1.1\shared_folder #要用你 server 的 ip

如果有成功在 Windows 上看到 server 被分享的資料夾,就成功了,此時你可以先把你的音樂檔案移動進去。使用 Samba 的目的是讓 Linux Server 的資料夾可以被 Windows 電腦掛載,來實現

  1. 透過 Windows 管理音樂檔案
  2. 在 Windows 上用 Foobar2000 播放音樂檔案

步驟二:在 Server 端用 Docker 建立 Navidrome 服務

建立 docker 資料夾與 docker compose

mkdir navidrome
cd navidrome
#建立docker compose
nano docker-compose.yml

填入內容

services:
  navidrome:
    image: deluan/navidrome:latest
    container_name: navidrome
    user: 1000:1000
    ports:
      - "4533:4533"
    restart: unless-stopped
    environment:
      # 設定檔維持預設,若要調整請參閱:https://www.navidrome.org/docs/usage/configuration-options/
      ND_SCANSCHEDULE: 1h
      ND_LOGLEVEL: info
      ND_SESSIONTIMEOUT: 24h
      ND_BASEURL: ""
      ND_ENABLETRANSCODINGCONFIG: true
      VIRTUAL_HOST: yourdomain.com  #nginx 內網穿透使用
      LETSENCRYPT_HOST: yourdomain.com #如果要申請 SSL 憑證的話,這一行可以填入,但如果跟想要 domain 走 cloudflare,可以不填入
    volumes:
      - ./data:/data # 將設定檔放在docker-compose所在目錄
      - ./navidrome.toml:/app/navidrome.toml #這是我另外用的一個設定檔,未來比較好改東西
      - /home/yoyo/music:/music:ro #把音樂資料夾丟給 navidrome 內的 music
    networks:
      - net
networks:
  net:
    external: true

一樣完成後把 docker 跑起來

docker compose up -d

步驟三:Cloudflare 設定

接著,到你的 DNS 內,把 Joplin 指定的 yourdomain.com 指向 Server 的 IP。

步驟四:開啟 Navidrome 測試

此時,如果你的服務有順利建起來,應該可以從 http://yourdomain.com 來進入 Navidrome,而第一次進入會設定管理員密碼

Note: 如果有 SSL,則可以測試 https

放一個官網的圖 player

步驟五:安裝 iPhone 與 Mac 的聽音樂 App

當然你可以用 Browser 開啟 yourdoamin.com 來聽,或者在 Mac 安裝 Feishin,iPhone 安裝 Amperfy,去抓取你的 Navidrome 服務,也就是 http://yourdomain.com 即可開始使用

開使使用吧!

總算完成啦!如果你按照步驟到這裡都沒問題,且都順利成功的話,你應該可以:

  1. 把 CD 轉為 FLAC 檔案後,直接丟到 Windows 上的資料夾,接下來在任何地方都可以在 Navidrome 上聆聽。
  2. 在任何裝置上透過 http://yourdomain.com 聽到 Navidrome 的音樂,或使用任何有支援 Navidrome 協定(例如 subsonic)的播放器。

如果你有碰到什麼困難,歡迎寫 email 給我來討論喔

comments powered by Disqus