Jellyfin
Jellyfin 是一款免费开源的多媒体应用程序套件,旨在组织、管理和共享数字媒体文件到网络设备。
安装
有几种安装选项
- jellyfin-server — 主服务器后端
- jellyfin-web — 托管 Web 前端所需。或者,在配置文件中添加
hostwebclient=false。 - jellyfin-gitAUR — 从最新提交编译
启动/启用 jellyfin.service systemd 服务单元。首次启动时,Jellyfin 将在 /var/lib/jellyfin/ 默认位置创建配置文件和数据目录。
要开始配置 Jellyfin,请访问 https://:8096/ 并完成初始设置向导。这仅在安装了 jellyfin-web 的情况下才可能。
配置
Nginx 反向代理
以下配置描述了一个带有示例证书的 Nginx 反向代理。请务必修改模板以适应您的具体情况。有关更多反向代理配置示例,请参阅 上游文档。
Content-Security-Policy 头部,以避免通过反向代理访问 Jellyfin 时出现功能缺失。/etc/nginx/sites-available/domain.com.conf
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name DOMAIN_NAME;
# use a variable to store the upstream proxy
# in this example we are using a hostname which is resolved via DNS
# (if you are not using DNS remove the resolver line and change the variable to point to an IP address e.g `set $jellyfin 127.0.0.1`)
set $jellyfin jellyfin;
resolver 127.0.0.1 valid=30;
ssl_certificate /etc/letsencrypt/live/DOMAIN_NAME/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/DOMAIN_NAME/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
add_header Strict-Transport-Security "max-age=31536000" always;
ssl_trusted_certificate /etc/letsencrypt/live/DOMAIN_NAME/chain.pem;
ssl_stapling on;
ssl_stapling_verify on;
# Security / XSS Mitigation Headers
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
# Content Security Policy
# See: https://mdn.org.cn/en-US/docs/Web/HTTP/CSP
# Enforces https content and restricts JS/CSS to origin
# External Javascript (such as cast_sender.js for Chromecast) must be whitelisted.
#add_header Content-Security-Policy "default-src https: data: blob: http://image.tmdb.org; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' https://www.gstatic.com/cv/js/sender/v1/cast_sender.js https://www.youtube.com blob:; worker-src 'self' blob:; connect-src 'self'; object-src 'none'; frame-ancestors 'self'";
location = / {
return 302 https://$host/web/;
}
location / {
# Proxy main Jellyfin traffic
proxy_pass http://$jellyfin:8096;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Forwarded-Host $http_host;
# Disable buffering when the nginx proxy gets very resource heavy upon streaming
proxy_buffering off;
}
# location block for /web - This is purely for aesthetics so /web/#!/ works instead of having to go to /web/index.html/#!/
location = /web/ {
# Proxy main Jellyfin traffic
proxy_pass http://$jellyfin:8096/web/index.html;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Forwarded-Host $http_host;
}
location /socket {
# Proxy Jellyfin Websockets traffic
proxy_pass http://$jellyfin:8096;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Forwarded-Host $http_host;
}
}
CSS 自定义
服务器管理员可以通过 Web 仪表板上的自定义 CSS 字段修改 Jellyfin 的外观。许多来源提供了可移植的 CSS 代码块来更改服务器的字体、颜色和布局。一些示例包括 Ultrachromic 和 上游文档。
插件
Jellyfin 拥有许多社区开发的插件,可以从 Web 仪表板安装。默认情况下,插件会自动更新。
文件权限
Jellyfin 以用户 jellyfin 身份运行,该用户对您的主目录没有权限。如果您将主目录下的文件夹添加到库中,Jellyfin 将无法访问。您可以为 Jellyfin 创建一个专用文件夹。
# mkdir /media
为了更方便地管理,您可能需要将该文件夹的所有者更改为您的当前用户。
# chown $USER: /media
Intel Quick Sync Video (QSV) 加速硬件转码
为了使用自定义 jellyfin-ffmpeg 二进制文件实现此功能,必须安装可选依赖项 vpl-gpu-rt 或 vpl-gpu-rt-gitAUR。
有关更多详细信息,请参阅 官方指南。
客户端
除了 Web 界面,还有其他桌面客户端可供选择。
- Jellyfin Media Player — 功能强大的桌面客户端,使用 jellyfin-web 和嵌入式 MPV 播放器以获得最大的编解码器兼容性
- Jellyfin MPV Shim — Jellyfin 的投射客户端
- jftui — 与 MPV 接口的命令行客户端
- delfin — 从 Jellyfin 流式传输电影和电视节目
故障排除
Jellyfin 未检测到文件夹或外部驱动器
为了让 Jellyfin 能够识别文件夹,需要赋予其读写和执行权限。这是因为 Jellyfin 以用户 "jellyfin" 身份运行,而不是您的用户。因此,默认情况下它无法访问您的 /home/ 文件夹。最佳实践是将媒体放在根文件夹中的一个文件夹里(例如 /jellyfinmedia/)或放在外部驱动器上。然后,您需要通过下面的代码赋予其读写和执行权限,或者通过文件管理器进行设置。
# chmod -R 775 path/to/media/folder
如果尚未设置,请将所有者/组设置为您的用户名。
# chown yourusername:yourusername /mediafolder
外部驱动器
如果您没有明确为驱动器设置挂载配置,您的桌面环境(例如 GNOME 或 KDE)在您通过其文件管理器访问驱动器时,可能会自动挂载它。Jellyfin 将无法访问该驱动器。这是因为桌面环境通过(FUSE)将驱动器挂载到您的用户,而 Jellyfin 默认使用 "Jellyfin" 用户。
您需要手动挂载驱动器,Jellyfin 才能识别它们,具体方法是设置挂载点。有关更多详细信息,请参阅 Fstab。您也可以使用 KDE Partition Manager 或 GNOME Disks 等程序来设置分区的挂载点。请确保为外部驱动器设置正确的用户权限。
播放问题
Jellyfin 有时无法播放特定的媒体文件。大多数媒体文件都应该与 Jellyfin 兼容,因为它会自动检测媒体格式并进行转码(使用 ffmpeg)为客户端可以处理的格式。然而,这是一个复杂的过程,可能因各种原因而失败。Jellyfin 的特定插件使用不同的方法处理转码过程,这使得问题更加复杂。因此,下面提供了故障排除提示,并参考了特定的插件/客户端。然而,这些问题可能出现在不同的 Jellyfin 客户端或不同的 Jellyfin 插件中。
- 使用 TVHeadend Jellyfin 插件时,录制播放正常,但观看直播电视会因客户端上的不支持的格式错误而失败。检查 Dashboard > Playback > Transcode Path 配置。确保路径中没有尾部斜杠。例如,
/var/transcode是可以的,但/var/transcode/不行。这可能在未来得到修复。请参阅问题:https://github.com/jellyfin/jellyfin/issues/10299 - 使用 Jellyfin Web 客户端时,某些媒体文件的播放会随机失败。检查 User > Settings > Playback > Maximum Allowed Audio Channels 是否设置为 "Stereo"。某些浏览器不支持 6 声道音频,而某些录制的电视广播有时包含 6 声道音频,导致 Web 客户端无法播放其他有效的录制内容。强制立体声音频应该可以解决这个问题。请参阅相关的 Bug 报告,其中显示了检查视频中音频声道数量的一些工具:https://github.com/Dash-Industry-Forum/dash.js/issues/2864。
- 提示 Jellyfin Web 客户端使用 HLS.js,而不是 dash.js,但如果对媒体包含多少音频声道不确定,上面链接的 dash.js 问题可能会有所帮助。
更新后 Web 界面重定向到设置向导
一些 用户报告,在更新后,Web UI 不允许他们登录,而是显示初始设置向导。要解决此问题,请确保在 /etc/jellyfin/system.xml 中将 IsStartupWizardCompleted 的值设置为 true。
使用 Intel DG2 硬件解码/编码时转码速度极慢
如果转码速度变得极慢(每秒不到 5 帧),并且您正在使用 Intel DG2/Alchemist GPU 进行硬件解码/编码,请确保您使用的是 i915 内核驱动程序而不是 xe 内核驱动程序。
有关更多信息,请参阅 xe 模块问题跟踪器上的此票证:https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/234
要禁用 xe 驱动程序,请在 /etc/modprobe.d 中创建一个文件
/etc/modprobe.d/disable-intel-xe.conf
install xe /bin/true
创建文件后需要重启。
加固
与其他服务一样,Jellyfin 可以通过修改其 systemd unit 来进行加固。在文献中,加固也称为“沙盒化”。以下沙盒化选项是限制进程对系统暴露的有效方法。
创建以下 drop-in 文件
/etc/systemd/system/jellyfin.service.d/override.conf
[Service] PrivateTmp = true ProtectSystem = strict ProtectHome = true ProtectKernelTunables = true ReadWritePaths= /etc/jellyfin /var/cache/jellyfin /var/lib/jellyfin /var/log/jellyfin ReadOnlyPaths = /mnt/mymovies InaccessiblePaths = /mnt/mybackup
这将允许 Jellyfin 仅写入 /etc/jellyfin、/var/cache/jellyfin、/var/lib/jellyfin、/var/log/jellyfin,并限制对文件系统的其他部分的写入。它还将拒绝访问整个 /home 目录,并限制对 /etc 的访问。这还会限制对 /mnt/mybackup 的任何访问。此选项可以指定多个路径。
有关 systemd 沙箱选项的更多详细信息,请参阅 systemd.exec(5) § SANDBOXING。