想把自己的电影、电视剧、音乐和家庭视频整理成类似 Netflix 的界面,又不想把媒体库交给第三方平台,Jellyfin 是最常见的开源选择之一。它提供网页、电视、手机和桌面客户端,支持媒体刮削、字幕、多用户、断点续播、硬件转码和远程播放。
不过,用 VPS 搭建 Jellyfin 之前必须先算清楚三件事:媒体放在哪里、播放是否需要转码、出站流量是否够用。Jellyfin 本身免费,不代表服务器、存储、带宽和转码也免费。本文只讨论管理和播放你本人或团队拥有合法使用权的媒体文件。
Jellyfin 适合部署在 VPS 的情况:
- 媒体文件已经在 VPS、本地挂载盘或对象存储中;
- 主要使用 Direct Play,不需要频繁视频转码;
- 家庭成员分布在不同地区,需要远程访问;
- VPS 带宽和月流量足够;
- 能接受自己维护域名、HTTPS、备份和客户端兼容性。
下面几种情况更适合家庭服务器、NAS 或带 GPU 的独立服务器:
- 媒体都在家里的硬盘上;
- 经常播放 4K HDR、HEVC、AV1 或高码率原盘;
- 多个用户会同时播放;
- 客户端格式支持差,需要实时转码;
- VPS 只有共享 CPU、低流量和小磁盘。
如果只是个人观看,优先让客户端 Direct Play。转码是 Jellyfin 最吃资源的部分,也是普通 VPS 最容易卡住的地方。
| 播放方式 | 服务器工作量 | 画质 | 适用条件 |
|---|---|---|---|
| Direct Play | 最低 | 原始画质 | 客户端支持视频、音频和字幕格式 |
| Direct Stream | 较低 | 通常不重新编码视频 | 只需要更换容器封装 |
| Transcode | 最高 | 取决于设置 | 客户端不支持编码、码率过高或字幕需要烧录 |
例如,客户端支持 H.264、AAC 和 MP4 时,服务器往往可以 Direct Play。若视频是 HEVC、音频是 TrueHD,电视或浏览器不支持,就可能触发转码。外挂 SRT 字幕通常比较轻,但 ASS 特效字幕、图形字幕或字幕烧录可能让服务器重新编码整段视频。
购买 VPS 前不要只看 CPU 核心数。先检查常用客户端支持什么编码,再决定是否需要 GPU。
| 使用场景 | 推荐配置 | 说明 |
|---|---|---|
| 单人 1080p Direct Play | 2 核 2GB、40GB SSD | 媒体放外部存储时可用 |
| 2–3 人 Direct Play | 4 核 4GB、80GB NVMe | 重点看带宽和月流量 |
| 偶尔 1080p 软件转码 | 4–8 核高频 CPU、8GB | 共享 CPU VPS 不一定稳定 |
| 4K、HDR 或多路转码 | 独享 GPU、16GB+ 内存 | 优先独立服务器或 GPU 实例 |
| 大型本地媒体库 | 4 核 8GB、按容量配置磁盘 | 缓存和元数据放 SSD |
Jellyfin 数据库、海报、字幕、缩略图和转码缓存适合放 NVMe。媒体文件可以放大容量 HDD、块存储、NAS 或对象存储,但远程存储的延迟和出站费用会直接影响播放。
如果你还不确定 2 核 4GB 能跑什么,可以先看 VPS 配置怎么选。媒体库规模很大时,再参考 VPS 需要对象存储吗。
播放带宽大致等于视频平均码率。一个 10 Mbps 的视频,连续播放 1 小时大约消耗:
10 Mbps × 3600 秒 ÷ 8 ≈ 4.5 GB
每天播放 3 小时,一个月约为:
4.5 GB × 3 × 30 ≈ 405 GB
这还没有计算音频、字幕、海报、重复拖动和其他用户。如果两个人同时播放,瞬时带宽和月流量都要叠加。高码率 4K 视频可能达到 40–80 Mbps,一台标称 100 Mbps 的 VPS 很快就会接近上限。
“不限流量”也可能有公平使用、共享带宽或限速条款。上线前读清服务商政策,并配置 VPS 流量监控和超额预警。
建议使用 Ubuntu 22.04/24.04 LTS 或 Debian 12。先确认 Docker 可用:
docker version
docker compose version
创建 Jellyfin 目录:
sudo mkdir -p /opt/jellyfin/config
sudo mkdir -p /opt/jellyfin/cache
sudo mkdir -p /srv/media/movies
sudo mkdir -p /srv/media/tv
sudo chown -R "$USER":"$USER" /opt/jellyfin
sudo chmod -R 750 /opt/jellyfin
媒体目录可以由上传工具、SFTP、rclone 或独立存储挂载提供。不要把整个根目录、SSH 配置或其他用户家目录挂进 Jellyfin。
官方容器示例使用 jellyfin/jellyfin,映射 /config、/cache 和媒体目录。本文固定当前稳定版 10.11.11,并让 Web 端口只监听本机:
services:
jellyfin:
image: jellyfin/jellyfin:10.11.11
container_name: jellyfin
restart: unless-stopped
environment:
TZ: Asia/Shanghai
JELLYFIN_PublishedServerUrl: https://media.example.com
volumes:
- /opt/jellyfin/config:/config
- /opt/jellyfin/cache:/cache
- /srv/media/movies:/media/movies:ro
- /srv/media/tv:/media/tv:ro
ports:
- "127.0.0.1:8096:8096/tcp"
保存为 /opt/jellyfin/compose.yaml,然后启动:
cd /opt/jellyfin
docker compose up -d
docker compose ps
docker compose logs --tail=100 jellyfin
测试本机服务:
curl -I http://127.0.0.1:8096
官方示例还包含 UDP 7359,用于局域网自动发现。公网 VPS 通常不需要开放这个端口,客户端直接使用 HTTPS 域名连接更清楚。
媒体目录使用 :ro 只读挂载,可以避免 Jellyfin 或插件误删原始文件。需要在管理界面删除文件时,才考虑读写挂载;生产环境更建议通过独立文件管理流程维护媒体库。
准备域名 media.example.com,将 A 记录指向 VPS。以 Caddy 为例:
media.example.com {
reverse_proxy 127.0.0.1:8096
}
重载并检查:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
curl -I https://media.example.com
Jellyfin 会传输登录凭据、播放记录和媒体内容,不应该通过明文 HTTP 在公网访问。完整的 Caddy、DNS 和证书流程可以参考 VPS 用 Caddy 反向代理完全指南。
如果接入 Cloudflare,要注意单次上传、缓存、代理流量和服务条款。Jellyfin 的动态视频流通常不适合当作普通静态 CDN 内容缓存。不要为了“隐藏 IP”随意缓存私人媒体或绕过平台规则。
访问 https://media.example.com 后,按向导完成语言、管理员、媒体库和远程访问设置。
- 不使用
admin、域名或邮箱前缀作为用户名; - 设置随机长密码;
- 管理员只用于配置,日常播放使用普通账号;
- 不和 VPS、邮箱或云厂商账号复用密码;
- 不允许访客账号访问管理设置。
为电影和电视剧创建独立媒体库,路径分别选择:
/media/movies
/media/tv
不要把所有内容塞到一个目录,否则刮削器容易把电影、剧集、花絮和字幕识别混乱。
设置首选元数据语言和国家地区,再启用需要的元数据源。元数据抓取会下载海报、背景和演员信息,文件量大时会明显占用 /config 和缓存目录。
规范命名比反复手动匹配更省时间。
电影目录示例:
/srv/media/movies/
└── Movie Name (2025)/
├── Movie Name (2025).mkv
├── Movie Name (2025).zh-CN.srt
└── poster.jpg
电视剧目录示例:
/srv/media/tv/
└── Series Name (2025)/
└── Season 01/
├── Series Name S01E01.mkv
├── Series Name S01E01.zh-CN.srt
└── Series Name S01E02.mkv
年份、季号和集号写清楚,可以降低同名影片和特别篇识别错误。批量重命名前先保留原始文件清单,避免规则错误导致整库混乱。
Jellyfin 支持外挂字幕和内嵌字幕。为了减少转码:
- 优先使用客户端支持良好的 SRT;
- 字幕文件与视频同名;
- 使用
.zh-CN.srt、.en.srt等语言标记; - 避免把不需要的复杂 ASS 特效字幕设为默认;
- 图形字幕和字幕烧录会显著增加转码负载;
- 字体文件应放在明确的只读目录中。
如果有自定义字体,可以增加挂载:
volumes:
- /srv/fonts:/usr/local/share/fonts/custom:ro
字体来源需要合法,缺少字体会导致 ASS 字幕样式错误或回退。
Jellyfin 官方支持 Intel QSV、NVIDIA NVENC/NVDEC、AMD VA-API/AMF、Apple VideoToolbox 和 Rockchip RKMPP。Docker 官方镜像包含 jellyfin-ffmpeg,优先使用官方镜像中的 FFmpeg,不要随意替换成其他构建版本。
很多 VPS 控制台显示的虚拟显卡只负责控制台画面,不能用于视频转码。先检查:
lspci -nn | grep -Ei "3d|display|vga"
ls -l /dev/dri
没有 /dev/dri、NVIDIA 设备或明确 GPU 直通时,就不能假设硬件转码可用。
拥有 Intel iGPU 的独立服务器可以把 /dev/dri 映射进容器:
devices:
- /dev/dri:/dev/dri
宿主机用户、容器用户和 render/video 组权限必须匹配。映射成功后,在 Jellyfin 后台选择 QSV 或 VA-API,并测试实际播放日志。
NVIDIA 需要正确的宿主机驱动和 NVIDIA Container Toolkit。仅在 nvidia-smi 正常、容器能看到 GPU 后,再启用 NVENC。驱动、容器运行时和 GPU 会话限制都会影响可用性。
播放一个确定需要转码的测试文件,在 Jellyfin Dashboard 查看播放方式和转码原因,同时观察:
docker stats jellyfin
nvidia-smi
Intel/AMD 可以使用对应的 GPU 监控工具。CPU 占用很高不一定表示完全失败,因为字幕烧录、音频转换和部分滤镜仍可能落到 CPU。
下面几种做法比升级 VPS 更有效:
- 使用支持 HEVC、AV1、HDR 和常见音频格式的客户端;
- 为浏览器准备 H.264/AAC 兼容版本;
- 关闭不需要的字幕烧录;
- 将播放质量设为原始;
- 提前转码高频观看内容;
- 避免在共享 CPU VPS 上同时跑多个软件转码;
- 把转码缓存放到 SSD。
Direct Play 能同时降低 CPU、延迟和画质损失,是远程 Jellyfin 最值得优先优化的目标。
每位家庭成员创建独立账号,并按媒体库授权。不要共享管理员账号。
建议设置:
- 禁止普通用户删除媒体;
- 限制可以访问的媒体库;
- 为儿童账号设置内容等级;
- 限制远程播放码率;
- 关闭不使用的下载权限;
- 定期清理长期不用的设备和会话;
- 对公网登录设置反向代理限速或 VPN。
如果只有自己使用,可以通过 WireGuard、Tailscale 或 Headscale 进入私网后访问。站内已有 VPS 搭建 Headscale 教程,适合多设备统一管理。
优点是路径简单、延迟低。缺点是大容量 SSD 贵,整机故障时媒体和服务可能一起丢失。适合小型精选库,不适合无限增长。
块存储像本地磁盘一样使用,但通常按容量计费。确认 IOPS、吞吐、快照和跨区域恢复能力。网络盘断开时,Jellyfin 可能扫描到空目录,不要设置自动删除原始文件。
对象存储并不是标准文件系统。直接挂载可能遇到随机读取、缓存和请求费用问题。大量拖动进度条会产生范围请求,播放体验取决于挂载层和网络。
OpenList 可以聚合云盘,但再让 Jellyfin 通过 WebDAV 读取,会增加一层网络和故障点。个人测试可以使用,长期媒体库优先选择稳定的本地挂载、NAS、rclone 缓存或直接支持的存储方案。可以继续参考 VPS 搭建 OpenList 教程。
媒体文件通常体积很大,Jellyfin 配置数据却不大。至少备份:
/opt/jellyfin/config;compose.yaml;- Caddy/Nginx 配置;
- 用户、播放记录和插件配置;
- 自定义海报、字幕和 NFO;
- 媒体文件清单;
- 媒体文件本身的独立备份策略。
缓存目录可以重建,通常不需要长期备份。媒体文件不应只保存在同一台 VPS 上,至少保留第二份副本或可重新获取的来源。
升级前记录当前镜像并备份配置:
cd /opt/jellyfin
docker inspect jellyfin --format '{{.Config.Image}}'
docker compose config > compose.before-upgrade.yaml
sudo tar -czf jellyfin-config-$(date +%F).tar.gz config
把备份复制到另一台机器或对象存储,再修改镜像版本并重建:
docker compose pull
docker compose up -d
docker compose logs --tail=100 jellyfin
升级后检查登录、媒体库、插件、字幕、客户端连接和一次实际播放。若数据库已经迁移,只把镜像改回旧版本不一定能回滚,需要同时恢复升级前的 config 备份。
先确认 Jellyfin 本机端口:
docker compose ps
curl -I http://127.0.0.1:8096
本机正常而 HTTPS 返回 502,通常是反向代理上游地址、端口或 Docker 网络写错。
检查挂载路径和容器内目录:
docker exec jellyfin ls -la /media/movies
docker exec jellyfin ls -la /media/tv
宿主机有文件但容器里为空,通常是 Compose 路径、挂载时机或权限问题。
在 Dashboard 查看是 Direct Play 还是 Transcode,再检查 CPU、GPU、磁盘、上游存储和公网带宽。不能只根据首页 CPU 图判断。
切换到 SRT 字幕或关闭字幕测试。如果关闭后变成 Direct Play,说明原字幕格式或客户端兼容性触发了烧录。
检查客户端是否支持 HDR、电视是否开启正确模式、视频是否触发 tone mapping。HDR 转 SDR 对 GPU、驱动和 FFmpeg 要求较高,不适合在没有验证的普通 VPS 上盲目开启。
检查 /opt/jellyfin/cache,确认播放会话是否异常中断,并为缓存目录设置磁盘告警。不要直接删除正在使用的转码片段。
- 只管理和播放拥有合法使用权的媒体;
- Jellyfin 只通过 HTTPS 或 VPN 对外访问;
- 管理员和普通播放账号分开;
- 媒体目录默认只读挂载;
- 不公开共享整个媒体库;
- 不安装来源不明的插件;
- 定期更新 Jellyfin、Docker 和宿主机;
- 配置登录限速、流量告警和磁盘告警;
- 备份 config、反向代理和媒体清单;
- 升级前固定版本并做恢复点;
- 不利用服务器绕过地区、版权或平台访问限制;
- 阅读 VPS 服务商关于大流量、版权投诉和滥用的政策。
第一次搭建可以从 2 核 4GB、80GB NVMe、月流量 2TB 以上的 VPS 开始,只测试一个 1080p 媒体库和一个客户端。确保播放状态显示 Direct Play,再逐步增加用户、字幕和外部存储。
如果经常转码,别继续堆共享 CPU。优先改进客户端兼容性,或者换成带 Intel 核显、NVIDIA GPU 的独立服务器。对 4K HDR 和多人使用,带 GPU 的家庭服务器或独服通常比普通 VPS 更稳定。
Jellyfin 的最佳体验不是“服务器转码能力无限强”,而是媒体格式、客户端、存储和网络之间尽量匹配。先把 Direct Play 跑通,再谈远程分享和大型媒体库。
