从零搭建网站(四):音乐网站篇

极致听感:基于 TagLib 2.0 源码编译 Navidrome 音乐服务器

在前三篇中,我们完成了基础服务器环境与 Web 博客的搭建。本篇将进入“硬核”领域:通过源码编译安装 Navidrome。

为什么要源码编译?因为默认的发行版往往链接较旧的 TagLib 库,导致对 DSF (DSD) 等发烧级无损音频格式的支持不佳,或无法精准解析中文元数据。通过手动链接最新的 TagLib 2.0,我们将打造一个全格式支持的完美音乐中心。


一、 核心依赖:TagLib 2.0 共享库编译

Navidrome 使用 CGO 调用 TagLib 来读取音频标签。如果系统自带版本过低(如 Ubuntu 22.04 自带 1.x),必须手动编译。

1. 源码下载与配置

1
2
3
4
5
6
7
8
9
10
git clone https://github.com/taglib/taglib.git
cd taglib
mkdir build && cd build

# 关键:必须显式指定生成共享库 (.so),否则 Navidrome 编译时会链接失败
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON ..
make -j$(nproc)
sudo make install
sudo ldconfig

2. 坑点提示

如果之前安装过旧版本,请务必检查 /usr/local/lib/。若存在 libtag.so.1 相关残留,请手动清理,确保系统链接指向最新的 libtag.so.2。


二、 Navidrome 构建流程

Navidrome 是一个典型的 Go (后端) + React (前端) 架构,编译分为两步。

1. 环境准备

1
2
3
4
5
6
7
# 安装 Go (建议 1.21+)
sudo apt update && sudo apt install golang-go ffmpeg pkg-config -y

# 安装 Node.js 用于前端构建
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs

2. 前端 UI 预编译

前端静态文件会被嵌入到最终的二进制中。

1
2
3
4
cd navidrome/ui
npm install
npm run build

3. 后端编译(链接 TagLib 2.0)

回到根目录,利用 tags 参数进行全功能构建:

1
2
3
4
5
6
cd ..
go mod download

# 静态嵌入前端资源并编译,定义版本号
go build -tags "netgo full" -ldflags "-X github.com/navidrome/navidrome/conf.ServerVersion=v0.54.0-custom" -o navidrome .


三、 部署与系统化管理

1. 目录架构与配置

建议将数据与代码分离,方便后续迁移。

1
2
3
mkdir -p ~/navidrome_data
nano ~/navidrome-master/navidrome.toml

配置文件示例:

1
2
3
4
5
6
7
MusicFolder = "/home/sky/music"
DataFolder = "/home/sky/navidrome_data"
LogLevel = "info"
Port = 4533
Address = "0.0.0.0"
ScanSchedule = "@every 1m" # 每分钟扫描一次新歌

2. Systemd 自动化部署

为了让服务随笔记本开机自启,创建 /etc/systemd/system/navidrome.service:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Navidrome Music Server
After=remote-fs.target network.target

[Service]
User=sky
Group=sky
ExecStart=/usr/local/bin/navidrome --configfile "/home/sky/navidrome-master/navidrome.toml"
Restart=on-failure

[Install]
WantedBy=multi-user.target

执行 sudo systemctl enable --now navidrome 激活。


四、 云端接入:复用 Cloudflare 隧道

为了在室外也能通过手机收听,我们需要利用现有的 Cloudflare 隧道实现一隧多用。

1. 仪表盘配置步骤

  1. 登录 Cloudflare Zero Trust 仪表盘。
  2. 进入 Networks -> Tunnels,选择运行中的隧道点击 Configure。
  3. 切换至 Public Hostname 标签页,点击 Add a public hostname。
  4. 子域名: music | 域名: cbsbm.cn | URL: localhost:4533。
  5. 保存后,CF 会自动处理 DNS 和 SSL 证书。

五、 进阶:节能与移动端体验

1. 笔记本节能管理

由于使用旧笔记本作为服务器,如果希望它在非高峰期休眠以延长硬件寿命,可以使用 rtcwake 实现定时唤醒脚本:

1
2
3
4
5
#!/bin/bash
# 设定明天早上 8:00 自动唤醒并关机(配合 BIOS 计划任务使用更佳)
wake_time=$(date -d 'tomorrow 08:00' +%s)
sudo /usr/sbin/rtcwake -m off -t $wake_time

2. 移动端 App 推荐

Navidrome 完美兼容 Subsonic 协议:

  • Android: 强烈推荐 Symfonium (UI 极美,支持本地缓存)。
  • iOS: 推荐 Amperfy 或 Play:Sub。
  • 连接: 填写 https://music.cbsbm.cn 即可。

六、 结语

通过源码编译,我们赋予了 Navidrome 处理顶级音频格式的能力;通过 Cloudflare 隧道,我们将笔记本变成了专属的私有云音乐中心。至此,一个安全、高性能、零成本(利用废旧设备)的个人服务器系统已初具规模。