部署

systemctl管理服务

navidrome

下载文件:

1
2
3
sudo mkdir -p /opt/navidrome
wget https://github.com/navidrome/navidrome/releases/download/v0.58.0/navidrome_0.58.0_linux_amd64.tar.gz
sudo tar -xvzf navidrome_0.58.0_linux_amd64.tar.gz -C /opt/navidrome/

配置文件navidrome.toml

1
sudo vim /etc/navidrome/navidrome.toml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Navidrome 配置文件
# 你的音乐库路径
MusicFolder = "/navidrome/music"

# 数据存储路径
DataFolder = "/navidrome/data"

# 监听地址和端口
ListenAddress = "0.0.0.0"
Port = 4533

# 配置选项
ND_SCANNER_SCHEDULE="0 2 * * *" # 每天凌晨 2 点自动扫描
ND_SCANNER_WATCHERWAIT="10s" # 文件变动后等待 10 秒再扫描(防频繁触发)
ND_SCANNER_PURGEMISSING="full" # 仅在完整扫描时清除缺失文件(安全)
ND_COVERARTPRIORITY="embedded,cover.*,folder.*,front.*,external"
ND_ARTISTARTPRIORITY="artist.*,album/artist.*,external"
ND_ENABLEARTWORKPRECACHE=true # 预加载封面,首次浏览更快
ND_IMAGECACHESIZE="500MB" # 增大缓存,避免重复下载
ND_SESSIONTIMEOUT="72h" # 闲置 72 小时自动登出
ND_AUTHREQUESTLIMIT=3 # 每 24 小时最多 3 次登录尝试(防爆破)
ND_AUTHWINDOWLENGTH="24h"
ND_ENABLELOGREDACTING=true # 日志中隐藏密码/token
ND_DEFAULTLANGUAGE="zh-Hans" # 默认中文界面

创建一个名为 navidrome 的系统用户

1
sudo useradd --system --shell /sbin/nologin --no-create-home navidrome

创建服务:

1
sudo vim /etc/systemd/system/navidrome.service

navidrome.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[Unit]
Description=Navidrome Music Server and Streamer compatible with Subsonic/Airsonic
After=remote-fs.target network.target
AssertPathExists=/navidrome/data

[Install]
WantedBy=multi-user.target

[Service]
User=navidrome
Group=navidrome
Type=simple
ExecStart=/opt/navidrome/navidrome --configfile "/etc/navidrome/navidrome.toml"
WorkingDirectory=/navidrome/data
TimeoutStopSec=20
KillMode=process
Restart=on-failure

# 安全加固选项 (来自官方文档)
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=/navidrome/data
ProtectSystem=full

docker部署

docker-compose.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
services:
navidrome:
container_name: 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: 0 #自动刷新时间间隔
ND_LOGLEVEL: info
ND_SESSIONTIMEOUT: 168h #登录退出时间
ND_BASEURL: ""
ND_DEFAULTLANGUAGE: zh-Hans #默认语言
volumes:
- "/path/to/data:/data"
- "/path/to/music:/music:ro"
music-tag:
image: xhongc/music_tag_web:latest
container_name: music-tag-web
ports:
- "8001:8001"
volumes:
- "/path/to/music:/app/media:rw"
- "/path/to/config:/app/data"
command: /start
restart: unless-stopped

音乐上传至/path/to/music,重启navidrome容器,自动扫描

访问4533端口,可以网页播放音乐

客户端

Navidrome支持多种协议,比如Subsonic ,Airsonic ,Madsonic这些,支持这些协议的客户端都可以使用。

api

navidrome接口文档

上传

miniserve

navidrome不支持上传歌曲,可以部署miniserve来上传,或者用ftp等方式

GitHub下载地址

1
./miniserve -a $USER:$PASSWD -D -u -U -p $PORT -z -W /path/to/music

各个参数的含义分别为:

  • -a 设置访问用户名与密码
  • -D 将目录展示到文件之上
  • -u 允许上传文件
  • -U 允许创建子目录
  • -p 指定端口
  • -z 支持将整个目录通过 zip 下载
  • -W 在页面下方显示 wget 命令
  • –route-prefix 指定路径前缀
  • t 指定页面 title

启动服务后,可以通过localhost:$PORT访问 miniserve 的 web 页面

使用curl上传文件,其中 $FILE 是文件的路径

1
curl -F "path=@$FILE" http://localhost:8080/upload\?path\=/

使用curl创建目录,其中 $DIR_NAME 是目录的名称

1
curl -F "mkdir=$DIR_NAME" http://localhost:8080/upload\?path=\/

cdn加速

缓存配置

类型 过期时间 遵循源站缓存 权重
目录 /api 0秒 100
目录 /auth/login 0秒 100
目录 /rest/stream 30天 100
文件后缀名 .js;.css;.png;.jpg 7天 100
文件后缀名 .mp3;.flac;.wav 30天 100
目录 /rest 0秒 50
文件后缀名 .php;.jsp;.asp 0秒 3
目录 / 1小时 2

处理流媒体分片请求(Range)

Navidrome 播放音乐文件时,客户端通常会发起带有 Range 请求头的请求,这要求 CDN 节点能够回源获取文件的部分内容

  • 检查 Range 回源设置:在 CDN 配置的高级设置中,确保 Range 回源 功能是开启的。这能保证播放器请求音乐文件片段时,CDN 可以高效地只拉取所需的部分。

保留指定参数

配置项 建议设置 说明
规则类型 文件后缀URL 最好是配合你上一条设置的 文件后缀 规则(.mp3, .flac 等),或针对 /rest/stream 路径(音乐文件路径)。
参数状态 保留指定参数 明确告诉 CDN 哪些参数对缓存是重要的。
指定参数 id Navidrome 的 id 参数代表了唯一的音乐文件。只有 id 不同的请求才应该视为不同的缓存资源。
结果 除了 id 之外的所有参数(如 u, t, _ 等)都会被 忽略。这样请求 id=ABC 的文件时,无论你的 Token 是什么,都会命中同一份缓存,极大地提高命中率。