這一系列文章,是我自己完成 Docker Server 建立的經歷以及過程,包含以下章節內容:
- 新手自建 Docker 伺服器 - (0) 簡介與架構說明
- 新手自建 Docker 伺服器 - (1) Ubuntu 主機建立 docker 服務
- 新手自建 Docker 伺服器 - (2) 建立 Nginx 代理伺服器
- 新手自建 Docker 伺服器 - (3) 建立應用,以靜態網頁為例
- 新手自建 Docker 伺服器 - (4) 建立 Joplin 筆記軟體
- 新手自建 Docker 伺服器 - (5) 建立自己的音樂串流服務 Navidrome
自建 Docker 伺服器 - (5) 建立自己的音樂串流服務 Navidrome
終於來到最後一篇了,這一篇要去介紹我使用了 Docker 之後,最常使用的系統,也就是把自己的音樂變成串流伺服器的服務 Navidrome。
為什麼要做音樂串流呢
七年級尾端出生,人生的第一張專輯是國中時買的周杰倫專輯 - 十一月的蕭邦,當時每天睡前都會將整張專輯聽過一遍,上課時也會看歌詞本來背歌詞(國中時期把周杰倫歌詞背起來是很屌的事情)。可能是因為國中以前都沒有聽音樂的習慣,因次當擁有自己的音樂專輯後也特別珍惜,也培養出了每次收到專輯後,都要從第一首開始聽到結束,總覺得要跟著順序聽完一整張才會了解製作人的目的。
時光飛逝,長大之後也同樣訂閱了如 Spotify 的串流服務,然而即使現在 99% 的聆聽習慣已在串流上,還是覺得擁有一個檔案在電腦內,才是真正擁有這首歌曲的方式,也因此我還是會繼續買 CD,或是在 iTunes、Bandcamp、HDTrack 上買數位音樂,是一種自己擁有音樂資料庫以及品味的所在。
而問題就出現了,在 2025 年的現在,我的聆聽場所、設備都與以前不同,我不可能在移動設備內包含如手機、工作電腦裝下我所有的音樂,因此情況就變成了:
- 我購買的音樂只能放在家裡的 Mac 裡面(貪圖 Itunes 管理),要聽就只能回家聽
- 平常還是聽 Spotify、Youtube 的音樂
有解決方案嗎?問就是 Roon,但是…
如果去尋找自建 Music Server,一定會找到 Roon 這套解決方案,他可以完美的解決自己手邊的音樂資料庫與串流並存,並且在各種終端設備上並存的問題,而我自己在前幾年有試過,也動過乾脆刷下去買終身會員的想法,但評估之後有幾個考量:
- 我並沒有大量訂閱串流的整合需求,基本上只有 Spotify
- Roon 有點肥,Server 端滿吃資源的
- 費用 $500 美元以上,覺得只是找自建串流服務這使用費偏高,更不想訂閱
Navidrome 自建音樂伺服器服務
秉持著網路開源以及虛擬化的精神,其實也很快的找到了解決方案,最早看到比較多的討論是 Jellyfin,很多 NAS 玩家使用這套 Solution 建立影音伺服器,而我在比較之後選了 Navidrome 這套解決方案,他最主要的目的就是 將你的因為檔案透過串流在你的各種設備聆聽
,而我挑選的原因為以下:
- 與 Jellyfin 相比而言專注在音樂串流
- 可以接 Spotify API,撈取專輯資料
- 可以自己設定不同聆聽設備的轉檔邏輯,例如我 Mac 都不轉用轉檔(AIFF 直接聽),Windows 設備會統一轉為 FLAC
歡迎大家到 Navidrome 的 官方網站查看資料,或者可以直接看他的 Demo site來感受使用方式
# Navidrome Demo Site 帳號密碼
User: demo
Password: demo
步驟零: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
這個架構下的重點在於:
- 音樂檔案只存放在 Server 內的 /home/yoyo/music 資料夾內
- 透過 Navidrome 來作為主要的音樂服務
- 用 Samba 服務來使 Windows 電腦掛載 /home/yoyo/music 資料夾,
- 要在外面(非區網,例如公司)使用,可以用我之前寫的 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 電腦掛載
,來實現
- 透過 Windows 管理音樂檔案
- 在 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
放一個官網的圖
步驟五:安裝 iPhone 與 Mac 的聽音樂 App
當然你可以用 Browser 開啟 yourdoamin.com 來聽,或者在 Mac 安裝 Feishin,iPhone 安裝 Amperfy,去抓取你的 Navidrome 服務,也就是 http://yourdomain.com 即可開始使用
開使使用吧!
總算完成啦!如果你按照步驟到這裡都沒問題,且都順利成功的話,你應該可以:
- 把 CD 轉為 FLAC 檔案後,直接丟到 Windows 上的資料夾,接下來在任何地方都可以在 Navidrome 上聆聽。
- 在任何裝置上透過 http://yourdomain.com 聽到 Navidrome 的音樂,或使用任何有支援 Navidrome 協定(例如 subsonic)的播放器。
如果你有碰到什麼困難,歡迎寫 email 給我來討論喔