Jellyfin

出自 ArchWiki

Jellyfin 是一个自由开源的多媒体应用套件,旨在组织、管理和共享数字媒体文件到联网设备。

安装

有几种安装选项

启动/启用 jellyfin.service systemd 单元。首次启动时,Jellyfin 将在 /var/lib/jellyfin/ 默认创建配置和数据目录。

要开始配置 Jellyfin,请浏览至 https://127.0.0.1:8096/ 并完成初始向导。仅当安装了 jellyfin-web 时才有可能。

注意: 如果此时出现问题,请检查是否有防火墙设置阻止连接到 Jellyfin。

配置

Nginx 反向代理

以下配置描述了带有示例证书的 Nginx 反向代理。请务必修改模板以适应您的情况。有关更多反向代理配置示例,请参阅 上游文档

注意: 取消注释并将外部 Web 资源的 URL 附加到 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-rtvpl-gpu-rt-gitAUR 才能与自定义 jellyfin-ffmpeg 二进制文件一起使用。

有关更多详细信息,请参阅 官方指南

客户端

除了 Web 界面,还有其他可用的桌面客户端。

  • Jellyfin Media Player — 强大的桌面客户端,使用 jellyfin-web 和嵌入式 MPV 播放器以获得最大的编解码器兼容性
https://github.com/jellyfin/jellyfin-media-player/ || jellyfin-media-playerAUR
  • Jellyfin MPV Shim — Jellyfin 的投射客户端
https://github.com/jellyfin/jellyfin-mpv-shim/ || jellyfin-mpv-shim
  • jftui — 与 MPV 接口的命令行客户端
https://github.com/Aanok/jftui || jftuiAUR
  • delfin — 从 Jellyfin 流式传输电影和电视节目
https://delfin.avery.cafe/ || delfin

故障排除

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) § 沙盒化