SZ Horizon
SZ Horizon

【乐享】自建音乐服务器——Navidrome

简介

  Navidrome是一个开源的音乐流媒体服务器,相当于自建版网易云。前提概要:本文精华为“天坑”,在书签或下文中可以找到。

起因

  其实我是有网易云的SVIP的,但是无奈网易云的安卓客户端实在是太臃肿了,没办法在我的QF9上面安装,所以就没办法用了。啥,你说QF9是啥?

https://pro.goforit.top/stephen-zeng/img/master/img/20240129205817.png

别以为这玩意有多么高大上,它只有256MB的运存和512MB的内置存储,,,虽然可以插SD卡,但是我遇到过几次无缘无故应用数据被清空的情况,导致我积累了很久的播放列表全部丢失。苦于市面上所有流媒体客户端无论新版还是老版客户端都没办法正常使用,于是,忍无可忍,直接自建!

开始

准备服务器

  当然得有个服务器,不过配置不用太高,但是网络环境一定要不错,不然高强度听歌时缓存时间会爆炸。参考一下我正在用的音乐服务器配置

root@racknerd-07a628:~# screenfetch
                          ./+o+-       root@racknerd-07a628
                  yyyyy- -yyyyyy+      OS: Ubuntu 22.04 jammy
               ://+//////-yyyyyyo      Kernel: x86_64 Linux 5.15.0-88-generic
           .++ .:/++++++/-.+sss/`      Uptime: 71d 23h 27m
         .:++o:  /++++++++/:--:/-      Packages: 1022
        o:+o+:++.`..```.-/oo+++++/     Shell: bash 5.1.16
       .:+o:+o/.          `+sssoo+/    Disk: 27G / 1.1T (3%)
  .++/+:+oo+o:`             /sssooo.   CPU: Intel Xeon E5-2690 v2 @ 3GHz
 /+++//+:`oo+o               /::--:.   GPU: Cirrus Logic GD 5446
 \+/+o+++`o++o               ++////.   RAM: 760MiB / 957MiB
  .++.o+++oo+:`             /dddhhh.  
       .+.o+oo:.          `oddhhhh+   
        \+.++o+o``-````.:ohdhhhhh+    
         `:o+++ `ohhhhhhhhyo++os:     
           .o:`.syhhhhhhh/.oo++o`     
               /osyyyyyyo++ooo+++/    
                   ````` +oo+++o\:    
                          `oo++.      

不要被1TB的磁盘空间吓到,这是rclone挂了OneDrive(后文会讲)。
其实这是一台RarkNerd的年付特价小鸡,连接国内的网络条件特别差,不是一般的差,直连SSH都吃力。但是好在我有一台阿里云香港可以作为中转,虽然还是慢,但是终究是可以用的。如果你没有网络较好的服务器做中转的话,就需要用CDN了。不过CDN的费用可能会很感人,参考我的出口流量使用情况

https://pro.goforit.top/stephen-zeng/img/master/img/20240129211008.png

正式搭建

  官方的搭建文档已经很详细了,你可以去官网上看。可以用Docker或者手动安装。如果是配置比较低的小鸡,建议手动安装,Docker容器本身占用的资源有点多:

安装方式链接
手动安装https://www.navidrome.org/docs/installation/linux/
Dockerhttps://www.navidrome.org/docs/installation/docker/
全部方式https://www.navidrome.org/docs/installation/

应该都会罢,真的写得挺详细的。如果网络环境特殊或有其他情况无法访问官方的,我也把手动安装的文档放在下面,可以在书签(左边或左上角点开)跳过。注意,如果你的服务器采用的是CentOS或RedHat系的(Fedora等等),可以通过这几行命令安装ffmpeg:

yum install epel-release
rpm -v --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
yum install ffmpeg ffmpeg-devel
ffmpeg -version

如果输出像这样,就装完了。

ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers
  built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)
  configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100

安装文档(手动,已经翻译)

Linux安装

以下是在Ubuntu Linux(和其他基于Debian的发行版)上的安装步骤

注意:这些说明是为Ubuntu发行版创建的,尽管它们包含特定的Ubuntu/Debian指令(例如:apt),但这些概念适用于大多数Linux发行版,甚至那些不基于Debian的(例如:CentOS和OpenSUSE)。

以下步骤已在Ubuntu 18.04上测试过,并且适用于所有版本16.04及以上,以及其他基于Debian的发行版。在整个指南过程中,命令将使用占位符表示你希望以何种用户(\<user>)和组(\<group>)运行Navidrome,以及音乐文件夹的路径(\<library_path>)。如果你正在使用现有的媒体库,请确保用户拥有对媒体库的权限。

更新并安装预备环节

确保你的系统是最新的并安装ffmpeg。

sudo apt update
sudo apt upgrade
sudo apt install vim ffmpeg

创建目录结构

创建一个存储Navidrome可执行文件的目录及一个具有适当权限的工作目录。

sudo install -d -o <user> -g <group> /opt/navidrome
sudo install -d -o <user> -g <group> /var/lib/navidrome

获取Navidrome

从发布页面下载最新版,将内容提取到可执行目录,并为文件设置权限。(用发布页面上的URL替换下面的URL):

wget https://github.com/navidrome/navidrome/releases/download/v0.XX.X/navidrome_0.XX.X_linux_amd64.tar.gz -O Navidrome.tar.gz
sudo tar -xvzf Navidrome.tar.gz -C /opt/navidrome/
sudo chown -R <user>:<group> /opt/navidrome

创建配置文件

在工作目录/var/lib/navidrome中创建一个新文件,命名为navidrome.toml,设置以下内容。

MusicFolder = "<library_path>"

关于更多配置选项,请见配置选项页面。

创建一个Systemd单元

在 /etc/systemd/system/ 下创建一个新文件,命名为navidrome.service,设置以下内容。确保将 \<user> 和 \<group> 替换为你希望以其运行Navidrome的用户和组。

[Unit]
Description=Navidrome Music Server and Streamer compatible with Subsonic/Airsonic
After=remote-fs.target network.target
AssertPathExists=/var/lib/navidrome

[Install]
WantedBy=multi-user.target

[Service]
User=<user>
Group=<group>
Type=simple
ExecStart=/opt/navidrome/navidrome --configfile "/var/lib/navidrome/navidrome.toml"
WorkingDirectory=/var/lib/navidrome
TimeoutStopSec=20
KillMode=process
Restart=on-failure

# See https://www.freedesktop.org/software/systemd/man/systemd.exec.html
DevicePolicy=closed
NoNewPrivileges=yes
PrivateTmp=yes
PrivateUsers=yes
ProtectControlGroups=yes
ProtectKernelModules=yes
ProtectKernelTunables=yes
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
RestrictNamespaces=yes
RestrictRealtime=yes
SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap
ReadWritePaths=/var/lib/navidrome

# You can uncomment the following line if you're not using the jukebox This
# will prevent navidrome from accessing any real (physical) devices
#PrivateDevices=yes

# You can change the following line to `strict` instead of `full` if you don't
# want navidrome to be able to write anything on your filesystem outside of
# /var/lib/navidrome.
ProtectSystem=full

# You can uncomment the following line if you don't have any media in /home/*.
# This will prevent navidrome from ever reading/writing anything there.
#ProtectHome=true

# You can customize some Navidrome config options by setting environment variables here. Ex:
#Environment=ND_BASEURL="/navidrome"

开启Navidrome服务

重新加载服务守护程序,启动新创建的服务,并检查其是否正确启动。

sudo systemctl daemon-reload
sudo systemctl start navidrome.service
sudo systemctl status navidrome.service

如果服务已正确启动,尝试访问http://localhost:4533。

在启动时启动Navidrome

sudo systemctl enable navidrome.service

插句嘴,这是用GPT翻译的,质量杠杠的~

进阶

OK!想必你已经把Navidrome安装完了,那么我们就来进行一些优化吧。首先启动navidrome(必须的)

sudo systemctl start navidrome

服务器ip:4533,进入navidrome设置

https://pro.goforit.top/stephen-zeng/img/master/img/20240129220058.png

简单设置一下,就进入主界面了:
https://pro.goforit.top/stephen-zeng/img/master/img/20240129220340.png

加上HTTPS

  首先就是添加HTTPS的安全连接了.这个很简单,宝塔反代一下就好了。如果像我一样是用了中转服务器,则需要先在音乐服务器上反代localhost到443的https端口,然后再在中装服务器上反代音乐服务器,就像这样:

https://pro.goforit.top/stephen-zeng/img/master/img/20240129215811.png

然后你再打开第二层反代的网址即可。不用手动编辑反代代码,用宝塔默认的就行。

挂载OneDrive

像我这种服务器空间只有10GB,音乐却又将近20G的人来说,就只能依靠挂载外部存储来实现“扩容”了,这也是一开始你看到我的服务器有1TB空间的原因。

购买Microsoft 365

  建议不要贪小便宜去买诸如E5,教育版之类的M365账号,毕竟数据无价,而且这些音乐本身就大,转来转去也很麻烦。所以,建议上一个M365家庭版的车,一年30,闲鱼上一抓一大把,还有售后:

https://pro.goforit.top/stephen-zeng/img/master/img/D103D986-F5A6-4787-B597-4131C94DF8BF.png

部署rclone

看看这篇文章吧,俺真的不想打字力。。。
转载自知乎
这里面需要注意,Folder为Onedrive里面装音乐的文件夹,建议放在OneDrive根目录。我自己是将音乐单独建一个,其他文件又单独建一个,像这样:

https://pro.goforit.top/stephen-zeng/img/master/img/20240129221941.png

LocalFolder为Navidrome的音乐文件夹,就是文档里的这个:

MusicFolder = "<library_path>"
# 就是这个<library_path>,配置rclone时要填写绝对目录

然后就可以啦!

https://pro.goforit.top/stephen-zeng/img/master/img/20240129222219.png

接入last.fm,spotify等第三方API

可以看这里:
https://www.navidrome.org/docs/usage/external-integrations/
这样你的音乐播放记录就可以通过last.fm在各个平台上同步了。通过spotify的API,可以帮你自动匹配对应的专辑以及图片。

转码

可以有效减少音乐服务器带宽的使用,对白嫖Azure用户等对流量敏感的用户十分推荐!在网页端点击右上角头像——播放器(Player),再找到你想要进行转码的已连接客户端(包括网页端也再上面)

https://pro.goforit.top/stephen-zeng/img/master/img/20240129224915.png

建议设置成像下图这样的,既可以保证音质,又可以保证带宽的使用。你也可以自行调整码率。注意,两个开关都建议关掉,特别是第二个,不然会出现许多神奇bug,比如专辑图片无法读取(被转码转没了)。
https://pro.goforit.top/stephen-zeng/img/master/img/20240129224728.png

天坑

其实这才是我这篇文章想要讲的主要内容,也是你应该在晚上找不到的内容。

不要轻易用OSS等对象存储

不要看着OSS的空间便宜,但是Navidrome的读写文件量是真的恐怖。特别是如果音乐多的话,每一次扫描音乐库都是一次访问剧增,结果就是非常感动的OSS费用,蓝色的是对象存储OSS的费用:

https://pro.goforit.top/stephen-zeng/img/master/img/20240129222834.png

https://pro.goforit.top/stephen-zeng/img/master/img/20240129223109.png

而且这只是个人使用,如果你是打算给朋友或者其他人用的话,账单还会更可怕,所以还是算了罢。。。

OneDrive扫描延时

由于rclone的是基于映射的方式将OneDrive作为本地文件夹使用,因此新上传的音乐在会有一定程度的延时。有时候即使你在ls之后看到了新上传的音乐,navidrome的同步依然需要时间。如果迟迟没有更新,你可以去网页的右上角进行全局扫描

https://pro.goforit.top/stephen-zeng/img/master/img/20240129223439.png

就是那个折线图标,点开之后的放大镜图标就是了。

OFFLINE问题

如果你通过第二层反代,也就是中转服务器的反向代理访问的服务器,你大概率会看到这个:

https://pro.goforit.top/stephen-zeng/img/master/img/20240129223656.png

会说你的服务器离线了。其实并没有。这是因为中转服务器没有和音乐服务器进行WebSocket层面的连接,因此网页无法检测服务器的在线状态。如果你使用第一层反代访问,也就是音乐服务器的反向代理localhost,那么就正常了。
https://pro.goforit.top/stephen-zeng/img/master/img/20240129223439.png

客户端选择

一下客户端安装包均可在Github上找到,你也可以再这里下载

网页端

临时使用用网页端就好,可以满足大部分的要求。

安卓端

强烈建议Dsub,简直转为听歌而生,而且又小,甚至可以在我的QF9上顺利使用!
Github仓库

桌面端

建议用Sonixd,也很好使。

iOS,iPadOS

没得选了,可以用的也就Amperfy比较好用,bug比较少

https://pro.goforit.top/stephen-zeng/img/master/img/20240129230328.png

结尾

上面就是我在Navidrome上面的折腾和踩坑了,希望对你有所帮助。

没有标签
首页      乐享      【乐享】自建音乐服务器——Navidrome

Stephen Zeng

文章作者

发表回复

textsms
account_circle
email

  • 我居然忘记把必填邮箱给关了!

    3 月前 回复
  • 匿名

    舒服了,可以匿名了 :wink:

    3 月前 回复
  • Pang

    博主你好,我也想给自己服务器套一个CDN,但里面的回源什么的我不太会整,博主可以分享一下吗,感谢!
    (我把邮箱放在这回复我会有通知吗)

    4 周前 回复
  • surgery

    博主会遇到卡播放吗,我挂载到onedrive上传完音乐,播放都会卡住

    1 周前 回复
    • @surgery: 那可能是你的服务器与OneDrive的网络连接不好,或者rclone的缓存给得不够。还有就是客户端得选择也有关系,比如安卓端得Dsub和Tempo的缓存策略都没问题,特别是Tempo的缓存策略,简直秒听。但是iOS的所有客户端都不好使,矮子里面挑高的就是Amperfy,但还是会卡

      6 天前 回复

SZ Horizon

【乐享】自建音乐服务器——Navidrome
简介   Navidrome是一个开源的音乐流媒体服务器,相当于自建版网易云。前提概要:本文精华为“天坑”,在书签或下文中可以找到。 起因   其实我是有网易云的SVIP的,但是无奈网易云的安…
扫描二维码继续阅读
2024-01-29