它是什么
这是家里自建的影音库:电影和剧集放在 NAS 的 3TB 盘上,用 Jellyfin 统一管理和播放,手机、电脑、电视都能直接看。外网走 https://video.xiejun-server.top,在家就走内网 http://192.168.50.223:8096,速度更快;主页 https://xiejun-server.top 上也有「影音」卡片入口。
为什么做
公有平台片源分散、会员一直涨价,还得担心下架。自己的片子自己管:加片只要把文件丢进 NAS 对应目录,Jellyfin 自动扫描入库,海报和简介自动补齐。转码交给 .223 的 Intel Iris Plus 655 核显(VAAPI),电视盒子这类弱客户端也能流畅播放,不用额外买硬件。
现在什么状态
运行中。容器是 jellyfin/jellyfin:latest,compose 放在 /opt/jellyfin;公网链路是公网 443 → 香港 VPS 上的 frps 按 SNI 分流 → NPM 反代到 192.168.50.223:8096。最近修掉了国内 DNS 污染导致抓不到海报的问题:给容器指定本机 unbound,只把影视元数据域名经 SSH 隧道送到香港解析,普通域名仍走国内。媒体库现在是空的,等着放片。
功能
- NAS 上的电影/剧集目录自动扫描入库,加片就是丢文件
- Intel 核显 VAAPI 硬件转码,弱客户端也能流畅播
- 手机/外网与内网双入口,主页有「影音」卡片
- 公网 443 → 香港 VPS frps 按 SNI 分流 → NPM 反代
- 自建 DNS 通道解决 TMDB 被污染、海报抓不到的问题
- 带一键重装脚本与明确回退步骤
技术栈
使用 / 部署教程
部署步骤
1. 准备目录 在宿主机建好设置与缓存目录,媒体目录只读挂载:
/opt/jellyfin/config # 设置
/opt/jellyfin/cache # 转码缓存
/nas/影音/电影 # 只读
/nas/影音/剧集 # 只读
2. 写 compose 放在 /opt/jellyfin/docker-compose.yml,镜像用 jellyfin/jellyfin:latest。端口映射 8096(HTTP)、7359/udp(客户端发现)、1900/udp(DLNA)。硬件转码把 /dev/dri/renderD128 传进容器,并指定 dns: [192.168.50.223, 223.5.5.5]。然后 docker compose up -d。
3. 首次向导 等日志出现 Main: Startup complete 再去走 /Startup/* 向导,否则会出现「向导标记完成但没建用户」,只能重建数据库。注意 /health 和 /System/Info/Public 提前就返回 200,不能当就绪判据。
4. 配媒体库 添加媒体库时路径要写容器内路径(如 /media/电影),不是宿主机路径。命名建议:电影 片名 (年份).mkv,一部一个文件夹;剧集 剧名/Season 01/剧名 S01E01.mkv。之后「控制台 → 媒体库 → 扫描媒体库」可手动触发。
5. 硬件转码 控制台里选 VAAPI,设备选 renderD128,实测 h264_vaapi 编码通过。
6. 公网入口 公网 443 打到香港 VPS 的 frps,按 SNI 分流,再由 NPM 用 12-jellyfin.conf 反代到 192.168.50.223:8096;frpc 侧加上 video.xiejun-server.top。
7. 海报抓不到怎么办 先 dig +short @192.168.50.223 api.themoviedb.org,回真实 CloudFront IP 才算正常;容器内直连 https://api.themoviedb.org/3/ 应返回 401。海报突然没了,先 systemctl restart dns-hk-tunnel。
回退:删掉 NPM 的 12-jellyfin.conf 并 reload,再删 frpc 里对应两行重启;彻底删除就 docker compose down && rm -rf /opt/jellyfin。
注意
- 数据库文件 jellyfin.db 不要在服务运行时用外部 sqlite3 打开,会干扰 WAL 导致 malformed;要看就先复制文件或用只读模式
- 账号口令属于家庭常用密码,别写进公开文档,建议单独设一个并定期更换
- 海报依赖香港隧道与 unbound,链路断了只是抓不到元数据,但记得开机自启和备份 frpc/NPM 配置