Свой медиасервер - это давно уже не экзотика для бородатых энтузиастов, а вполне практичный способ освободиться от подписок и хранить фильмотеку под собственным контролем. Plex десятилетиями оставался стандартом, но его курс на принудительный аккаунт на чужих серверах, скрытый сбор метрик и платные возможности вроде того же аппаратного декодирования отпугнул немалую часть пользователей. Jellyfin родился как форк Emby в 2018 году и за восемь лет вырос в зрелый продукт без единой платной функции, без обязательной регистрации и без телеметрии. Ниже разложен путь от свежей Ubuntu до медиасервера, который сам подхватывает обновления, использует видеоядро GPU для транскодинга и спокойно держит несколько потоков 4K на скромном железе.
Подбор железа и подготовка Ubuntu Server для домашнего медиасервера
Транскодинг видео без аппаратного ускорения - это та задача, на которой плачут даже топовые процессоры. Команда Jellyfin прямо предупреждает, что Ryzen 9 5950X не всегда вытягивает один-единственный поток с программным тон-маппингом HDR в SDR. Поэтому первое, на что смотрят при сборке сервера, это GPU или встроенное видеоядро с поддержкой Quick Sync, NVENC или VA-API.
Ориентир по железу выглядит примерно так. Для семейного сервера на 2-3 одновременных потока с лихвой хватает мини-ПК на Intel N100 или N150 с TDP 6 ватт и встроенной графикой, которая тянет несколько потоков 4K HEVC одновременно. Для серьёзной библиотеки на десяток пользователей разумно смотреть в сторону Intel 12-13 поколений с iGPU или дискретной NVIDIA серии RTX 20 и новее, исключая GTX 1650 без полноценного NVENC. AMD на Linux пока не рекомендуется официально из-за капризов драйверов VA-API. Памяти достаточно 8 ГБ, для серверной редакции без графической оболочки хватит и 4 ГБ. Хранилище под систему - SSD на 100 ГБ минимум, а под медиатеку - сколько захочется, но желательно отдельный массив или хотя бы отдельный диск.
Сетевой адаптер берётся гигабитный и обязательно проводной. Wi-Fi для медиасервера - это билет в мир пересжатий и буферизации, потому что один поток 4K Remux легко съедает 80-100 Мбит/с. Базовая подготовка системы выполняется парой команд:
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl gnupg apt-transport-https ca-certificates
На свежих процессорах вроде Intel N150 или 14-го поколения может потребоваться установка ядра HWE с обновлёнными драйверами Intel Media Driver, иначе видеоядро система просто не увидит:
sudo apt install --install-recommends linux-generic-hwe-24.04 -y
sudo reboot
После перезагрузки команда uname -r должна показать ядро версии 6.11 или новее.
Подключение официального репозитория и установка пакетов Jellyfin
Самый чистый путь установки - это официальный репозиторий проекта. Через snap или сторонние сборки получить нормальную интеграцию с GPU и автоматические обновления заметно сложнее. Сначала добавляется GPG-ключ Jellyfin для проверки подлинности пакетов:
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://repo.jellyfin.org/jellyfin_team.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/jellyfin.gpg
Затем подключается сам репозиторий:
echo "deb [signed-by=/etc/apt/keyrings/jellyfin.gpg] https://repo.jellyfin.org/$( awk -F'=' '/^ID=/{ print $NF }' /etc/os-release ) $( awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release ) main" | sudo tee /etc/apt/sources.list.d/jellyfin.list
Установка пакета и его сопутствующих зависимостей выполняется одной строкой. Главное - ставить именно jellyfin-ffmpeg7, потому что обычный системный ffmpeg не имеет нужных патчей для аппаратного ускорения и тон-маппинга:
sudo apt update
sudo apt install -y jellyfin jellyfin-ffmpeg7
Сразу после установки сервис автоматически стартует и регистрируется в systemd. Проверка состояния идёт классической командой sudo systemctl status jellyfin. Веб-интерфейс становится доступен по адресу http://адрес-сервера:8096 для основной панели и https-порту 8920 для защищённого подключения. На UFW порты открываются за пару секунд:
sudo ufw allow 8096/tcp comment "Jellyfin Web UI"
sudo ufw allow 7359/udp comment "Jellyfin auto-discovery"
sudo ufw allow 1900/udp comment "Jellyfin DLNA"
При первом заходе мастер настройки попросит выбрать язык, создать админа, указать каталоги с медиа и определиться с источниками метаданных. Главный совет на этом этапе - не торопиться. Структура папок имеет значение, потому что Jellyfin парсит файлы по конвенциям, и хаотичные имена приведут к тому, что сериал распознается как набор не связанных между собой роликов.
Правильная организация медиатеки и тонкости именования файлов
Сканер Jellyfin использует стандарт TheTVDB для сериалов и TMDB для фильмов. Чтобы он распознал контент без ошибок, файлы должны лежать строго по схеме. Для фильмов работает структура вида /media/films/Название (Год)/Название (Год).mkv. Для сериалов нужна вложенность - /media/shows/Название/Season 01/Название - S01E01 - Название серии.mkv. Музыка укладывается по схеме /media/music/Исполнитель/Альбом/01 - Трек.flac.
Полезная практика - вынести медиатеку на отдельный диск или сетевую шару, смонтированную через fstab. Это упрощает бэкапы и переезд на новое железо. Права на каталоги выставляются через chown -R jellyfin:jellyfin /media, иначе сервис не сможет читать и кешировать метаданные. Для совместного доступа из других контейнеров или пользователей подходит группа media - она создаётся вручную, и в неё включаются все нужные учётки.
Один тонкий момент с правами на чтение. Если медиатека лежит на SMB-шаре от NAS, в /etc/fstab монтирование стоит делать с опциями uid=jellyfin,gid=jellyfin,file_mode=0664,dir_mode=0775. Иначе сервис будет видеть файлы, но не сможет их транскодировать из-за отказа в доступе.
Настройка аппаратного транскодинга через Intel Quick Sync и VA-API
Это самый ценный шаг во всей установке. Без аппаратного ускорения сервер начинает задыхаться на втором же потоке, особенно если клиент требует пересжатия 4K HEVC в 1080p H.264. С включённым Quick Sync нагрузка на CPU падает в десятки раз, а маленькая мини-коробочка спокойно тянет три-четыре потока 4K параллельно.
Сначала ставятся драйверы Intel Media Driver для процессоров Broadwell и новее:
sudo apt install -y intel-media-va-driver-non-free vainfo intel-gpu-tools
Команда vainfo выводит список поддерживаемых профилей кодирования и декодирования. Если в выводе видны строки H264, HEVCMain и VP9Profile0 с пометками VAEntrypointVLD и VAEntrypointEncSlice, видеоядро готово к работе. После этого пользователь jellyfin добавляется в группы render и video, иначе сервис не получит доступа к устройству /dev/dri/renderD128:
sudo usermod -aG render jellyfin
sudo usermod -aG video jellyfin
sudo systemctl restart jellyfin
Дальше работа идёт через веб-интерфейс. В разделе Dashboard - Playback - Transcoding выбирается метод аппаратного ускорения. Для Intel ставится Intel QuickSync (QSV), для NVIDIA - NVENC, для современных Intel Arc - тоже QSV. Пути к устройствам обычно подставляются автоматически - /dev/dri/renderD128 для VA-API и /dev/dri/card0 для прямого доступа.
Полезные галочки, которые стоит включить осознанно:
- Enable hardware decoding для всех поддерживаемых кодеков, включая H.264, HEVC, VP9 и AV1
- Enable hardware encoding для финального пересжатия силами GPU
- Enable VPP tone mapping для аппаратного преобразования HDR в SDR на клиентах без поддержки HDR
- Enable Low-Power encoders для процессоров Intel 11+ поколения, где это даёт меньшую нагрузку
- Allow encoding in HEVC format для современных клиентов с поддержкой H.265
Проверить, что транскодинг действительно идёт через GPU, можно прямо во время воспроизведения. В Dashboard - Active Sessions рядом с пометкой о пересжатии должна появиться приставка HW. Параллельно команда intel_gpu_top в терминале покажет нагрузку на видеоядро в процентах.
Для NVIDIA-карт алгоритм похож, но требует установки проприетарных драйверов через ubuntu-drivers autoinstall и пакетов libnvcuvid1 с libnvidia-encode1. Версия драйвера на хосте обязательно должна совпадать с версией библиотек внутри контейнера, если используется Docker, иначе декодер просто не запустится с маловразумительными ошибками.
Удалённый доступ через обратный прокси и забота о безопасности
Просто пробросить порт 8096 наружу - решение быстрое, но плохое. Веб-интерфейс работает по HTTP без шифрования, и любой провайдер увидит, что и когда смотрит хозяин сервера. Правильный путь - обратный прокси с SSL-сертификатом. Nginx или Caddy одинаково хорошо справляются с задачей.
Минимальный конфиг для Nginx с подключением через домен и сертификатом от Let's Encrypt выглядит так:
server {
listen 443 ssl http2;
server_name jellyfin.example.com;
ssl_certificate /etc/letsencrypt/live/jellyfin.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/jellyfin.example.com/privkey.pem;
client_max_body_size 20M;
proxy_buffering off;
location / {
proxy_pass http://127.0.0.1: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 Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Сертификат получается одной командой через certbot --nginx -d jellyfin.example.com и автоматически продлевается через cron. После настройки прокси доступ к Jellyfin идёт по адресу https://jellyfin.example.com, а порт 8096 на файрволе закрывается для внешнего мира - снаружи туда стучаться больше незачем.
Дополнительные слои безопасности тоже не помешают. Включение двухфакторной аутентификации через плагин Jellyfin 2FA, ограничение количества попыток входа, отключение учётной записи по умолчанию для гостей. Полезно настроить fail2ban с правилом для логов /var/log/jellyfin, чтобы автоматически блокировать адреса после нескольких неудачных попыток. Это особенно важно, если сервер торчит наружу постоянно. Регулярные обновления через apt upgrade держат базу в актуальном состоянии и закрывают известные уязвимости.
Финальная оптимизация под нагрузку и резервное копирование настроек
Сервер запущен, транскодинг работает, домен подключён. Осталось несколько штрихов, которые превращают рабочую инсталляцию в надёжную. Первое - вынос временной папки транскодинга на быстрый диск. По умолчанию она лежит в /var/cache/jellyfin/transcodes, и при активном использовании туда могут писаться десятки гигабайт в час. Перенос на отдельный SSD или даже tmpfs в оперативной памяти радикально снижает износ системного диска и ускоряет работу. В Dashboard - Playback можно указать новый путь, например /mnt/cache/jellyfin.
Второй штрих - снижение качества пресета кодирования при перегрузке. По умолчанию Jellyfin использует медленный пресет ради качества, но на слабом железе имеет смысл переключиться на veryfast или ultrafast. Качество чуть упадёт, зато процессор и GPU перестанут захлёбываться при пиковых нагрузках.
Третий шаг - регулярные бэкапы. Все настройки, метаданные и пользовательские данные хранятся в /var/lib/jellyfin и /etc/jellyfin. Простой скрипт упаковки этих папок раз в сутки и отправки на удалённое хранилище через rsync спасает от потери всей библиотеки при сбое диска:
#!/bin/bash
DATE=$(date +%Y%m%d)
sudo systemctl stop jellyfin
tar -czf /backup/jellyfin-$DATE.tar.gz /var/lib/jellyfin /etc/jellyfin
sudo systemctl start jellyfin
find /backup -name "jellyfin-*.tar.gz" -mtime +14 -delete
Запускается через cron строкой 0 3 * * * /home/user/jellyfin-backup.sh - в три часа ночи, когда сервер обычно простаивает.
Что в итоге выходит у того, кто прошёл этот путь. Полностью свой медиасервер без подписок, без чужих аккаунтов, без слежки за тем, что и когда смотрит семья. Аппаратный транскодинг на встроенном видеоядре, который превращает крошечный мини-ПК в станцию, способную обслуживать одновременно несколько 4K-потоков для разных устройств. Доступ изнутри сети и снаружи через защищённый домен, регулярные бэкапы и автообновления через стандартный apt. Главное преимущество такого решения в том, что владелец сервера не зависит от прихотей корпораций, не платит ежемесячную дань за свой же контент и при желании может разобрать всю систему до последнего конфига. Каждый файл прозрачен, каждая настройка под рукой, и медиатека продолжит работать даже без интернета - что в эпоху облачных привычек звучит почти крамольно, но удивительно приятно на практике.