Jellyfin
Jellyfin 是一个自由开源的多媒体应用套件,旨在组织、管理和共享数字媒体文件到联网设备。
安装
有几种安装选项
- jellyfin-server — 主服务器后端
- jellyfin-web — 托管 Web 前端是必需的。或者,将
hostwebclient=false
添加到您的配置。 - jellyfin-gitAUR — 从最新提交编译
启动/启用 jellyfin.service
systemd 单元。首次启动时,Jellyfin 将在 /var/lib/jellyfin/
默认创建配置和数据目录。
要开始配置 Jellyfin,请浏览至 https://127.0.0.1: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) 加速硬件转码
必须安装可选依赖项 vpl-gpu-rt 或 vpl-gpu-rt-gitAUR 才能与自定义 jellyfin-ffmpeg
二进制文件一起使用。
有关更多详细信息,请参阅 官方指南。
客户端
除了 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 插件时,录制播放工作正常,但观看直播电视失败,客户端出现不支持的格式错误。检查仪表板 > 播放 > 转码路径配置。确保路径中没有尾部斜杠。例如,
/var/transcode
可以,但/var/transcode/
不可以。这可能会在将来修复。请参阅问题:https://github.com/jellyfin/jellyfin/issues/10299 - 当使用 Jellyfin Web 客户端时,某些媒体文件的播放会随机失败。检查用户 > 设置 > 播放 > 允许的最大音频通道数是否设置为“立体声”。某些浏览器不支持 6 声道音频,有时一些录制的电视广播包含 6 声道音频,导致 Web 客户端无法播放原本有效的录音。强制立体声音频应该可以解决此问题。请参阅此相关错误报告,其中显示了一些关于如何检查视频中音频通道数量的工具: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 单元来强化 Jellyfin。强化在文献中也称为沙盒化。以下沙盒选项是限制系统暴露于单元进程的有效方法。
创建以下drop-in 文件
/etc/systemd/system/jellyfin.service.d/harden.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) § 沙盒化。