用 Navidrome 建立自己的私人音樂收藏

因為今年又去了一趟大港開唱,也聽了很多樂團的專場,所以瘋狂的收了不少的 CD。畢竟就算把 Spotify 的音質調到最高,整個聽感還是比不上 CD 啊。所以我說那個 Spotify Hi-Fi 還是什麼的講了好幾年了到底要不要推出?(我用不太懂現在有提供無損音檔服務的 KKBOX 和 Apple Music,這是我的問題)

2026-10 Update: 我已經又跳來用 Apple Musc 一陣子了

那,為了整理這些新加入的和原本的 CD,我原本的做法是都會把他們轉成 FLAC 檔案,然後放在 NAS 上用播放軟體開來聽。這樣的操作體驗還滿麻煩的,如果能有一個系統可以幫我管理、又可以讓我在外面隨時可以聽到自己的無損音檔就好了。

於是發現了 Navidrome 這個專案,而且很簡單的用 docker compose 就可以跑起來。然後可以搭配 CloudFlare 的 Zero Trust Application 對外開放,不用開放本機的 port。這不但直接處理掉 HTTPS 憑證的問題、把基本的保護做起來、還可以設定 WAF Rule。

以下是我的 docker-compose.yaml

services:
  navidrome:
    image: deluan/navidrome:latest
    user: 1000:1003 # should be owner of volumes
    restart: unless-stopped
    environment:
      ND_SCANSCHEDULE: 1h
      ND_DEFAULTTHEME: "Spotify-ish"
      ND_IMAGECACHESIZE: "2048MB"
      ND_ENABLEEXTERNALSERVICES: true
      ND_LOGLEVEL: info
      ND_ENABLEDOWNLOADS: true
      ND_SPOTIFY_ID: "xxx"
      ND_SPOTIFY_SECRET: "xxx"
      ND_LASTFM_ENABLED: true
      ND_LASTFM_APIKEY: "xxx"
      ND_LASTFM_SECRET: "xxx"
      ND_ENABLEGRAVATAR: true
      ND_ENABLECOVERANIMATION: false
    volumes:
      - "./data:/data"
      - "./music:/music:ro"
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    command: tunnel run music
    environment:
      - TUNNEL_TOKEN=${TUNNEL_TOKEN}
    restart: unless-stopped
  • 我有另外串接 Spotify 取得專輯插圖、以及串接 Last.fm 的 API 來做聆聽音樂的記錄。如果你不需要的話這些在 environment 裡面的設定可以拿掉。Navidrome 的各項設定可以參考這裡
  • 我的 volume 是透過 autofs 用 NFS mount NAS 上的資料夾,然後再建立個. symbolic link 到 ./music。你也可以不這麼做

從 Bear 搬家到 Notion

Bear 雖然用起來感覺還不錯,可是沒有 Windows app 實在有點痛苦,所以一直在找方法搬家,以下是當時的筆記:

  1. 先在 Bear 的 macOS app 中把所有筆記選起來(cmd-A),然後在選單列中選擇「檔案」→「匯出筆記」
  2. 在記得的地方(例如桌面)建立一個新資料夾,並進入該資料夾,這邊的範例會用「note」。
  3. 按下「選項」按鈕,在「匯出為…」的地方選擇「Markdown」,並勾選「匯出附件」
  4. 按下「匯出筆記」
  5. 匯出完成之後,打開 Finder 到剛剛的 note 資料夾,裡面再建一個「attachments」資料夾。然後把 note 資料夾下的所有其他資料夾,搬到 attachments 資料夾內
  6. 打開 terminal,執行以下指令
    find . -type f -name "*.md" -exec bash -c 'sed -E "s/![](/![](attachments\//" "$1" > tempfile; touch -r "$1" tempfile; mv tempfile "$1"' -- {} \;\n
  7. 安裝 md2notion
    pip3 install md2notion
  8. 取得 Notion 的 access token。打開瀏覽器,登入 Notion。然後打開瀏覽器的開發工具,去看 cookies 中 token_v2 的值,例如:aabbcc12345 這樣的東西
  9. 到 Notion 建立一個新頁面,然後把 URL 記下來,之後匯進來的 Markdown 都會在這個頁面下。例如:https://www.notion.so/fykuan/abc123
  10. 到剛剛的 note 目錄內,執行以下指令
    python3 -m md2notion aabbcc12345 https://www.notion.so/fykuan/abc123 ./*.md
  11. 如果步驟都做對了,md2notion 就會開始把 Markdown 檔案上傳。這樣上傳進 Notion 的筆記,內嵌的圖片都會是正確的

fsck_ufs: inoinfo: inumber xxxxxxxxxxxxxxxxx out of range 解決方式

手邊一台應該是從 FreeBSD 11 升上來的 storage server,在一次意外當機後重開,file system 變成 dirty 開機就卡住了。

一般的修復流程是進 single user mode,執行 fsck -y,讓 fsck 修復到 file system is clean,但這台在跑了 20 幾個小時之後,跳出了

fsck_ufs: inoinfo: inumber xxxxxxxxxxxxxxxxx out of range

然後 fsck 就自己結束了…

經過搜尋看到這篇討論應該是一樣的狀況。原因是 fsck_ffs 的 bug,在轉換 inode number 的時候因為資料類型不對,轉成負數了。而這個問題去年十月在這邊修掉了。

我的解決方式是用 13-RELEASE 的光碟開機,進 single user mode 執行修正這個問題後的 fsck 再修修看,這一次就正常跑完結束了。

修一輪要 20 幾個小時,頭痛…

中華電信光世代奇怪的斷線問題

我家裡一直都用中華電信 100M/40M 的光世代,搭配 ASUS AC-68U 刷 Asuswrt-Merlin,以及申請非固定制光世代的固定 IP。

但是不知道是哪邊的問題,每次遇到

  1. 中華電信機房維修斷線
  2. 家裡停電斷線

網路就會爛掉,用「用戶編號@ip.hinet.net」再也連不上 PPPoE。一定得要改用「用戶編號@hinet.net」拿動態 IP 連線後,去上面的申請固定 IP 網頁,把原本的「1固定IP及7動態IP」改申請成「八個動態IP」,然後再重新申請一次「1固定IP及7動態IP」,再改成用「用戶編號@ip.hinet.net」拿到的固定 IP 上網。然後我的固定 IP 就換一組新的了,domain name 也得去設定到新的 IP 上…

實在是有夠煩人。

Supermicro 的 IPMI 遇到奇奇怪怪症頭的解決方法

Supermicro 的 IPMI 非常方便,可以讓管機器的人在遠端完成大部分的事情,就算是作業系統真的死透了開不了機,也可以透過 IPMI 的 Console Redirection 功能連進去看狀況以及重開。

但麻煩的是如果你的 Supermicro 是舊機器,Console Redirection 得要用 Java 才能跑(新版的已經可以用 HTML 5 跑了)。所以老是會遇到奇奇怪怪的問題。測試了幾天整理了一些奇怪問題的解決方法。

  1. 使用 Supermicro 官方的 IPMIView 工具
    IPMI 通常都是直接打開瀏覽器,連到該主機 IPMI 的 IP address,然後啟動 Console Redirection。不過 Supermicro 提供了 IPMIView 這個工具,直接在這工具內就可以設定多台主機的 IPMI IP,直接用這個工具執行 Remote Console。但舊一點的 BIOS 可能連上去之後沒有 Console Redirection 這個選項。
  2. 安裝 Java SE Runtime Environment 6u19
    舊版的 Java 可以在這裡下載。測試了幾天這個版本是確定可以執行 Console Redirection 的,在 Windows 10 上面也可以運作。不過跑起來以後如果遇到畫面一直被奇怪的白色色塊遮住,我的解決方式是在 Java remote console 內的選單列,使用 OSD UI Style,這樣他會在你的 console 上面另外顯示一個 OSD,利用拖拉那個 OSD 視窗的方式來把讓奇怪色塊遮住的地方重新繪製。
  3. 連上一次之後,之後就再也連不進去了
    我手上的機器有這個症頭,解決方式是在別台主機安裝 ipmitool(Linux 和 macOS 的 homebrew 都有這個工具),然後執行:
    ipmitool -H ${主機IP} -U ${IPMI使用者名稱} -P ${IPMI使用者密碼} bmc reset cold
    來重置主機的 BMC,重置完就可以再次連線到 IPMI 了。

手上有三批機器,一批是得要用 Java Console Redirection 的、一批是可以用 IPMIView 的、一批是直接有 HTML 5 console redirection 可以用的…