Blame
012023 | Mayekkuzu | 2025-05-13 11:33:44 | 1 | # Jellyfin |
2 | ||||
3 | Jellyfin - стриминговый сервер, позволяющий организовать стриминг кинчиков, сериальчиков. Так же имеет фунционал для организации стриминга музыки и даже чтения книжек/комиксов, но удобство использования последних оставляет желать лучшего. |
|||
4 | ||||
5 | Поддерживает рендер видео на лету используя ресурсы CPU, что долго и ориентировано на 1 пользователя максимум, или же использование аппаратного рендера средствами QuickSync, VA-API, NVENC. По видеокарточкам - Nvidia GTX 1050 и выше, по QuickSync - Intel CPU 9 поколение+ желательно (Но без индекса F). |
|||
6 | ||||
7 | ## Установка с пакета (но через скрипт) |
|||
8 | В debian/ubuntu - лучших традициях через внешний sh скрипт |
|||
9 | ```bash |
|||
10 | curl https://repo.jellyfin.org/install-debuntu.sh | sudo bash |
|||
11 | sudo bash install-debuntu.sh |
|||
12 | ``` |
|||
13 | ||||
14 | ## Установка через бинарник |
|||
15 | Создадим папку и перейдем |
|||
16 | ```bash |
|||
17 | sudo mkdir /opt/jellyfin |
|||
18 | cd /opt/jellyfin |
|||
19 | ``` |
|||
20 | ||||
21 | Находим на странице [репозитория](https://repo.jellyfin.org/?path=/server/linux) ссылку на последнюю версию и копируем tar.gz. Далее скачаем и распакуем. После распаковки создадим символическую ссылку и создадим папки. |
|||
22 | ```bash |
|||
23 | sudo wget https://repo.jellyfin.org/files/server/linux/latest-stable/amd64/jellyfin_10.10.7-amd64.tar.gz |
|||
24 | sudo tar xvzf jellyfin_10.10.7-amd64.tar.gz |
|||
25 | sudo ln -s jellyfin_10.10.7 jellyfin |
|||
26 | sudo mkdir data cache config log |
|||
27 | ``` |
|||
28 | ||||
29 | Бинарник готов, осталось организовать FFmpeg. В связке с Jellyfin рекомендуется использовать кастомный билд который можно взять так же в [репозитории](https://repo.jellyfin.org/?path=/ffmpeg). В моем случае это Debian, поэтому просто находим deb пакет и ставим. |
|||
30 | ```bash |
|||
31 | wget https://repo.jellyfin.org/files/ffmpeg/debian/latest-7.x/amd64/jellyfin-ffmpeg7_7.1.1-2-bookworm_amd64.deb |
|||
32 | sudo dpkg -i jellyfin-ffmpeg7_7.1.1-2-bookworm_amd64.deb |
|||
33 | ``` |
|||
34 | ||||
35 | Создадим скрипт jellyfin.sh который будет запускаться как сервер |
|||
36 | ``` |
|||
37 | #!/bin/bash |
|||
38 | JELLYFINDIR="/opt/jellyfin" |
|||
39 | FFMPEGDIR="/usr/share/jellyfin-ffmpeg" |
|||
40 | ||||
41 | $JELLYFINDIR/jellyfin/jellyfin \ |
|||
42 | -d $JELLYFINDIR/data \ |
|||
43 | -C $JELLYFINDIR/cache \ |
|||
44 | -c $JELLYFINDIR/config \ |
|||
45 | -l $JELLYFINDIR/log \ |
|||
46 | --ffmpeg $FFMPEGDIR/ffmpeg |
|||
47 | ``` |
|||
48 | ||||
49 | Файлу дадим права на запуск и назначим пользователя: |
|||
50 | ```bash |
|||
51 | sudo chown -R user:group * |
|||
52 | sudo chmod u+x jellyfin.sh |
|||
53 | ``` |
|||
54 | ||||
55 | Далее создаем systemd службу которая будет запускаться автоматически при старте системы. Создадим файл `/etc/systemd/system/jellyfin.service` |
|||
56 | ``` |
|||
57 | [Unit] |
|||
58 | Description=Jellyfin |
|||
59 | After=network.target |
|||
60 | ||||
61 | [Service] |
|||
62 | Type=simple |
|||
63 | User=youruser |
|||
64 | Restart=always |
|||
65 | ExecStart=/opt/jellyfin/jellyfin.sh |
|||
66 | ||||
67 | [Install] |
|||
68 | WantedBy=multi-user.target |
|||
69 | ``` |
|||
70 | ||||
71 | По классике перезагружаем демон systemd и запускаем. Так же не забываем поставить на автостарт |
|||
72 | ```bash |
|||
73 | sudo systemctl daemon-reload |
|||
74 | sudo systemctl enable jellyfin.service |
|||
75 | sudo systemctl start jellyfin.service |
|||
76 | ``` |
|||
2fcfaa | Mayekkuzu | 2025-05-13 12:42:34 | 77 | |
78 | ## NVENC в Jellyfin |
|||
79 | Предварительно ознакомьтесь с разделом [Nvidia Driver и NVENC в Debian](/Hardware/GPU#nvidia-driver-nvenc-debianubuntu) |
|||
80 | ||||
81 | В разделе Administration -> Playback -> Transcoding переключите на Nvidia NVENC. В зависимости от желаемого поведения, поставьте галочки напротив интересующих кодеков. Чаще всего проставлять везде не обязательно, если фильмы храните в каком-то определенном формате. |
|||
82 | ||||
83 |  |
|||
84 | ||||
85 | Далее запустите фильм в UI Jellyfin и попробуйте понизить качество, к примеру до 10 Mbit |
|||
86 | ||||
87 |  |
|||
88 | ||||
89 | Если настроенно корректно, то в панели статистики увидите что производится транскодинг, будет указана причина почему он происходит и в nvidia-smi увидим процесс который использует NVENC. |
|||
90 | ||||
91 | Важно уточнить, что транскодинг производится в случаях когда: |
|||
92 | - Не хватает скорости интернет-соединения |
|||
93 | - Когда принудительно выставлена скорость потока воспроизведения |
|||
94 | - Когда исходный кодек несовместим с устроиством воспроизведения. К примеру браузер компьютера не может воспроизводить HEVC нативно. (см. скрин выше). |
|||
95 | ||||
96 | Если происходит ошибка воспроизведения при запуске, то или некорректно работает NVENC, или же несовместимый кодек. О проблеме можно узнать почитав логи воспроизведения которые есть так же в UI админки. Так же убедитесь, что места для транскодинга видео достаточно, обычно - не меньше 8 ГБ |
|||
efbf5c | Mayekkuzu | 2025-05-13 13:03:20 | 97 | |
98 | ## Jellyfin за реверспрокси Nginx |
|||
99 | ||||
100 | Базовая конфигурация выглядит так: |
|||
101 | ``` |
|||
102 | server { |
|||
103 | listen 443 ssl; |
|||
104 | listen [::]:443 ssl; |
|||
105 | http2 on; |
|||
106 | ||||
107 | server_name YOUR_HOSTNAME; |
|||
108 | ssl_protocols TLSv1.3 TLSv1.2; |
|||
109 | # Здесь серты Let's Encrypt |
|||
110 | ssl_certificate /etc/letsencrypt/live/YOUR_HOSTNAME/fullchain.pem; |
|||
111 | ssl_certificate_key /etc/letsencrypt/live/YOUR_HOSTNAME/privkey.pem; |
|||
112 | include /etc/letsencrypt/options-ssl-nginx.conf; |
|||
113 | ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; |
|||
114 | ssl_trusted_certificate /etc/letsencrypt/live/YOUR_HOSTNAME/chain.pem; |
|||
115 | ||||
116 | location / { |
|||
117 | # Proxy main Jellyfin traffic |
|||
118 | proxy_pass http://IP_YOUR_INSTANCE:8096; |
|||
119 | proxy_set_header Host $host; |
|||
120 | proxy_set_header X-Real-IP $remote_addr; |
|||
121 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
|||
122 | proxy_set_header X-Forwarded-Proto $scheme; |
|||
123 | proxy_set_header X-Forwarded-Protocol $scheme; |
|||
124 | proxy_set_header X-Forwarded-Host $http_host; |
|||
125 | ||||
126 | # Disable buffering when the nginx proxy gets very resource heavy upon streaming |
|||
127 | proxy_buffering off; |
|||
128 | } |
|||
129 | ||||
130 | location /socket { |
|||
131 | # Proxy Jellyfin Websockets traffic |
|||
132 | proxy_pass http://IP_YOUR_INSTANCE:8096; |
|||
133 | proxy_http_version 1.1; |
|||
134 | proxy_set_header Upgrade $http_upgrade; |
|||
135 | proxy_set_header Connection "upgrade"; |
|||
136 | proxy_set_header Host $host; |
|||
137 | proxy_set_header X-Real-IP $remote_addr; |
|||
138 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
|||
139 | proxy_set_header X-Forwarded-Proto $scheme; |
|||
140 | proxy_set_header X-Forwarded-Protocol $scheme; |
|||
141 | proxy_set_header X-Forwarded-Host $http_host; |
|||
142 | } |
|||
143 | } |
|||
144 | ||||
145 | server { |
|||
146 | listen 80; |
|||
147 | listen [::]:80; |
|||
148 | server_name YOUR_HOSTNAME; |
|||
149 | return 301 https://$host$request_uri; |
|||
150 | } |
|||
151 | ``` |