跳转至内容

Jellyfin

来自 ArchWiki

Jellyfin 是一款免费开源的多媒体应用程序套件,旨在组织、管理和共享数字媒体文件到网络设备。

安装

有几种安装选项

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

要开始配置 Jellyfin,请访问 https://: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) 加速硬件转码

为了使用自定义 jellyfin-ffmpeg 二进制文件实现此功能,必须安装可选依赖项 vpl-gpu-rtvpl-gpu-rt-gitAUR

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

客户端

除了 Web 界面,还有其他桌面客户端可供选择。

  • Jellyfin Media Player — 功能强大的桌面客户端,使用 jellyfin-web 和嵌入式 MPV 播放器以获得最大的编解码器兼容性
https://github.com/jellyfin/jellyfin-media-player/ || jellyfin-desktopAUR
  • 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 插件时,录制播放正常,但观看直播电视会因客户端上的不支持的格式错误而失败。检查 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

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.