效率工具

Caddy 与 Tailscale:同域名访问 Jellyfin 和 Navidrome,并测试移动端码率

用一个域名同时提供 Jellyfin(影视)和 Navidrome(音乐,挂在 /music 子路径下),由 Caddy 自动配置 HTTPS。家里人在外面用手机听歌,通过 Tailscale 连回家,不在路由器上开端口。另外有一个脚本实测各个码率实际消耗多少流量,帮你在手机客户端里选合适的转码设置。

BINBHO · 图文教程

用一个域名同时提供 Jellyfin(影视)和 Navidrome(音乐,挂在 /music 子路径下),由 Caddy 自动配置 HTTPS。家里人在外面用手机听歌,通过 Tailscale 连回家,不在路由器上开端口。另外有一个脚本实测各个码率实际消耗多少流量,帮你在手机客户端里选合适的转码设置。

先看清成品

  • 实测环境: Caddy 2(tls internal)+ Navidrome(ND_BASEURL=/music)+ Jellyfin,两条路径都返回 200。
  • 码率实测:
    • 96 kbps 的 flac 转成 128k mp3 后反而变大了(128%)。
    • 192k 的 mp3 转成 128k mp3 后是原文件的 67%。
    • 标称 64k 的 opus 实测大约 70–80 kbps。
  • 没有测过: Tailscale(box 没有登录 tailnet)、真机手机客户端;只检查了 tailscale.sh 的语法。

注意:只给自己有权使用的音乐建库,比如自己购买的 CD 转录、正版下载、开放授权的作品。不要用 Navidrome 给别人分发音乐。本篇的测试音频全部是 ffmpeg 生成的正弦波。

做完之后你会得到什么?

成果 说明
Caddyfile handle /music* 交给 Navidrome,其余路径交给 Jellyfin
docker-compose.yml caddy + navidrome + jellyfin 放在同一个网络里
tailscale.sh tailscale serve --bg 只对自己的设备开放
mobile_check.py 原始文件和各种转码的实际大小、码率对比,并给出建议

需要准备哪些环境?

项目 要求 说明
证书 内网用 tls internal,有公网域名就用自动证书 用内网 CA 时,手机上要安装它的根证书
Tailscale 在这台机器和手机上都登录同一个 tailnet 不需要开端口;Funnel 会公开到公网,不建议使用
手机客户端 任意 Subsonic 兼容客户端 服务器地址填 https://域名/music

文件结构

40-navidrome-C-src/
├── Caddyfile
├── docker-compose.yml
├── tailscale.sh
├── mobile_check.py
└── subsonic_cli.py

第 1 步:一个域名,两个服务

Caddyfile:

# Navidrome 挂在 /music 子路径下,和 Jellyfin 共用一个域名(Navidrome 要设置 ND_BASEURL=/music)
# handle 会保留 /music 前缀转发给 Navidrome(不要用 handle_path,它会把前缀去掉)
media.home.arpa {
	tls internal
	handle /music* {