Медиа · :8096

Jellyfin в Docker: медиасервер без подписок и телеметрии

Аппаратное транскодирование через Intel QuickSync, правильная структура библиотеки и настройка за реверс-прокси — без единой платной функции, спрятанной за Plex Pass.

Зачем Jellyfin, а не Plex или Emby

Jellyfin — форк Emby, полностью открытый и без единой функции за платной подпиской: аппаратное транскодирование, мобильные клиенты, синхронизация прогресса просмотра — всё бесплатно и без учётной записи на внешнем сервере. В отличие от Plex, серверу не нужно "звонить домой" на серверы производителя, чтобы подтвердить, что вы имеете право смотреть собственную медиатеку у себя дома.

Плата за независимость — чуть больше ручной настройки на старте, особенно в части аппаратного транскодирования, которое Plex и Emby оборачивают в куда более прилизанный (и платный) интерфейс.

Какие NAS вообще умеют аппаратное транскодирование

Аппаратное транскодирование через Intel QuickSync (QSV) работает только на моделях с процессором Intel, у которого есть встроенное видеоядро. Разбор актуальной линейки уже был в статье про выбор NAS — здесь та же таблица, но applied к конкретно этой задаче:

МодельCPUАппаратное транскодирование
DS225+ / DS425+Intel Celeron J4125да, через QuickSync (QSV)
DS725+ / DS925+ / DS1525+ / DS1825+AMD Ryzen (R1600 / V1500B)нет — только программное (CPU)
⚠ если у вас AMD-модель
На процессорах AMD из линейки Synology нет блока QuickSync — транскодирование пойдёт через CPU и на 4K-контенте упрётся в производительность почти мгновенно. На таком железе разумная стратегия — не транскодировать вовсе, а держать медиатеку в форматах, которые клиенты воспроизводят напрямую (Direct Play), об этом в шаге про структуру библиотеки.

Что понадобится перед стартом

Шаг 1 — подготовка каталогов

ssh · admin@nas
mkdir -p /volume1/docker/jellyfin/config
mkdir -p /volume1/docker/jellyfin/cache
# медиатека уже существует, например:
# /volume1/media/movies
# /volume1/media/shows

Каталог config хранит базу метаданных, пользователей и настройки библиотек — именно его нужно бэкапить (подробнее в шаге про бэкапы). Медиафайлы монтируются отдельным томом только для чтения — Jellyfin не должен иметь возможность их изменять.

Шаг 2 — docker-compose.yml с проброс GPU

01Собираем конфигурацию

Для аппаратного транскодирования контейнеру нужен прямой доступ к устройству рендеринга /dev/dri, которое DSM создаёт для встроенной графики Intel:

docker-compose.yml
services:
  jellyfin:
    image: jellyfin/jellyfin:10.9
    container_name: jellyfin
    restart: unless-stopped
    user: "1000:1000"
    group_add:
      - "44"   # video
      - "104"  # render (может отличаться, см. шаг 3)
    devices:
      - /dev/dri:/dev/dri
    volumes:
      - /volume1/docker/jellyfin/config:/config
      - /volume1/docker/jellyfin/cache:/cache
      - /volume1/media:/media:ro
    ports:
      - "8096:8096"
    environment:
      TZ: "Europe/Moscow"
    mem_limit: 2g

Числовые группы video и render — не универсальная константа, а значения, специфичные для конкретного DSM. Их нужно подтвердить на самом NAS до первого запуска.

Шаг 3 — проверка QuickSync внутри контейнера

02Смотрим реальные ID групп на хосте

ssh · admin@nas
ls -la /dev/dri
getent group video
getent group render

Подставьте реальные числа из вывода getent group в group_add compose-файла и перезапустите контейнер. Затем убедитесь, что QuickSync виден изнутри:

ssh · admin@nas
docker exec -it jellyfin vainfo

# ожидаемо в выводе:
# vainfo: VA-API version: 1.x
# VAProfileH264Main : VAEntrypointVLD
# VAProfileHEVCMain : VAEntrypointVLD

Если команда возвращает ошибку доступа к устройству — почти всегда дело в неверном ID группы render, а не в самом железе.

Шаг 4 — включаем аппаратное ускорение в настройках

В панели администратора: Панель управления → Воспроизведение → Транскодирование. Ниже — какие поля там нужно заполнить (актуальный интерфейс меняется от релиза к релизу, поэтому это авторская схема, а не копия конкретной версии):

панель управления → воспроизведение → транскодирование аппаратное ускорение Intel QuickSync (QSV) устройство рендеринга /dev/dri/renderD128 декодирование h264/hevc ✓ низкая точность tone-mapping (по умолчанию) включайте кодеки по одному и проверяйте плеером — не все связки CPU/кодек одинаково стабильны

Включайте поддержку декодирования кодеков по одному (сначала H.264, затем HEVC/H.265) и проверяйте реальным воспроизведением — не все связки конкретного чипа и кодека одинаково стабильны, и надёжнее подтвердить это на своём железе, чем доверять общему списку совместимости.

Структура медиатеки, которую поймут все клиенты

Jellyfin (как и Kodi, Plex, Emby) ожидает определённую структуру имён папок и файлов для корректного сопоставления с метаданными:

структура каталогов
/volume1/media/movies/Дюна (2021)/Дюна (2021).mkv
/volume1/media/shows/Во все тяжкие/Season 01/S01E01.mkv
/volume1/media/shows/Во все тяжкие/Season 01/S01E02.mkv

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

Кэш транскодирования: почему не в /tmp

Каждая сессия транскодирования пишет временные сегменты на диск — на слабом HDD-массиве это создаёт дополнительную случайную нагрузку чтения/записи параллельно с самой раздачей файла. Если в NAS есть NVMe-кэш или SSD-том, каталог cache из compose-файла стоит вынести именно туда:

СценарийРекомендация для тома cache
1 одновременный стрим, Direct Play в основномобычный HDD-том — разницы почти не будет
2–3 одновременных транскодированияотдельный SSD/NVMe-том под /cache
4K HDR с tone-mappingобязательно SSD/NVMe — самый тяжёлый паттерн нагрузки

Реверс-прокси без буферизации и разрывов

При проксировании через Nginx Proxy Manager обязательно включите WebSockets Support (для real-time обновлений интерфейса) и добавьте во вкладке Advanced отключение буферизации, иначе начало воспроизведения ощутимо задерживается:

advanced · custom nginx configuration
proxy_buffering off;
client_max_body_size 20M;
proxy_read_timeout 3600;

Что бэкапить, а что — нет

Частые проблемы

СимптомВероятная причина
vainfo выдаёт ошибку доступа к устройствуневерный числовой ID группы render в group_add
Транскодирование идёт через CPU, хотя QSV включёнкодек исходного файла не поддерживается конкретным поколением QuickSync
HDR-контент выглядит блёкло или зеленитнекорректный tone-mapping — попробуйте программный вместо аппаратного для этого профиля
Долгая пауза перед началом воспроизведения через проксине отключена proxy_buffering в конфигурации реверс-прокси
Метаданные и постеры не подтягиваютсяструктура папок не соответствует ожидаемому формату «Название (Год)»

После того как QuickSync подтверждён через vainfo, библиотека структурирована по годам и сезонам, а прокси не буферизует поток — Jellyfin на домашнем NAS ощущается ничем не хуже коммерческих аналогов, только без ежемесячной подписки за функции, которые и так должны быть бесплатными.