Navidrome 0.64.2 配置参数详解

Navidrome 0.64.2 全量配置方式梳理:配置文件/环境变量/命令行三通道实测优先级(与官方文档结论相反)、debug 配置转储核对法、十大功能域参数表、生产配置模板与常见配置陷阱。

Navidrome流媒体自托管2026/10/25

Navidrome 0.64.2 配置参数详解

目标:系统梳理 Navidrome 0.64.2 自托管音乐流媒体服务器的全部配置方式与核心参数,给出参数优先级的实测证据、分类参数语义表、生产配置模板与常见配置陷阱。本文所有实测均在 Ubuntu 22.04 服务器(二进制方式安装 Navidrome 0.64.2)上完成。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • Navidrome 版本:0.64.2(10114574,官方最新稳定版,查询日期 2026-10-25),二进制位于 /usr/local/bin/navidrome
  • 配置文件:/etc/navidrome/navidrome.toml
  • 数据目录:/var/lib/navidrome(内含 SQLite 数据库、缓存与备份目录)
  • 曲库目录:/srv/music(1 位专辑艺人 2 张专辑 + 1 张合辑,共 6 首 mp3)
  • 服务端口:4533(默认)
  • 依赖组件:ffmpeg 4.4.2(转码功能依赖,需在系统 PATH 或 FFmpegPath 中可见)

二、前置条件

Navidrome 已按《Navidrome 0.64.2 介绍与选型指南》所述方式完成安装并能正常启动。快速自检:

navidrome --version

实测输出:

0.64.2 (10114574)

确认配置文件所在:

ls -la /etc/navidrome/navidrome.toml

实测输出:

-rw-r--r-- 1 root root 241 Oct 25 03:19 /etc/navidrome/navidrome.toml

💡 说明:本文的参数实验围绕「配置文件 + 环境变量 + 命令行参数」三种注入方式展开。示例服务器的基础配置为:

MusicFolder = "/srv/music"
DataFolder = "/var/lib/navidrome"
Address = "0.0.0.0"
Port = 4533

三、参数查看与修改方式

Navidrome 的每一个配置项都支持三种注入方式:配置文件、环境变量、命令行参数。三种方式的命名有固定映射关系。

3.1 配置文件方式

默认加载当前工作目录下的 navidrome.toml(--configfile 缺省值即 ./navidrome.toml),生产建议用 -c 显式指定路径。支持 TOML、JSON、YAML、INI 四种格式,按扩展名识别。TOML 示例:

LogLevel = 'INFO'
Scanner.Schedule = '@every 24h'
TranscodingCacheSize = '150MiB'
MusicFolder = '/srv/music'

逐项说明:LogLevel 控制日志级别;Scanner.Schedule 设置定时扫描周期(Cron 或 @every 语法);TranscodingCacheSize 是转码缓存大小;MusicFolder 指定曲库根目录。路径含空格时用引号包裹;Windows 路径必须用单引号。

指定非默认路径的配置文件:

navidrome --configfile "/etc/navidrome/navidrome.toml"

实测输出(节选,实测首部):

  Navidrome is a self-hosted music server and streamer.
  Complete documentation is available at https://www.navidrome.org/docs

time="2026-10-25T03:15:42Z" level=info msg="Loaded configuration" file=/etc/navidrome/navidrome.toml

💡 说明:Loaded configuration file=... 是配置文件被成功加载的标志性日志;若文件不存在或不可读,日志会提示 No configuration file found。

3.2 环境变量方式

规则:配置项名全大写、点分层改为下划线、加 ND_ 前缀。例如 MusicFolder → ND_MUSICFOLDER、Scanner.Schedule → ND_SCANNER_SCHEDULE、Backup.Path → ND_BACKUP_PATH。容器编排与 systemd 场景最常用:

ND_PORT=4536 navidrome -c /etc/navidrome/navidrome.toml

实测输出(节选):

time="2026-10-25T03:16:44Z" level=info msg="Loaded configuration" file=/etc/navidrome/navidrome.toml

环境变量生效的核验方式见 3.4 优先级实测(4536 端口监听)。

3.3 命令行参数方式

navidrome --help

实测输出(节选,实测首尾):

Usage:
  navidrome [flags]
  navidrome [command]

Flags:
  -a, --address string                  IP address to bind to (default "0.0.0.0")
      --albumplaycountmode string       how to compute playcount for albums. absolute (default) or normalized (default "absolute")
      --autoimportplaylists             enable/disable .m3u playlist auto-import` (default true)
      --baseurl string                  base URL to configure Navidrome behind a proxy (ex: /music or http://my.server.com)
      --cachefolder string              folder to store cache data (transcoding, images...), needs write access
  -c, --configfile string               config file (default "./navidrome.toml")
      --datafolder string               folder to store application data (DB), needs write access (default ".")
      --enabletranscodingcancellation   enables transcoding context cancellation
      --enabletranscodingconfig         enables transcoding configuration in the UI
  -h, --help                            help for navidrome
      --imagecachesize string           size of image (art work) cache. set to 0 to disable cache (default "100MB")
      --logfile string                  log file path, if not set logs will be printed to stderr
  -l, --loglevel string                 log level, possible values: error, info, debug, trace (default "info")
      --musicfolder string              folder where your music is stored (default "music")
  -n, --nobanner                        don't show banner
  -p, --port int                        HTTP port Navidrome will listen to (default 4533)
      --prometheus.enabled              enable/disable prometheus metrics endpoint
      --prometheus.metricspath string   http endpoint for prometheus metrics (default "/metrics")
      --scaninterval duration           how frequently to scan for changes in your music library
      --sessiontimeout duration         how long Navidrome will wait before closing web ui idle sessions (default 48h0m0s)
      --tlscert string                  optional path to a TLS cert file (enables HTTPS listening)
      --tlskey string                   optional path to a TLS key file (enables HTTPS listening)
      --transcodingcachesize string     size of transcoding cache (default "100MB")
      --uiloginbackgroundurl string     URL to a backaground image used in the Login page (default "/backgrounds")
      --unixsocketperm string           optional file permission for the unix socket (default "0660")
  -v, --version                         version for navidrome

⚠️ 官方文档明确「命令行参数必须全小写」,且命令行只暴露了部分高频参数(--help 所列)。全量参数(如 Scanner.*、Jellyfin.*、Plugins.* 等)只能走配置文件或环境变量。--help 中残留的 --scaninterval、--enabletranscodingcancellation 是旧名,现行配置项为 Scanner.Schedule 与 Transcoding.EnableCancellation(见 5.2、5.3 节)。

3.4 三种方式的优先级(实测)

官方文档标注优先级为「环境变量 > 命令行参数 > 配置文件」,但 0.64.2 实测结论为:命令行参数 > 环境变量 > 配置文件。以下三组实验逐一验证。

实验一:配置文件 Port = 4533,命令行给 --port 4535:

navidrome -c /etc/navidrome/navidrome.toml --port 4535
curl -s -o /dev/null -w "port4535 HTTP %{http_code}\n" http://127.0.0.1:4535/ping
curl -s -o /dev/null -w "port4533 HTTP %{http_code}\n" --max-time 2 http://127.0.0.1:4533/ping

实测输出:

port4535 HTTP 200
port4533 HTTP 000

服务只监听 4535——命令行参数压过配置文件。

实验二:环境变量与命令行参数同给(ND_PORT=4536 + --port 4535):

ND_PORT=4536 navidrome -c /etc/navidrome/navidrome.toml --port 4535
curl -s -o /dev/null -w "port4536 HTTP %{http_code}\n" http://127.0.0.1:4536/ping
curl -s -o /dev/null -w "port4535 HTTP %{http_code}\n" http://127.0.0.1:4535/ping

实测输出:

port4536 HTTP 000
port4535 HTTP 200

服务监听 4535——命令行参数压过环境变量(与官方文档标注顺序相反)。

实验三:环境变量单独使用(ND_PORT=4536,无命令行端口参数):

ND_PORT=4536 navidrome -c /etc/navidrome/navidrome.toml
curl -s -o /dev/null -w "port4536 HTTP %{http_code}\n" http://127.0.0.1:4536/ping
curl -s -o /dev/null -w "port4533 HTTP %{http_code}\n" --max-time 2 http://127.0.0.1:4533/ping

实测输出:

port4536 HTTP 200
port4533 HTTP 000

环境变量压过配置文件。

用日志级别再验证一轮(ND_LOGLEVEL=debug + --loglevel trace,debug 与 trace 输出行数可区分):

ND_LOGLEVEL=debug navidrome -c /etc/navidrome/navidrome.toml --loglevel trace
grep -c "level=trace" /tmp/t3.log
grep -c "level=debug" /tmp/t3.log

实测输出:

120
49

trace 级日志出现(120 行),说明生效的是命令行的 --loglevel trace 而非环境变量的 debug——与端口实验结论一致。

💡 结论速查:

组合实测生效者
配置文件 vs 命令行参数命令行参数
环境变量 vs 命令行参数命令行参数
配置文件 vs 环境变量环境变量

即实际优先级:命令行参数 > 环境变量 > 配置文件。对 Port、LogLevel 两个参数实测一致。运维上建议同一参数只走一种方式,避免因优先级记忆错误造成「改了不生效」。

3.5 查看生效配置:debug 级配置转储

把 LogLevel 设为 debug(或启动时加 --loglevel debug)重启服务,日志会打印一份生效配置的完整转储,这是核对配置是否生效最直接的手段:

LogLevel = "debug"
navidrome -c /etc/navidrome/navidrome.toml

实测输出(节选,实测首尾):

    Prometheus:  conf.prometheusOptions{Enabled:true, MetricsPath:"[REDACTED]", Password:""},
    Scanner:     conf.scannerOptions{
        Enabled:               true,
        Schedule:              "",
        WatcherWait:           5000000000,
        ScanOnStartup:         true,
        Extractor:             "taglib",
        ArtistJoiner:          " • ",
        ArtistSplitExceptions: {},
        GenreSeparators:       "",
        GroupAlbumReleases:    false,
        FollowSymlinks:        true,
        IgnoreDotFolders:      true,
        PurgeMissing:          "never",
    },
    Jukebox: conf.jukeboxOptions{
        Enabled: false,
        Devices: {
        },
        Default:   "",
        AdminOnly: true,
    },
    Backup: conf.backupOptions{
        Count:    3,
        Path:     "/var/lib/navidrome/backups",
        Schedule: "@every 1m",
    },

转储中数值以纳秒为单位(WatcherWait: 5000000000 即 5s),路径类值与配置文件一致。注意 MetricsPath 显示为 [REDACTED]——这是日志脱敏(EnableLogRedacting,默认开启)在工作,部分路径与凭据类值会被遮蔽(见 5.6 节)。

四、参数总览

Navidrome 0.64.2 的配置项按功能域分为 10 组。下表为全量索引(完整清单见官方 Configuration Options 页,查询日期 2026-10-25):

功能域代表参数本章小节
基础运行MusicFolder、DataFolder、Port、Address、BaseUrl、LogLevel、TLSCert/TLSKey5.1
扫描与曲库Scanner.Schedule、Scanner.WatcherWait、Scanner.PurgeMissing、PlaylistsPath、AutoImportPlaylists、PID.Track/Album5.2
转码与播放Transcoding.MaxConcurrent、TranscodingCacheSize、DefaultDownsamplingFormat、Jukebox.Enabled、EnableDownloads5.3
封面与图片CoverArtPriority、CoverArtQuality、ImageCacheSize、UICoverArtSize、EnableWebPEncoding5.4
用户与界面DefaultTheme、DefaultLanguage、UIWelcomeMessage、SessionTimeout、EnableUserEditing5.5
安全与认证AuthRequestLimit、AuthWindowLength、EnableLogRedacting、EnforceNonRootUser、ExtAuth.*5.6
备份与维护Backup.Path、Backup.Schedule、Backup.Count、EnableScheduledDBAnalyze5.7
外部集成LastFM.、ListenBrainz.、Deezer.*、Agents、LyricsPriority、EnableExternalServices5.8
Jellyfin 兼容层Jellyfin.Enabled、Jellyfin.ServerName、Jellyfin.QuickConnect5.9
搜索与 Subsonic APISearch.Backend、Search.FullString、Subsonic.LegacyClients、Subsonic.MinimalClients5.10

💡 说明:表中绝大多数参数支持配置文件与环境变量两种写法(映射规则见 3.2);少数例外(如 Tags 自定义标签映射、Jukebox.Devices 设备列表)官方标注「cannot be set as an environment variable」,只能写配置文件。带 * 的参数(如 PasswordEncryptionKey、ExtAuth.UserHeader)官方注明修改行为需谨慎或仅限特定场景。

五、核心参数分类详解

5.1 基础运行参数

参数(配置文件)环境变量默认值说明
MusicFolderND_MUSICFOLDER./music曲库根目录,可只读;多曲库时此目录成为默认库
DataFolderND_DATAFOLDER./data应用数据目录(SQLite 库、插件),必须可写
CacheFolderND_CACHEFOLDER<DataFolder>/cache缓存目录(转码产物、图片)
PortND_PORT4533HTTP 监听端口
AddressND_ADDRESS0.0.0.0 与 ::监听地址,支持 IPv4/IPv6/Unix socket(unix:/path)
BaseUrlND_BASEURL空反向代理子路径,如 /music;必须与对外路径完全一致
LogLevelND_LOGLEVELinfo日志级别:error/warn/info/debug/trace
LogFileND_LOGFILE空(stderr)日志落盘路径
TLSCert / TLSKeyND_TLSCERT / ND_TLSKEY空(禁用)证书与私钥路径,二者同时给出即启用 HTTPS
SessionTimeoutND_SESSIONTIMEOUT48hWeb UI 空闲会话时长
UnixSocketPermND_UNIXSOCKETPERM0660Unix socket 文件权限

SessionTimeout 生效验证:设为 24h 后启动日志出现 Setting Session Timeout value=24h(实测)。TLSCert/TLSKey 生效验证如下——生成自签证书并配置:

TLSCert = "/etc/navidrome/tls/tls.crt"
TLSKey = "/etc/navidrome/tls/tls.key"

重启后分别用 HTTPS 与明文 HTTP 请求:

curl -sk -o /dev/null -w "HTTPS %{http_code}\n" https://127.0.0.1:4533/ping
curl -s -o /dev/null -w "HTTP  %{http_code}\n" --max-time 2 http://127.0.0.1:4533/ping

实测输出:

HTTPS 200
HTTP  400

HTTPS 正常响应、明文请求被拒(400)——TLS 监听生效。生产环境建议把证书签发交给反向代理或 certbot,TLSCert/TLSKey 适合内网小规模直接暴露场景。

5.2 扫描与曲库参数

参数环境变量默认值说明
Scanner.EnabledND_SCANNER_ENABLEDtrue扫描器总开关
Scanner.ScheduleND_SCANNER_SCHEDULE0(禁用)定时扫描计划,Cron 或 @every 语法
Scanner.ScanOnStartupND_SCANNER_SCANONSTARTUPtrue启动时自动扫描
Scanner.WatcherWaitND_SCANNER_WATCHERWAIT5s检测到文件变化后延迟扫描的时间,防扫描到不完整文件;0 关闭监视器
Scanner.PurgeMissingND_SCANNER_PURGEMISSINGnever缺失文件清理策略:never(仅标记)/always(每次扫描后清理)/full(全量扫描后清理)
Scanner.FollowSymlinksND_SCANNER_FOLLOWSYMLINKStrue扫描时是否跟随符号链接
Scanner.IgnoreDotFoldersND_SCANNER_IGNOREDOTFOLDERStrue忽略点前缀目录(如同步工具的 .stfolder)
Scanner.ArtistSplitExceptionsND_SCANNER_ARTISTSPLITEXCEPTIONS空永不拆分的艺人名列表(如 AC/DC)
AutoImportPlaylistsND_AUTOIMPORTPLAYLISTStrue自动导入曲库内的 .m3u 播放列表
PlaylistsPathND_PLAYLISTSPATH空(全库)播放列表检索范围,相对 MusicFolder 的路径/通配列表
RecentlyAddedByModTimeND_RECENTLYADDEDBYMODTIMEfalse「最近添加」按文件修改时间而非导入时间排序
PID.Track / PID.AlbumND_PID_TRACK / ND_PID_ALBUM见官方文档曲目/专辑唯一 ID 的标签优先级链,影响去重与合辑识别

定时扫描生效实测(配置 Scanner.Schedule = '@every 24h'):

time="2026-10-25T03:15:01Z" level=info msg="Scheduling periodic scan" schedule="@every 24h"

⚠️ 命名变更陷阱:旧版环境变量 ND_SCANSCHEDULE 在 0.64.2 不再生效——实测注入旧名后日志仍显示 Periodic scan is DISABLED;改用 ND_SCANNER_SCHEDULE 后定时扫描正常调度。从旧版本迁移编排/systemd 配置时务必改名。

💡 技术拓展:曲库文件变动的感知方式有两种主流机制——

机制原理取舍
文件系统监视器(inotify)内核事件推送,文件变化即时触发实时性高,网络挂载(NFS/SMB)上不可靠
定时扫描(Schedule)按计划周期全量/增量比对简单可靠,实时性取决于周期

Navidrome 两者并用:默认 inotify 即时感知(配合 Scanner.WatcherWait 防抖)+ 可选定时兜底。本文方案采用默认监视器 + @every 24h 定时兜底,兼容 NAS 网络挂载场景。

5.3 转码与播放参数

参数环境变量默认值说明
TranscodingCacheSizeND_TRANSCODINGCACHESIZE100MB转码产物缓存,设 0 禁用
Transcoding.MaxConcurrentND_TRANSCODING_MAXCONCURRENT0(不限)全局并发转码上限,防 ffmpeg 打满 CPU
Transcoding.MaxConcurrentPerUserND_TRANSCODING_MAXCONCURRENTPERUSER0(不限)单用户并发转码上限
Transcoding.EnableCancellationND_TRANSCODING_ENABLECANCELLATIONfalse客户端断开时立即终止 ffmpeg;开启省 CPU 但放弃已转码产物
DefaultDownsamplingFormatND_DEFAULTDOWNSAMPLINGFORMATopus仅限制码率(未指定格式)时的转码目标格式
AutoTranscodeDownloadND_AUTOTRANSCODEDOWNLOADfalse客户端下载时按其转码配置转码;关闭则给原始文件
EnableDownloadsND_ENABLEDOWNLOADStrueUI 下载功能开关
Jukebox.EnabledND_JUKEBOX_ENABLEDfalse点唱机模式:服务端音频设备直接出声(依赖 mpv)
MPVPathND_MPVPATH空(搜 PATH)mpv 可执行文件路径,点唱机模式依赖
UIPlaybackReportIntervalND_UIPLAYBACKREPORTINTERVAL1mWeb UI 上报播放进度的间隔

转码缓存生效验证:配置 TranscodingCacheSize = '150MiB' 后启动日志出现 Creating Transcoding cache maxSize="150 MB" path=/data/cache/transcoding(实测;大小单位支持 MB/MiB,换算后转储为同一字节数)。

💡 技术拓展:转码目标格式的常见选择——

格式特点适用场景
Opus同码率音质最佳,浏览器/现代客户端支持好默认降采样格式(Navidrome 默认值即 opus)
AAC (m4a)兼容性广,苹果生态友好iOS 客户端、车机
MP3兼容性最好,同码率音质最差老设备兜底

Navidrome 默认用 Opus 作降采样格式;客户端明确指定 format 参数时按客户端要求转码。

5.4 封面与图片参数

参数环境变量默认值说明
CoverArtPriorityND_COVERARTPRIORITYcover.*, folder.*, front.*, embedded, external专辑封面查找顺序
ArtistArtPriorityND_ARTISTARTPRIORITYartist.*, album/artist.*, external艺人图片查找顺序
DiscArtPriorityND_DISCARTPRIORITYdisc*.*, cd*.*, cover.*, ...多碟专辑碟片图查找顺序
CoverArtQualityND_COVERARTQUALITY75缩放封面 JPEG/WebP 质量(1-100)
ImageCacheSizeND_IMAGECACHESIZE100MB图片缓存大小,0 禁用
EnableArtworkPrecacheND_ENABLEARTWORKPRECACHEtrue新入库音乐预生成封面缓存
EnableArtworkUploadND_ENABLEARTWORKUPLOADtrue允许 UI 上传封面(播放列表/艺人/电台)
MaxImageUploadSizeND_MAXIMAGEUPLOADSIZE10MB上传图片大小上限
MaxImageSizeND_MAXIMAGESIZE20MB读取的图片大小上限,超限跳过
EnableCoverAnimationND_ENABLECOVERANIMATIONtrue播放器封面旋转动画
EnableWebPEncodingND_ENABLEWEBPENCODINGfalse缩放封面编码为 WebP(更省流量,多耗 CPU,老客户端可能不支持)
UICoverArtSizeND_UICOVERARTSIZE300UI 请求的封面像素尺寸,钳制在 200-1200

💡 说明:CoverArtPriority 中特殊值 embedded 表示读音频文件内嵌封面,external 表示外部元数据源。高分辨率库(PNG 大图)建议调大 MaxImageSize;移动流量敏感场景可开 EnableWebPEncoding。

5.5 用户与界面参数

参数环境变量默认值说明
DefaultThemeND_DEFAULTTHEMEDark新浏览器默认主题(须与 UI 中选项名一致)
DefaultLanguageND_DEFAULTLANGUAGEen新浏览器默认语言,中文简体为 zh-Hans
DefaultUIVolumeND_DEFAULTUIVOLUME100默认音量(0-100)
UIWelcomeMessageND_UIWELCOMEMESSAGE空登录页欢迎语
UILoginBackgroundUrlND_UILOGINBACKGROUNDURL官方 Unsplash 背景登录页背景图 URL
UISearchDebounceMsND_UISEARCHDEBOUNCEMS200搜索框防抖毫秒数
MaxSidebarPlaylistsND_MAXSIDEBARPLAYLISTS100侧边栏播放列表数量上限
EnableUserEditingND_ENABLEUSEREDITINGtrue普通用户可改个人资料与密码
EnableFavouritesND_ENABLEFAVOURITEStrue收藏(心形)功能,映射 Subsonic Star
EnableStarRatingND_ENABLESTARRATINGtrue5 星评分功能
EnableSharingND_ENABLESHARINGtrue分享链接功能
DefaultShareExpirationND_DEFAULTSHAREEXPIRATION8760h(1 年)新分享默认有效期
DefaultDownloadableShareND_DEFAULTDOWNLOADABLESHAREfalse新分享默认可下载
ShareURLND_SHAREURL空(服务器地址)分享链接的基础地址(Tailscale/内网穿透场景用)

DefaultLanguage: zh-Hans 与 SessionTimeout: 24h 组合注入后的启动日志验证(实测):

time="2026-10-25T03:15:01Z" level=info msg="Setting Session Timeout" value=24h

5.6 安全与认证参数

参数环境变量默认值说明
AuthRequestLimitND_AUTHREQUESTLIMIT5单 IP 在时间窗内允许的登录尝试次数,0 关闭限流
AuthWindowLengthND_AUTHWINDOWLENGTH20s登录限流时间窗
EnableLogRedactingND_ENABLELOGREDACTINGtrue日志脱敏(令牌、密码及部分敏感值打码)
PasswordEncryptionKeyND_PASSWORDENCRYPTIONKEY-(自动生成)库内密码加密口令;多实例共享数据目录时须一致
EnforceNonRootUserND_ENFORCENONROOTUSERfalse开启后以 root(UID 0)运行直接报错退出
ExtAuth.UserHeaderND_EXTAUTH_USERHEADERRemote-User外部认证代理传递用户名的请求头
ExtAuth.TrustedSourcesND_EXTAUTH_TRUSTEDSOURCES空(全拒绝)允许使用反代认证的来源 CIDR 列表
ExtAuth.LogoutURLND_EXTAUTH_LOGOUTURL空外部认证注销后的跳转地址
HTTPHeaders.FrameOptionsND_HTTPHEADERS_FRAMEOPTIONSDENYX-Frame-Options 响应头值
Subsonic.DefaultReportRealPathND_SUBSONIC_DEFAULTREPORTREALPATHfalseAPI 返回文件真实路径(有信息泄露风险,默认关)

登录限流默认值生效的启动日志(实测):

time="2026-10-25T03:13:07Z" level=info msg="Login rate limit set" requestLimit=5 windowLength=20s

日志脱敏实测:debug 配置转储中 Prometheus.MetricsPath 被显示为 [REDACTED](见 3.5 节回显),即 EnableLogRedacting=true 的效果。排障需要看全量值时可临时设 EnableLogRedacting = false,查完改回。

5.7 备份与维护参数

参数环境变量默认值说明
Backup.PathND_BACKUP_PATH空(禁用)自动备份落盘目录;设空串禁用
Backup.ScheduleND_BACKUP_SCHEDULE空(禁用)自动备份计划,Cron 或 @every 语法
Backup.CountND_BACKUP_COUNT0(禁用)保留备份份数,超出自动清理最旧
EnableScheduledDBAnalyzeND_ENABLESCHEDULEDDBANALYZEtrue每 30 分钟检查并刷新 SQLite 查询统计(ANALYZE)

实测:配置 Backup.Path=/var/lib/navidrome/backups、Backup.Schedule='@every 1m'、Backup.Count=3 后:

启动日志:

time="2026-10-25T03:17:57Z" level=info msg="Scheduling periodic backup" schedule="@every 1m"

一个调度周期后备份目录出现备份文件:

-rw-r--r-- 1 root root 724992 Oct 25 03:18 navidrome_backup_2026.10.25_03.18.57.db

💡 说明:备份文件是完整的 SQLite 数据库快照,文件名含时间戳。自动备份只覆盖数据库,不含曲库文件本身;曲库应有文件系统级的独立备份。手动备份/恢复用内置 CLI(navidrome backup create/restore,见《Navidrome 0.64.2 常用 CLI 命令与工具详解》 backup 一节)。

5.8 外部集成参数

参数环境变量默认值说明
AgentsND_AGENTSdeezer,lastfm,listenbrainz艺人信息/图片元数据代理及优先级
LastFM.EnabledND_LASTFM_ENABLEDtrueLast.fm 集成总开关
LastFM.ApiKey / LastFM.SecretND_LASTFM_APIKEY / ND_LASTFM_SECRET空Last.fm API 凭据(scrobble 必填)
ListenBrainz.EnabledND_LISTENBRAINZ_ENABLEDtrueListenBrainz 集成开关
ListenBrainz.BaseURLND_LISTENBRAINZ_BASEURLhttps://api.listenbrainz.org/1/可指向自建 Maloja
Deezer.EnabledND_DEEZER_ENABLEDtrueDeezer 集成开关
EnableExternalServicesND_ENABLEEXTERNALSERVICEStrue全部外部集成总闸,false 时连登录背景图与匿名收集一并关闭
EnableInsightsCollectorND_ENABLEINSIGHTSCOLLECTORtrue匿名数据收集开关
EnableGravatarND_ENABLEGRAVATARfalse用户头像用 Gravatar
GATrackingIDND_GATRACKINGID空(禁用)向自己的 GA 账号上报
LyricsPriorityND_LYRICSPRIORITY.ttml,.yaml,.yml,.elrc,.lrc,.srt,.txt,embedded歌词来源优先级

EnableInsightsCollector = false 生效验证:debug 配置转储显示 EnableInsightsCollector: false,且启动日志不再出现默认开启时的 Starting Insight Collector 行(实测)。

⚠️ 内网隔离环境(无法访问外网)建议显式关闭 EnableExternalServices:实测断网启动时日志会周期性出现 Could not get background images from image service 的 warning(拉取登录背景图超时),关闭后消失。

5.9 Jellyfin 兼容层参数

参数环境变量默认值说明
Jellyfin.EnabledND_JELLYFIN_ENABLEDfalse开启实验性 Jellyfin API,Jellyfin 音乐客户端可直连
Jellyfin.ServerNameND_JELLYFIN_SERVERNAMENavidrome <version>Jellyfin 客户端显示的服务器名
Jellyfin.AutoDiscoveryND_JELLYFIN_AUTODISCOVERYfalse应答局域网 UDP 7359 自动发现
Jellyfin.QuickConnectND_JELLYFIN_QUICKCONNECTtrue6 位码快速登录新设备
Jellyfin.ExposedPublicUsersND_JELLYFIN_EXPOSEDPUBLICUSERS空客户端登录页展示的用户名列表(任何可达者可见,慎开)
Jellyfin.MaxConcurrentStreamsND_JELLYFIN_MAXCONCURRENTSTREAMS半数连接池(至少 2)大列表响应并发上限

💡 说明:Jellyfin 兼容层解决的是「手边只有 Jellyfin 客户端」的复用诉求,功能面以音乐播放为主。已有 Subsonic 客户端的用户无需开启。

5.10 搜索与 Subsonic API 参数

参数环境变量默认值说明
Search.BackendND_SEARCH_BACKENDfts全文检索后端:fts(FTS5 + BM25 排序)或 legacy(旧实现)
Search.FullStringND_SEARCH_FULLSTRINGfalse任意子串匹配(对中文等非空格分词语言更友好)
Subsonic.LegacyClientsND_SUBSONIC_LEGACYCLIENTSDSub不启用 OpenSubsonic 扩展的老客户端名单
Subsonic.MinimalClientsND_SUBSONIC_MINIMALCLIENTSSubMusic只回最小字段集的客户端名单
Subsonic.AppendSubtitleND_SUBSONIC_APPENDSUBTITLEtrue曲名副标题追加显示
Subsonic.AppendAlbumVersionND_SUBSONIC_APPENDALBUMVERSIONtrue专辑名追加版本信息(如 Deluxe Edition)
Subsonic.ArtistParticipationsND_SUBSONIC_ARTISTPARTICIPATIONSfalse艺人页包含其参与的合辑
Subsonic.EnableAverageRatingND_SUBSONIC_ENABLEAVERAGERATINGtrueAPI 响应包含全用户平均评分
IndexGroupsND_INDEXGROUPSA B C ... X-Z(XYZ) [Unknown]([)艺人索引分组(字母快捷条)
IgnoredArticlesND_IGNOREDARTICLESThe El La Los Las Le Les Os As O A排序忽略的冠词,可追加中文「The」等习惯前缀

💡 技术拓展:全文检索后端 fts 与 legacy 的取舍——

后端机制特点
fts(默认)SQLite FTS5 倒排索引 + BM25 相关性排序检索质量高,支持相关性排序
legacy旧版字符串匹配实现行为与老版本一致,供回归兜底

中文曲库建议保持 fts 并开启 Search.FullString(中文无空格分词,默认词边界匹配易漏结果)。

六、生产配置模板

适用场景:家庭/小团队自托管,8GB 内存、NVMe SSD、曲库 1-5 万首、2-5 个并发听众,曲库挂本地盘或 NAS。

# /etc/navidrome/navidrome.toml
# —— 基础运行 ——
MusicFolder = '/srv/music'
DataFolder = '/var/lib/navidrome'
Address = '0.0.0.0'
Port = 4533
LogLevel = 'info'
SessionTimeout = '24h'

# —— 扫描 ——
Scanner.Schedule = '@every 24h'
Scanner.WatcherWait = '5s'

# —— 转码与缓存(按 SSD 余量调整)——
TranscodingCacheSize = '500MiB'
ImageCacheSize = '500MiB'
Transcoding.MaxConcurrent = '2'
Transcoding.MaxConcurrentPerUser = '1'

# —— 界面 ——
DefaultLanguage = 'zh-Hans'
DefaultTheme = 'Dark'
UIWelcomeMessage = 'Welcome to my music library'

# —— 安全 ——
AuthRequestLimit = 5
AuthWindowLength = '20s'
EnableLogRedacting = true

# —— 自动备份(每晚 3 点,保留 7 份)——
Backup.Path = '/var/lib/navidrome/backups'
Backup.Schedule = '0 3 * * *'
Backup.Count = 7

# —— 内网/离线环境建议 ——
EnableExternalServices = false
EnableInsightsCollector = false

模板要点解读:

  • Transcoding.MaxConcurrent='2':限制全局并发转码进程数,防止多客户端同时请求低码率流时 ffmpeg 把 2-4 核小主机打满;内网高带宽、全无损听众可省略此行
  • Backup.Schedule='0 3 * * *':Cron 表达式每晚 3 点备份,Count=7 保留一周滚动窗口
  • EnableExternalServices=false:家庭内网场景通常无外网出口或不愿泄露收听行为,关闭后同时停用匿名收集与登录页外网背景图
  • 曲库在 NFS/SMB 挂载上时,inotify 不可靠,Scanner.Schedule 兜底扫描要保留;本地盘可放宽到 '@every 1h'

小内存设备(树莓派级,1-2GB 内存):把两个缓存降为 150MiB,Transcoding.MaxConcurrent 降为 '1',其余不变——Navidrome 空载常驻内存约几十 MB,内存压力主要来自并发转码与缓存。

七、常见问题

Q1:改了配置重启后没生效?

按 3.4 节排查注入链路:确认配置文件路径正确(Loaded configuration file=... 日志是否存在)→ 是否有环境变量或命令行参数压住了配置文件 → 用 3.5 节 debug 转储直接核对生效值。典型踩坑是 ND_SCANSCHEDULE 旧名(见 5.2 节警告)。

Q2:环境变量和配置文件都想用,到底听谁的?

实测优先级为命令行参数 > 环境变量 > 配置文件(与官方文档标注相反,证据见 3.4 节)。推荐同一参数只走一种方式:systemd/编排场景用环境变量或配置文件二选一,命令行只传 -c。

Q3:日志里出现 [REDACTED],是配置错了吗?

不是,这是 EnableLogRedacting=true 的日志脱敏行为(见 5.6 节实测),被遮蔽的多为凭据与部分路径类值。临时排障可设 EnableLogRedacting = false 看全量值,查完务必改回。

Q4:备份目录里积累了很多备份文件?

Backup.Count 控制保留份数(默认 0 表示不清理)。设为 7 即保留最近 7 份,旧备份由服务端自动清理;也可用 navidrome backup prune 手动清理(见 CLI 篇)。

Q5:开了 HTTPS 后,明文 HTTP 请求返回 400?

TLSCert/TLSKey 同时配置后服务只提供 HTTPS 监听(实测:HTTPS 200,明文 400)。这是预期行为;需要 HTTP 与 HTTPS 并存时,用反向代理终结 TLS、Navidrome 本身保持 HTTP。

Q6:/metrics 端点 404?

Prometheus 指标端点默认关闭,需 Prometheus.Enabled = true。开启后 curl http://127.0.0.1:4533/metrics 返回 200 与指标文本(实测 8823 字节,含 db_model_totals、go_gc_duration_seconds、go_goroutines 等指标族)。生产建议配合 Prometheus.Password 开启 Basic Auth(用户名固定 navidrome)或用反向代理限制来源。

八、参考链接