用 Navidrome 自建音乐库,手机也能听

用 Navidrome 在手机和电脑听自己的音乐。音乐只读挂载,另存应用数据;播放和转码对配置的要求不同。

音乐在自己的硬盘里,想换到手机或另一台电脑继续听,可以在 VPS 上装 Navidrome。它读取文件和标签,提供网页及兼容客户端播放。音乐、用户资料和播放记录都要分别保存。

先用两个专辑试运行,比一次上传整个库更容易发现标签、权限与播放问题。准备公开入口前,在 SSH 转发里完成首个管理员创建。

磁盘够放音乐,还要留给备份

部署需要 Linux、Docker Engine、Compose 插件和可登录的 SSH 账户。下面假定普通 Docker Engine,数据放在 /opt/navidrome。音乐必须是自己有权存储和使用的文件。

决定套餐之前,先统计音乐库实际体积、每月新增量和同时收听人数。原始播放主要涉及磁盘与网络,转码还会占用 CPU;几十 GB 的文件并不自动意味着需要高性能 CPU,多个客户端频繁转码也不能按空闲状态选内存。

例如 320 kbps 音频持续播放一小时,音频数据约为 144 MB,尚未计算协议开销。这只是用码率估算流量的方法,实际还受播放时长、缓存和转码设置影响。容量按当前库、增长和本地工作空间安排,另留独立备份,不能把唯一的音乐副本上传以后就删掉原件。

需要服务器保存较大的音乐库时,先比较存储 VPS 的磁盘、流量与备份条件。少量试用文件则可以先放到已有机器,验证手机连接路径后再决定是否增加容量。

少量原始音频播放可以从 2 GB 内存实例试运行,磁盘按现有音乐库和后续增长来选;多人转码另观察 CPU,不把原始播放的用量套过去。可查看 雨云 RCS 的音乐库磁盘与网络,或比较 ECS 的实例与数据盘组合。下单前核对月流量、持续带宽和备份成本,先用自己的手机网络试完整播放,再上传整个库。

数据目录可写,音乐目录只读

创建目录后,取得打算运行应用的数字 UID、GID,并把它们写入 .env。示例以当前账户运行;复制已有音乐进来以后,也应确认该账户能读取文件。

sudo mkdir -p /opt/navidrome/data /opt/navidrome/music
sudo chown "$(id -u):$(id -g)" /opt/navidrome/data /opt/navidrome/music
cd /opt/navidrome
printf 'APP_UID=%s\nAPP_GID=%s\n' "$(id -u)" "$(id -g)" > .env

把测试专辑复制到 music,创建 compose.yaml:

services:
  navidrome:
    image: deluan/navidrome:latest
    user: "${APP_UID:?set APP_UID}:${APP_GID:?set APP_GID}"
    restart: unless-stopped
    ports:
      - "127.0.0.1:4533:4533"
    environment:
      ND_MUSICFOLDER: /music
      ND_DATAFOLDER: /data
    volumes:
      - ./data:/data
      - ./music:/music:ro

/data 保存应用数据库、缓存等状态;/music 是音乐文件。这里只读挂载音乐,避免应用改动原文件。这个镜像使用 Compose 的 user 设置运行身份,不能靠添加其他镜像常见的 PUID、PGID 就认为权限已生效。

docker compose config --quiet
docker compose pull
docker compose up -d
docker compose logs --tail=100 navidrome

latest 是可变标签。正常运行以后记录摘要,固定已验证版本或摘要,并在升级前备份。遇到音乐扫描失败,检查容器日志、挂载路径和读权限;数据库写入失败则检查 data 权限与磁盘,不能通过删目录重启处理。

在自己的电脑转发端口:

ssh -N -L 127.0.0.1:14533:127.0.0.1:4533 user@YOUR_VPS_IP

访问 http://127.0.0.1:14533,按初始化界面创建管理员。之后若让手机通过公网使用,用自己的域名和 HTTPS 网关代理到服务器本机 4533;不要直接将首次初始化页面和明文登录入口开放出去。

试专辑标签、手机连接和完整播放

检查专辑名、专辑艺术家、曲目顺序和封面。合辑被拆散或同名专辑合并时,优先检查源文件标签,再重新扫描;只改文件夹名称未必能改变应用按标签组织的结果。

网页端播放一首歌,拖动进度、切换曲目,再在真正使用的手机客户端试一次。手机网络可能与电脑不同,网页正常也不能代替客户端连接验证。使用普通收听账户,确认它的访问范围;管理员账户用于维护,不必给每个客户端都配管理权限。

若手机端慢,先分开判断是否转码、请求是否到达应用、磁盘是否在繁忙扫描,以及这条网络是否绕路。开启转码后观察 CPU 与同时播放情况,再定输出码率,不要把转码失败直接归咎于 VPS 地区。

迁移时,音乐和数据库都要保存

Navidrome 内置备份导出的是数据库,包括用户、播放次数等资料,不会替你备份音乐或部署配置。迁移时至少要有音乐文件、应用数据、Compose 配置和镜像版本;“备份任务成功”不等于这几部分已经齐全。

小型实例可以停止应用后取得整个 data 的一致副本,同时保存音乐目录和配置,再启动服务。备份工具失败时也应恢复服务并排查,不要把残缺文件当成成功副本。音乐若另有完整保存位置,可按自己的增量策略处理,不需要每次重复打包整个库。

恢复演练在独立目录、不同回环端口使用相同版本启动。检查几个早期专辑、普通账户、播放列表和完整播放,再进行域名切换;若采用内置恢复命令,应用必须处于停止状态。用户记录恢复了而音乐挂载没恢复,界面可能仍有记录,播放却会失败。