如何搭建一個自己的音樂服務器

語言: CN / TW / HK

點贊再看,動力無限。 微信搜「 程序猿阿朗 」。

本文 Github.com/niumoo/JavaNotes未讀代碼博客 已經收錄,有很多知識點和系列文章。

最近發現,經常用的網易雲音樂,有很多歌曲下架了,能聽的越來越少了;歌單裏的一些歌曲,現在要開通 VIP 才能聽了。其實自己常聽的歌曲不是很多,現在卻有很多聽不了了。

怎麼辦呢,付費嗎?花錢當然是一個好方式,花 1 分鐘開通 VIP,立馬就可以暢聽起來。

不過前兩天翻東西時剛好發現自己還有一個吃灰多年的大學時代的樹莓派,不如廢物利用起來,使用樹莓派搭建一個自己的音樂服務器用來聽歌吧。

樹莓派

以上只是引言,作為技術人員,本文所做介紹只為分享一些有趣好玩的東西,請不要傳播具有版權的音樂。

下面的文章是使用樹莓派搭建音樂服務器,如果你手上沒有樹莓派,那麼使用任何一個雲服務器都是一樣的,甚至因為雲服務器具備公網 IP ,使用場景更加廣泛。

樹莓派啟動

説幹就幹,樹莓派通電。結果太久不用,密碼忘了,只能為樹莓派重新燒錄系統。我這裏選擇了 Raspberry Pi OS 輕量無桌面 Linux 系統,可以減少資源的佔用。因為後面的服務都是通過 Docker 安裝,其實這裏選擇什麼發行版的 Linux 區別並不大。

鏈接:Raspberry Pi OS 64 位系統下載

安裝 Docker

安裝 Docker 過程網上教程很多,下面只簡單記錄。

Ubuntu 系統為了安裝軟件速度更快,可以先更換軟件源為國內軟件源。

編輯文件:

shell sudo vim /etc/apt/sources.list

使用下面的阿里雲軟件源配置進行內容替換。

shell deb https://mirrors.aliyun.com/debian/ bullseye main non-free contrib deb-src https://mirrors.aliyun.com/debian/ bullseye main non-free contrib deb https://mirrors.aliyun.com/debian-security/ bullseye-security main deb-src https://mirrors.aliyun.com/debian-security/ bullseye-security main deb https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib deb-src https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib deb https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib deb-src https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib

安裝 Dokcer,直接使用一句話腳本安裝。

shell curl -sSL https://get.daocloud.io/docker | sh

安裝過程:

```shell linux@darcy:~ $ curl -sSL https://get.daocloud.io/docker | sh

Executing docker install script, commit: 4f282167c425347a931ccfd95cc91fab041d414f

  • sudo -E sh -c apt-get update -qq >/dev/null
  • sudo -E sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null
  • sudo -E sh -c mkdir -p /etc/apt/keyrings && chmod -R 0755 /etc/apt/keyrings
  • sudo -E sh -c curl -fsSL "https://download.docker.com/linux/debian/gpg" | gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg
  • sudo -E sh -c chmod a+r /etc/apt/keyrings/docker.gpg
  • sudo -E sh -c echo "deb [arch=arm64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian bullseye stable" > /etc/apt/sources.list.d/docker.list
  • sudo -E sh -c apt-get update -qq >/dev/null
  • sudo -E sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends docker-ce docker-ce-cli containerd.io docker-compose-plugin >/dev/null
  • version_gte 20.10
  • [ -z ]
  • return 0
  • sudo -E sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -qq docker-ce-rootless-extras >/dev/null
  • sudo -E sh -c docker version Client: Docker Engine - Community Version: 20.10.21 API version: 1.41 Go version: go1.18.7 Git commit: baeda1f Built: Tue Oct 25 18:01:19 2022 OS/Arch: linux/arm64 Context: default Experimental: true

Server: Docker Engine - Community Engine: Version: 20.10.21 API version: 1.41 (minimum version 1.12) Go version: go1.18.7 Git commit: 3056208 Built: Tue Oct 25 17:59:41 2022 OS/Arch: linux/arm64 Experimental: false containerd: Version: 1.6.10 GitCommit: 770bd0108c32f3fb5c73ae1264f7e503fe7b2661 runc: Version: 1.1.4 GitCommit: v1.1.4-0-g5fd4c4d docker-init: Version: 0.19.0 GitCommit: de40ad0

================================================================================

To run Docker as a non-privileged user, consider setting up the Docker daemon in rootless mode for your user:

dockerd-rootless-setuptool.sh install

Visit https://docs.docker.com/go/rootless/ to learn about rootless mode.

To run the Docker daemon as a fully privileged service, but granting non-root users access, refer to https://docs.docker.com/go/daemon-access/

WARNING: Access to the remote API on a privileged Docker daemon is equivalent to root access on the host. Refer to the 'Docker daemon attack surface' documentation for details: https://docs.docker.com/go/attack-surface/

================================================================================

darcy@darcy:~ $ ```

安裝 docker-compose.

shell linux@darcy:~/music $ sudo apt install docker-compose Reading package lists... Done Building dependency tree... Done Reading state information... Done The following packages were automatically installed and are no longer required: libslirp0 slirp4netns Use 'sudo apt autoremove' to remove them. The following additional packages will be installed: apparmor cgroupfs-mount containerd docker.io git git-man liberror-perl libintl-perl libintl-xs-perl libmodule-find-perl libmodule-scandeps-perl libproc-processtable-perl libsort-naturally-perl libterm-readkey-perl needrestart python3-attr python3-cached-property python3-distutils python3-docker python3-dockerpty python3-docopt python3-importlib-metadata python3-jsonschema python3-lib2to3 python3-more-itertools python3-pyrsistent python3-setuptools python3-texttable python3-websocket python3-yaml python3-zipp runc tini Suggested packages: apparmor-profiles-extra apparmor-utils containernetworking-plugins docker-doc aufs-tools btrfs-progs debootstrap rinse rootlesskit xfsprogs zfs-fuse | zfsutils-linux git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn needrestart-session | libnotify-bin iucode-tool python-attr-doc python-jsonschema-doc python-setuptools-doc Recommended packages: criu The following packages will be REMOVED: containerd.io docker-ce docker-ce-cli docker-ce-rootless-extras The following NEW packages will be installed: apparmor cgroupfs-mount containerd docker-compose docker.io git git-man liberror-perl libintl-perl libintl-xs-perl libmodule-find-perl libmodule-scandeps-perl libproc-processtable-perl libsort-naturally-perl libterm-readkey-perl needrestart python3-attr python3-cached-property python3-distutils python3-docker python3-dockerpty python3-docopt python3-importlib-metadata python3-jsonschema python3-lib2to3 python3-more-itertools python3-pyrsistent python3-setuptools python3-texttable python3-websocket python3-yaml python3-zipp runc tini 0 upgraded, 34 newly installed, 4 to remove and 39 not upgraded. Need to get 55.9 MB of archives. After this operation, 45.4 MB disk space will be freed. Do you want to continue? [Y/n] y Get:1 https://mirrors.aliyun.com/debian bullseye/main arm64 runc arm64 1.0.0~rc93+ds1-5+deb11u2 [2,078 kB] Get:2 https://mirrors.aliyun.com/debian bullseye/main arm64 containerd arm64 1.4.13~ds1-1~deb11u2 [14.7 MB] Get:3 https://mirrors.aliyun.com/debian bullseye/main arm64 tini arm64 0.19.0-1 [209 kB] Get:4 https://mirrors.aliyun.com/debian bullseye/main arm64 docker.io arm64 20.10.5+dfsg1-1+deb11u2 [28.8 MB] Get:5 https://mirrors.aliyun.com/debian bullseye/main arm64 apparmor arm64 2.13.6-10 [601 kB] Get:6 https://mirrors.aliyun.com/debian bullseye/main arm64 cgroupfs-mount all 1.4 [6,276 B] Get:7 https://mirrors.aliyun.com/debian bullseye/main arm64 python3-cached-property all 1.5.2-1 [12.5 kB] Get:8 https://mirrors.aliyun.com/debian bullseye/main arm64 python3-lib2to3 all 3.9.2-1 [77.8 kB] Get:9 https://mirrors.aliyun.com/debian bullseye/main arm64 python3-distutils all 3.9.2-1 [143 kB] Get:10 https://mirrors.aliyun.com/debian bullseye/main arm64 python3-websocket all 0.57.0-1 [34.3 kB] Get:11 https://mirrors.aliyun.com/debian bullseye/main arm64 python3-docker all 4.1.0-1.2 [85.2 kB] Get:12 https://mirrors.aliyun.com/debian bullseye/main arm64 python3-dockerpty all 0.4.1-2 [11.1 kB] Get:13 https://mirrors.aliyun.com/debian bullseye/main arm64 python3-docopt all 0.6.2-3 [26.6 kB] Get:14 https://mirrors.aliyun.com/debian bullseye/main arm64 python3-attr all 20.3.0-1 [52.9 kB] Get:15 https://mirrors.aliyun.com/debian bullseye/main arm64 python3-more-itertools all 4.2.0-3 [42.7 kB] Get:16 https://mirrors.aliyun.com/debian bullseye/main arm64 python3-zipp all 1.0.0-3 [6,060 B] Get:17 https://mirrors.aliyun.com/debian bullseye/main arm64 python3-importlib-metadata all 1.6.0-2 [10.3 kB] Get:18 https://mirrors.aliyun.com/debian bullseye/main arm64 python3-setuptools all 52.0.0-4 [366 kB] Get:19 https://mirrors.aliyun.com/debian bullseye/main arm64 python3-pyrsistent arm64 0.15.5-1+b3 [58

啟動 docker

```

查看docker服務是否啟動

sudo systemctl status docker

如果沒有啟動

sudo systemctl start docker ```

安裝音樂服務器

網上搜索了很多音樂服務器,綜合對比之後選擇了 Navidrome,Navidrome是一款完全開源免費的音樂服務器,且有很多開源客户端可以直接使用,十分方便。

Navidrome 音樂服務器

官方也給出瞭如何使用 Docker 安裝 Navidrome 的教程,可以點擊查看。

鏈接:Docker 安裝 Navidrome 音樂服務器

編寫 docker-compose.yml 文件,配置中使用 volumes 指定了配置文件夾 data,歌曲存放文件夾 folder.

yml version: "3" services: navidrome: image: deluan/navidrome:latest user: 1000:1000 # should be owner of volumes ports: - "4533:4533" restart: unless-stopped environment: # Optional: put your config options customization here. Examples: ND_SCANSCHEDULE: 1h ND_LOGLEVEL: info ND_SESSIONTIMEOUT: 24h ND_BASEURL: "" volumes: - "~/app/music/data:/data" - "~/app/music/folder:/music:ro"

下載 docker 鏡像,等待 navidrome 鏡像下載完成。

shell linux@darcy:~/music $ sudo docker-compose up -d Creating network "music_default" with the default driver Pulling navidrome (deluan/navidrome:latest)... latest: Pulling from deluan/navidrome 9b18e9b68314: Extracting [==================================================>] 2.708MB/2.708MB 6faacaf0d83b: Downloading [=================> ] 11.49MB/32.64MB 4f4fb700ef54: Download complete e67430195958: Downloading [========> ] 2.203MB/13.64MB

音樂上傳

歌曲的來源這裏不細説,我電腦上剛好有幾首不知何年何月使用網易雲音樂時保存的歌曲,上傳歌曲文件到樹莓派服務器。

這裏直接使用 scp 命令進行上傳,需要在歌曲所在文件夾下運行。

  • ./* 表示上傳當前目錄所有文件。
  • [email protected] 為服務器用户名和 IP.
  • :/home/darcy/music/folder 為上傳到的路徑。

shell ➜ folder scp ./* [email protected]:/home/darcy/music/folder [email protected]'s password: GALA - 追夢赤子心.mp3 100% 13MB 7.0MB/s 00:01 伍佰 - 晚風.mp3 100% 4102KB 9.4MB/s 00:00 暗槓 - 狂草.mp3 100% 9693KB 9.1MB/s 00:01 被動(Live).mp3 100% 4463KB 10.4MB/s 00:00 劉德華 - 17歲 (Live).mp3 100% 12MB 10.0MB/s 00:01 張雨生 - 我期待.mp3 100% 14MB 6.8MB/s 00:02 趙英俊 - 方的言.ncm

啟動音樂服務器

先使用 sudo docker ps -a 查看 Navidrome 是否已經啟動了,如果沒有啟動可以使用 docker start id 進行啟動。服務的默認端口是 4533

shell linux@darcy:~ $ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 97a8a2681179 deluan/navidrome:latest "/app/navidrome" 2 weeks ago Up 6 hours (healthy) 0.0.0.0:4533->4533/tcp music_navidrome_1

瀏覽器訪問

IP:PORT 訪問音樂服務,Navidrome 為 PC 端和手機端已經適配了不同的 UI 界面。

PC 瀏覽器:

navidrome pc 端

移動瀏覽器:

navidrome 手機端

Navidrome 的管理功能尚可,點擊右上角的頭像,可以新增用户,可以為其他人創建一個登錄賬户。

使用 APP 訪問

兼容 Navidrome 的 APP 有很多,這裏我使用 Substreamer 這款 APP,界面算得上簡潔,使用體驗尚可。

substreamer app

初次啟動需要進行登錄,可以使用剛剛新增的用户進行登錄。

歌曲界面:

外網訪問

如果已經是使用雲服務器進行部署,那麼因為有相應的公網 IP,其實已經可以直接使用公網 IP 訪問了。

但是如果使用的樹莓派或者家裏的其他機器進行部署的,因為沒有公網 IP ,只能侷限在家庭局域網內,就會讓公網訪問十分困難。這時有下面的幾個方案。

  1. 如果你的寬帶運營商每次會分配公網 IP,剛好你又有一個域名,那麼可以使用 DNS 服務商提供的 API 進行動態 DNS 配置,讓域名總能解析到運營商分配給你的公網 IP。
  2. 如果你有公網服務器,可以使用類似於 FRP 這樣的內網穿透工具,藉助公網服務器暴露局域網服務。

FRP GitHub:https://github.com/fatedier/frp/releases

FRP 通過自定義域名訪問內網的 Web 服務:https://gofrp.org/docs/examples/vhost-http/

<完>

文章持續更新,可以微信搜一搜「 程序猿阿朗 」或訪問「程序猿阿朗博客 」第一時間閲讀。本文 Github.com/niumoo/JavaNotes 已經收錄,有很多知識點和系列文章,歡迎Star。

本文正在參加「金石計劃 . 瓜分6萬現金大獎」