# Jellyfin Jellyfin - стриминговый сервер, позволяющий организовать стриминг кинчиков, сериальчиков. Так же имеет фунционал для организации стриминга музыки и даже чтения книжек/комиксов, но удобство использования последних оставляет желать лучшего. Поддерживает рендер видео на лету используя ресурсы CPU, что долго и ориентировано на 1 пользователя максимум, или же использование аппаратного рендера средствами QuickSync, VA-API, NVENC. По видеокарточкам - Nvidia GTX 1050 и выше, по QuickSync - Intel CPU 9 поколение+ желательно (Но без индекса F). ## Установка с пакета (но через скрипт) В debian/ubuntu - лучших традициях через внешний sh скрипт ```bash curl https://repo.jellyfin.org/install-debuntu.sh | sudo bash sudo bash install-debuntu.sh ``` ## Установка через бинарник Создадим папку и перейдем ```bash sudo mkdir /opt/jellyfin cd /opt/jellyfin ``` Находим на странице [репозитория](https://repo.jellyfin.org/?path=/server/linux) ссылку на последнюю версию и копируем tar.gz. Далее скачаем и распакуем. После распаковки создадим символическую ссылку и создадим папки. ```bash sudo wget https://repo.jellyfin.org/files/server/linux/latest-stable/amd64/jellyfin_10.10.7-amd64.tar.gz sudo tar xvzf jellyfin_10.10.7-amd64.tar.gz sudo ln -s jellyfin_10.10.7 jellyfin sudo mkdir data cache config log ``` Бинарник готов, осталось организовать FFmpeg. В связке с Jellyfin рекомендуется использовать кастомный билд который можно взять так же в [репозитории](https://repo.jellyfin.org/?path=/ffmpeg). В моем случае это Debian, поэтому просто находим deb пакет и ставим. ```bash wget https://repo.jellyfin.org/files/ffmpeg/debian/latest-7.x/amd64/jellyfin-ffmpeg7_7.1.1-2-bookworm_amd64.deb sudo dpkg -i jellyfin-ffmpeg7_7.1.1-2-bookworm_amd64.deb ``` Создадим скрипт jellyfin.sh который будет запускаться как сервер ``` #!/bin/bash JELLYFINDIR="/opt/jellyfin" FFMPEGDIR="/usr/share/jellyfin-ffmpeg" $JELLYFINDIR/jellyfin/jellyfin \ -d $JELLYFINDIR/data \ -C $JELLYFINDIR/cache \ -c $JELLYFINDIR/config \ -l $JELLYFINDIR/log \ --ffmpeg $FFMPEGDIR/ffmpeg ``` Файлу дадим права на запуск и назначим пользователя: ```bash sudo chown -R user:group * sudo chmod u+x jellyfin.sh ``` Далее создаем systemd службу которая будет запускаться автоматически при старте системы. Создадим файл `/etc/systemd/system/jellyfin.service` ``` [Unit] Description=Jellyfin After=network.target [Service] Type=simple User=youruser Restart=always ExecStart=/opt/jellyfin/jellyfin.sh [Install] WantedBy=multi-user.target ``` По классике перезагружаем демон systemd и запускаем. Так же не забываем поставить на автостарт ```bash sudo systemctl daemon-reload sudo systemctl enable jellyfin.service sudo systemctl start jellyfin.service ``` ## NVENC в Jellyfin Предварительно ознакомьтесь с разделом [Nvidia Driver и NVENC в Debian](/Hardware/GPU#nvidia-driver-nvenc-debianubuntu) В разделе Administration -> Playback -> Transcoding переключите на Nvidia NVENC. В зависимости от желаемого поведения, поставьте галочки напротив интересующих кодеков. Чаще всего проставлять везде не обязательно, если фильмы храните в каком-то определенном формате.  Далее запустите фильм в UI Jellyfin и попробуйте понизить качество, к примеру до 10 Mbit  Если настроенно корректно, то в панели статистики увидите что производится транскодинг, будет указана причина почему он происходит и в nvidia-smi увидим процесс который использует NVENC. Важно уточнить, что транскодинг производится в случаях когда: - Не хватает скорости интернет-соединения - Когда принудительно выставлена скорость потока воспроизведения - Когда исходный кодек несовместим с устроиством воспроизведения. К примеру браузер компьютера не может воспроизводить HEVC нативно. (см. скрин выше). Если происходит ошибка воспроизведения при запуске, то или некорректно работает NVENC, или же несовместимый кодек. О проблеме можно узнать почитав логи воспроизведения которые есть так же в UI админки. Так же убедитесь, что места для транскодинга видео достаточно, обычно - не меньше 8 ГБ ## Jellyfin за реверспрокси Nginx Базовая конфигурация выглядит так: ``` server { listen 443 ssl; listen [::]:443 ssl; http2 on; server_name YOUR_HOSTNAME; ssl_protocols TLSv1.3 TLSv1.2; # Здесь серты Let's Encrypt ssl_certificate /etc/letsencrypt/live/YOUR_HOSTNAME/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/YOUR_HOSTNAME/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; ssl_trusted_certificate /etc/letsencrypt/live/YOUR_HOSTNAME/chain.pem; location / { # Proxy main Jellyfin traffic proxy_pass http://IP_YOUR_INSTANCE: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 /socket { # Proxy Jellyfin Websockets traffic proxy_pass http://IP_YOUR_INSTANCE: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; } } server { listen 80; listen [::]:80; server_name YOUR_HOSTNAME; return 301 https://$host$request_uri; } ```