Navidrome 是一款轻量、开源的自托管音乐服务器,兼容 Subsonic/OpenSubsonic 客户端,支持音乐库扫描、播放列表、歌手和专辑浏览、转码、智能播放列表以及多用户权限。把它部署在 VPS 上,可以从手机、电脑和车载客户端访问自己的无损音乐库,而不必把音频文件交给第三方平台。
本文以 Ubuntu 24.04 LTS、Docker Compose、Navidrome 和 Caddy 为例,说明 VPS 配置、音乐目录挂载、HTTPS、用户权限、转码、移动端连接、备份和升级。音乐版权与分享范围应遵守当地法律和服务条款。
Navidrome 的 CPU 需求不高,但首次扫描大音乐库、实时转码和多个用户同时播放会增加负载:
| 场景 | CPU | 内存 | 磁盘 | 建议 |
|---|---|---|---|---|
| 个人试听 | 2 vCPU | 2-4 GB | 40 GB SSD | 音乐放对象存储或挂载盘 |
| 小家庭音乐库 | 2-4 vCPU | 4 GB | 80 GB+ | 保留本地缓存和异地备份 |
| 多用户或实时转码 | 4 vCPU+ | 8 GB+ | 160 GB+ | 选择高单核性能和更快磁盘 |
准备 music.example.com,将 DNS A/AAAA 记录指向 VPS,只开放 SSH、HTTP 和 HTTPS。不要把 Navidrome 管理端口直接暴露给公网;音乐目录可以挂载独立磁盘或对象存储同步目录。部署前可参考 VPS 配置怎么选。
sudo apt update
sudo apt install -y ca-certificates curl openssl
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker "$USER"
newgrp docker
sudo mkdir -p /opt/navidrome/{data,music,backups}
sudo chown -R "$USER":"$USER" /opt/navidrome
cd /opt/navidrome
如果音乐文件已经位于独立磁盘,建议用只读方式挂载给 Navidrome。生产环境固定镜像版本,不要使用 latest,升级前记录当前镜像 digest 和配置文件。
创建 .env 并设置时区、管理员初始策略和音乐目录:
TZ=Asia/Shanghai
ND_SCANSCHEDULE=1h
ND_LOGLEVEL=info
ND_SESSIONTIMEOUT=24h
ND_BASEURL=
最小 Compose 配置如下:
services:
navidrome:
image: deluan/navidrome:0.58.0
user: "1000:1000"
restart: unless-stopped
environment:
ND_SCANSCHEDULE: ${ND_SCANSCHEDULE}
ND_LOGLEVEL: ${ND_LOGLEVEL}
ND_SESSIONTIMEOUT: ${ND_SESSIONTIMEOUT}
ND_BASEURL: ${ND_BASEURL}
ND_MUSICFOLDER: /music
ND_DATAFOLDER: /data
TZ: ${TZ}
ports:
- "127.0.0.1:4533:4533"
volumes:
- ./data:/data
- ./music:/music:ro
启动前检查并启动:
docker compose config
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=200 navidrome
首次扫描大型音乐库可能需要较长时间。不要在扫描过程中频繁重启容器,先观察日志和磁盘 I/O。
Navidrome 依赖文件标签和目录结构识别歌手、专辑、曲目。建议在导入前统一:
- 使用 UTF-8 文件名,避免不同系统挂载后出现乱码。
- 为专辑填写 Album Artist、Album、Track Number、Disc Number 和发行年份。
- 多碟专辑使用一致的 Disc Number,合辑明确设置 Various Artists。
- 封面尽量放在专辑目录中,并使用常见的
cover.jpg或嵌入式图片。 - 不要在生产目录混放下载临时文件、歌词备份和未完成的压缩包。
可以先把一小部分音乐复制到 /opt/navidrome/music,确认扫描结果、封面和排序正确,再导入整个库。音乐文件挂载为只读,修改标签时在原始管理目录完成后重新扫描。
使用 Caddy 反向代理 Navidrome,可以自动申请和续期证书:
sudo apt install -y caddy
sudo nano /etc/caddy/Caddyfile
music.example.com {
encode gzip zstd
reverse_proxy 127.0.0.1:4533
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains"
X-Content-Type-Options "nosniff"
}
}
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
curl -I https://music.example.com
客户端使用 HTTPS 域名连接,不要在手机端保存明文 HTTP 地址。Subsonic 客户端通常需要服务器 URL、用户名和密码;部分客户端支持 OpenSubsonic 扩展,可以使用转码、歌词和书签功能。反向代理配置也可以参考 VPS 用 Caddy 反向代理完全指南。
管理员账号只用于配置,日常播放使用普通账号。为家庭成员或朋友创建独立用户,避免共享管理员密码:
- 关闭不必要的管理员权限和用户注册。
- 为每个用户设置播放列表和文件访问边界。
- 使用长密码,定期删除不再使用的账号。
- 通过 VPN、访问控制或额外认证限制管理后台。
- 不要把 Navidrome 公开分享给未知用户,防止带宽和存储被滥用。
Navidrome 数据目录包含用户、播放进度、收藏和配置,不要把 /data 目录直接暴露为静态文件服务。定期查看登录日志和异常流量。
如果客户端不支持 FLAC、ALAC 或高码率文件,Navidrome 可以调用 FFmpeg 实时转码。安装 FFmpeg 的方式取决于镜像版本,先检查容器是否自带:
docker compose exec navidrome ffmpeg -version
转码会显著增加 CPU 占用。建议按客户端能力设置合理的输出格式和码率,避免多个用户同时请求无损转码。遇到卡顿时先区分网络带宽不足、源文件读取慢还是 FFmpeg 占满 CPU。
扫描频率不宜设置过短,音乐库稳定后可改为每天扫描一次,或在批量导入完成后手动触发扫描。将数据目录放在 SSD,音乐文件放在大容量磁盘,减少数据库和封面读取延迟。
完整备份至少包括 Navidrome /data、音乐原文件、Compose 文件和 .env。音乐原文件如果已经由其他系统管理,可以单独执行校验和异地同步:
mkdir -p /opt/navidrome/backups
tar -czf /opt/navidrome/backups/navidrome-data-$(date +%F).tar.gz data
cp docker-compose.yml .env /opt/navidrome/backups/
rsync -a --delete /opt/navidrome/music/ backup-host:/srv/music/
不要只备份数据库而忽略音乐文件和封面。备份同步到另一台 VPS 或对象存储后,至少每月恢复一份 /data 到临时容器,验证用户、播放列表、收藏和扫描状态。大型音乐库可使用校验和或对象存储版本控制,避免单次误删。
更多 Docker 数据库和文件恢复方法可参考 Restic、Rclone 与 Docker 恢复演练。
升级前记录 Navidrome 版本、FFmpeg 版本、配置、数据目录和音乐库路径。先在测试目录复制 /data,验证新版本能读取数据库和扫描音乐,再安排生产维护窗口:
docker compose pull
docker compose up -d
docker compose logs --tail=200 navidrome
docker compose ps
如果升级后数据库迁移失败或客户端无法登录,先停止继续写入,恢复旧镜像和 /data 备份到隔离环境确认兼容性。不要删除 data volume 后重新初始化,这会丢失用户、播放列表和播放历史。
检查 Caddy、容器状态和 4533 端口监听,确认 DNS 指向当前 VPS,防火墙允许 80/443。查看 docker compose logs navidrome 是否有权限或数据库错误。
确认 /music 在容器内可读,宿主机目录权限与容器 UID 匹配。检查标签中的 Album Artist、Disc Number 和文件名,再重新扫描,不要反复删除数据库。
查看 CPU、磁盘 I/O、出口带宽和 FFmpeg 日志。先降低转码码率或改用客户端原格式播放,再决定是否增加 CPU。
确认客户端使用 HTTPS 域名和正确端口,检查反向代理的 Host、Cookie 和 WebSocket 相关设置。重置密码前先确认服务端日志没有拒绝请求。
- Navidrome 版本固定,
data和音乐目录使用持久化存储。 - Caddy HTTPS、域名和客户端连接测试通过。
- 管理员和普通用户分离,未开放不必要的注册和管理权限。
- 音乐库标签、封面、合辑和多碟专辑扫描结果正确。
- FFmpeg 转码、移动端播放和多用户并发已验证。
/data、音乐原文件、配置和版本信息已异地备份。- 已完成一次临时环境恢复演练,并记录恢复时间。
Navidrome 自托管的重点不是把播放器页面打开,而是让音乐目录、元数据、转码、用户访问和备份都保持可控。先从只读音乐库和一个移动端客户端开始,验证扫描和播放稳定后,再扩展到多用户、对象存储和自动同步。
延伸阅读:
