用一个域名同时提供 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* {