Медиасервер Jellyfin в Docker вместо Plex и платных подписок

Jellyfin: свой медиасервер вместо Plex

Jellyfin это свободный медиасервер, который собирает домашнюю коллекцию фильмов, сериалов и музыки в один каталог и раздаёт её на телевизор, телефон и ноутбук. На практике путь начинается с контейнера в Docker Compose, дальше идут библиотеки, домен с HTTPS, аппаратное ускорение и клиенты.

У Plex есть Plex Pass и Remote Watch Pass, у Emby есть Premiere, и часть возможностей там открывается только по подписке. Проект распространяется по GPLv2, не делит функции на бесплатные и платные, не требует учётной записи вендора и работает в изолированной сети без обращений в чужое облако.

На выходе получается сервер на своём железе: библиотека лежит на дисках владельца, интерфейс открывается по домену, приложения ставятся на телевизор и телефон.

Что такое Jellyfin и чем он отличается от Plex и Emby

Проект появился в 2018 году как форк Emby. Часть разработчиков не согласилась с закрытием исходного кода и 8 декабря 2018 года объявила об отделении, а первый выпуск вышел 30 декабря. Сервер написан на C# и работает на Linux, Windows и macOS.

Лицензия GPLv2 разрешает изучать код, собирать его самостоятельно и ставить на любое число машин без отчислений. Официальный образ Docker собирается из исходников и публикуется как jellyfin/jellyfin на Docker Hub и ghcr.io/jellyfin/jellyfin, теги и требования описаны в документации по контейнерам.

Архитектура клиент-серверная: сервер хранит библиотеку и отдаёт поток по HTTP на порту 8096, клиент присылает профиль своих возможностей и получает подходящий вариант. Приложения есть для Android и iOS, Android TV и Fire TV, Roku, Xbox, Samsung Tizen и LG webOS, для Kodi выпускается JellyCon, для настольных систем Jellyfin Media Player. Дополнительно сервер отдаёт медиа по DLNA и на Chromecast.

Конкуренты продают подписки, а проект не продаёт ничего и не собирает телеметрию. Взамен проект живёт на сообществе: коммерческой поддержки нет, вопросы разбирают на форуме и в чатах. На 2 ноября 2026 года актуальна стабильная версия 12.4, опубликованная 26 октября.

Какой сервер нужен для медиасервера

Нагрузку задаёт режим воспроизведения. При Direct Play сервер отдаёт файл как есть и почти не тратит процессор, при Remux меняется только контейнер, при Direct Stream перекодируется звук, при полном транскодировании сервер заново сжимает видео. Первые три режима вытягивает почти любая машина, последний упирается в CPU и видеокарту.

Официальные рекомендации: 100 ГБ SSD под систему, кэш и файлы Jellyfin, гигабитный Ethernet вместо Wi-Fi и Powerline, не менее 20 Мбит/с исходящей скорости для доступа извне, 8 ГБ памяти, а для Linux без графической оболочки допускают 4 ГБ. Для встроенной графики советуют Intel Core i5-11400, Pentium Gold G7400 или N100, для дискретной Intel Arc A либо NVIDIA от GTX 16 и RTX 20. AMD для встроенного видео не рекомендуют.

Слабый VPS подойдёт, если библиотека небольшая, смотрят один или два человека, а клиенты имеют прямое воспроизведение с сервера. Терабайты в VPS не влезают: диски там дорогие, а полнометражный 4K фильм занимает десятки гигабайт. Аренда оправдана для тонкого сервера с медиатекой на сетевом хранилище или для доступа извне, конфигурацию можно подобрать в подборке VPS.

Процессор с Quick Sync или видеокарта нужны там, где начинается перекодирование: 4K HDR, несколько зрителей, клиент без поддержки кодека. Документация предупреждает, что без GPU вся работа ложится на CPU и даже Ryzen 9 5950X может не вытянуть один поток с tone-mapping. Для домашнего медиасервера разумен мини-ПК на N100 с двумя дисками, для коллекции 4K лучше подойдёт машина с Intel Arc или NVIDIA.

Установка Jellyfin в Docker Compose

Тег 12.4 фиксирует минорную версию и получает исправления внутри ветки, latest едет за всеми обновлениями сразу. Для домашнего сервера удобнее вариант с фиксированной минорной версией, мажорный скачок тогда не случается неожиданно.

Каталоги под конфиг и кэш создаются заранее, иначе Docker создаст их от root, а процесс с uid 1000 не сможет писать. Заодно проверяется собственный uid:

mkdir -p jellyfin/config jellyfin/cache
id -u; id -g

Минимальный jellyfin docker compose, которого хватает для рабочего сервера:

services:
  jellyfin:
    image: jellyfin/jellyfin:12.4
    container_name: jellyfin
    user: "1000:1000"
    environment:
      - TZ=Europe/Moscow
    ports:
      - 8096:8096/tcp
      - 7359:7359/udp
    volumes:
      - ./jellyfin/config:/config
      - ./jellyfin/cache:/cache
      - /srv/media:/media:ro
    restart: unless-stopped

Директива user задаёт uid и gid процесса, сюда подставляются значения из id -u и id -g. В образе LinuxServer те же значения передаются переменными PUID и PGID, а в официальном jellyfin/jellyfin их заменяет user. Переменная TZ выставляет часовой пояс контейнера, без неё расписание задач и время в логах уходят в UTC. Каталог /config хранит базу, настройки и метаданные, /cache отдаётся под временные файлы транскодирования, медиатека подключается только на чтение.

Порт 8096/tcp это веб-интерфейс и API, 7359/udp нужен для автопоиска в локальной сети. Для DLNA одного проброса мало: с версии 10.9 он вынесен в отдельный плагин, который ставится из каталога, а сам сервер должен работать в сети хоста. Тогда добавляют network_mode: host, секцию ports убирают, а порт 1900/udp для обнаружения остаётся доступен.

Запуск и проверка занимают минуту:

docker compose up -d
docker compose logs -f jellyfin
curl -s http://localhost:8096/health

В логах появится Startup complete, /health вернёт код 200, а /System/Info/Public отдаст версию и идентификатор сервера. На локальной сборке контейнер поднялся за 6 секунд, пустой /config занимал меньше мегабайта, процесс держал около 250 МБ памяти.

Если контейнеров много, пригодится Portainer; рядом обычно ставят Nextcloud для файлов и Immich для фотоархива.

Первичная настройка после запуска

Мастер открывается по адресу http://IP-сервера:8096 и состоит из пяти шагов: язык интерфейса, учётная запись администратора, библиотеки, язык метаданных, сеть. На шаге сети документация советует включить удалённый доступ и выключить автоматическое открытие портов через UPnP: этот протокол часто создаёт лишние дыры в периметре.

Библиотека создаётся с типом контента: фильмы, сериалы, музыка, книги или фото. Смешанный тип Mixed не рекомендован, поскольку метаданные для него подбираются ненадёжно, и коллекцию лучше разложить по отдельным библиотекам. Внутри указывается папка контейнера, например /media/films, и язык метаданных, для русской коллекции обычно ru.

Локальные файлы .nfo сервер читает всегда, отключить это нельзя, и такие данные приоритетнее онлайн-источников вроде TMDb. Если метаданные собраны другим каталогизатором, файлы кладут рядом с видео: movie.nfo для фильма, tvshow.nfo для сериала. Обратная запись включается сохранением метаданных в NFO в настройках библиотеки.

Пользователей заводят отдельно для каждого члена семьи, в карточке есть право на удалённые подключения, список библиотек и ограничение по битрейту. Частая проблема связана с правами: если папки не видны в мастере, uid контейнера не совпадает с владельцем файлов. Проверить владельцев можно командой ls -ln /srv/media.

ООО «РЕГ.РУ»

Мощные VPS для ваших Docker-контейнеров

Идеально подходит для Nginx Proxy Manager, Portainer и Nextcloud. Высокая производительность (NVMe), защита от DDoS и скидка 5% по промокоду.

Промокод:CB2C-C638-E0BF-18D1
от 0.6 ₽/час

Доступ по домену и HTTPS через Nginx Proxy Manager

Порт 8096 отдаёт HTTP без шифрования, а сам сервер не рассчитан на прямое выставление в интернет. Правильный путь начинается с домена, сертификата и reverse proxy, который принимает HTTPS и передаёт запросы контейнеру. В DNS создаётся A-запись jellyfin.example.com на адрес сервера, на роутере открываются 80 и 443.

Proxy Host создают в Nginx Proxy Manager: домен в Domain Names, схема http, Forward Port 8096. Имя контейнера jellyfin пишут в поле Forward Hostname, если оба контейнера подключены к одной пользовательской сети Docker. Адрес 127.0.0.1 подходит только тогда, когда Jellyfin работает в сети хоста: в остальных случаях Nginx Proxy Manager обратится к самому себе. Переключатель Websockets Support включают обязательно: сервер использует веб-сокеты для обновления интерфейса, без них часть экранов ведёт себя странно.

На вкладке SSL запрашивается сертификат Let’s Encrypt, включаются Force SSL и HTTP/2, после сохранения домен открывается по HTTPS, а HTTP перенаправляется на защищённую версию. Порядок создания хоста и привязки сертификата разобран в статье про Nginx Proxy Manager в Docker.

Ещё один шаг касается адресов клиентов. В Jellyfin нужно открыть Networking и добавить адрес reverse proxy в Known Proxies, иначе сервер видит вместо клиента адрес Nginx Proxy Manager и не различает локальные и внешние подключения. Заголовки X-Forwarded-For от неизвестных адресов сервер отбрасывает.

Транскодирование и аппаратное ускорение

Перекодирование запускает клиент. Он присылает профиль с кодеками, разрешениями и битрейтом, сервер выбирает лучший вариант в этих рамках, а вручную разрешение не задаётся. Обычно причина в несовместимости: телевизор не понимает HEVC 10 бит, саундбар не поддерживает DTS, канал узкий для исходного битрейта, субтитры требуют вжигания в картинку.

С HDR сложнее. Сервер не передаёт HDR-метаданные как есть и при перекодировании делает tone-mapping в SDR, иначе картинка блёклая. Программный tone-mapping очень медленный, поэтому документация советует GPU: базовая графика Intel тянет его не хуже, чем Ryzen 5800X.

Для Intel на Linux есть два метода. VAAPI работает почти на всех поколениях, QSV предпочтителен на Broadwell и новее, ограничений на число одновременных сессий у Intel нет. Контейнеру нужен доступ к устройству рендеринга, а процессу нужна группа этого устройства: ls -ln /dev/dri покажет числовой gid, его передают через group_add.

    devices:
      - /dev/dri:/dev/dri
    group_add:
      - "107"

Для NVIDIA используется NVENC, он поддерживается с Maxwell второго поколения, но младшие карты вроде GT1030 и RX6400 остались без аппаратного энкодера. Кроме проброса устройства нужны nvidia-container-toolkit и параметр --gpus all либо reservations в compose; монитор к карте не требуется.

Включается ускорение в Dashboard, раздел Playback: выбирается метод, отмечаются кодеки, включается аппаратный tone-mapping. После сохранения стоит запустить фильм и посмотреть на панель, где тип воспроизведения показан как Direct Play, Direct Stream или Transcode, а docker stats, nvidia-smi и intel_gpu_top дают фактическую загрузку. В образе 12.4 лежит jellyfin-ffmpeg 8.1.3 с поддержкой cuda, vaapi, qsv и amf.

Клиенты для телевизора и телефона

Для Android TV и Fire TV есть приложение из Google Play, Amazon Appstore или F-Droid, для Samsung Tizen из Samsung Smart TV App Store, для LG webOS из LG Content Store, для Roku из Channel Store, для Xbox из Microsoft Store. На телефонах это Android и iOS, на компьютерах Jellyfin Media Player, в Kodi сервер подключается через аддон JellyCon.

Веб-клиент открывается по тому же адресу, что и админка, и этого хватает для проверки с ноутбука. Встроенные браузеры телевизоров справляются хуже: интерфейс грузится медленно, пульт неточен.

Если приложения нет в магазине региона, остаются пути без взлома телевизора. Внешняя приставка на Android TV даёт полный набор клиентов и обновлений, ноутбук с HDMI выручает для редкого просмотра, а встроенный DLNA-клиент видит сервер без установки чего-либо, если тот работает в сети хоста.

Обновление и резервное копирование

Обновление контейнера занимает две команды:

docker compose pull jellyfin
docker compose up -d

Обновление внутри ветки приносит исправления без смены мажорной версии, а переход на новую ветку планируют отдельно, с чтением заметок к выпуску и бэкапом.

Отката у Jellyfin нет. После первого старта новой версии миграции базы применяются сразу, и старые данные с прежней версией не работают, вернуть состояние можно только из копии. Поэтому бэкап перед мажорным обновлением это единственный способ откатиться.

Встроенный механизм появился в 10.11. В Dashboard есть вкладка Backups, кнопка Create Backup и галочки Database, Metadata, Subtitles, Trickplay. Архив складывается в /config/data/backups, система требует не менее 5 ГБ свободного места.

Копировать целиком стоит /config: там база, настройки, метаданные и архивы. Перед копированием контейнер останавливают, иначе база SQLite может уехать в архив в несогласованном виде, а готовый архив держат на другом диске: копия рядом с базой не спасает от отказа накопителя. Медиатека живёт отдельно и в бэкап сервера не входит. Расписание задач живёт в Dashboard, в разделе Scheduled Tasks, там же отключают лишние задания вроде генерации превью.

Частые вопросы

Нужен ли GPU для Jellyfin

Для прямого воспроизведения видеокарта не нужна, сервер отдаёт файл как есть. Для транскодирования 4K HDR она нужна на практике: софтверный x265 не успевает в реальном времени даже на мощном процессоре. Документация советует Intel с Quick Sync или NVIDIA.

Сколько памяти ест Jellyfin

На пустом сервере без библиотеки контейнер версии 12.4 занимает около 250 МБ памяти, это замер на локальной сборке. Официально рекомендуют 8 ГБ, для Linux без графической оболочки допускают 4 ГБ, а запас нужен под сканирование и транскодирование.

Чем Jellyfin лучше Plex

Он не делит функции на бесплатные и платные, не требует учётной записи вендора и работает в изолированной сети. Plex и Emby продают часть возможностей по подписке, поэтому выбор идёт по тому, что важнее: контроль над сервером или сервис вендора.

Можно ли поставить Jellyfin на Synology и Windows

На Synology контейнер ставят через Container Manager, и официальный образ работает без изменений. На Windows есть штатный установщик, а вот контейнер в Docker Desktop официально не поддерживается, и аппаратное ускорение внутри него не работает.

Jellyfin разумно ставить, когда библиотека уже собрана и есть железо с Quick Sync или видеокартой: тогда получается свой медиасервер без подписок, с HTTPS, клиентами на телевизоре и понятным бэкапом. Если коллекцию смотрит один телевизор и всё воспроизводится напрямую, хватит мини-ПК или дешёвого VPS. Если же нужен готовый сервис с платными уровнями и поддержкой вендора, это не тот случай, и подписка окажется проще.