Jellyfin в Docker: медиасервер без подписок и телеметрии
Аппаратное транскодирование через Intel QuickSync, правильная структура библиотеки и настройка за реверс-прокси — без единой платной функции, спрятанной за Plex Pass.
- Зачем Jellyfin, а не Plex или Emby
- Какие NAS вообще умеют аппаратное транскодирование
- Что понадобится перед стартом
- Шаг 1 — подготовка каталогов
- Шаг 2 — docker-compose.yml с проброс GPU
- Шаг 3 — проверка QuickSync внутри контейнера
- Шаг 4 — включаем аппаратное ускорение в настройках
- Структура медиатеки, которую поймут все клиенты
- Кэш транскодирования: почему не в /tmp
- Реверс-прокси без буферизации и разрывов
- Что бэкапить, а что — нет
- Частые проблемы
Зачем 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) |
Что понадобится перед стартом
- NAS с Intel CPU, если нужно именно аппаратное транскодирование (см. таблицу выше).
- Существующая медиатека на отдельном томе — Jellyfin индексирует файлы, но не хранит их у себя внутри.
- Доступ по SSH — понадобится проверить права на устройство
/dev/dri.
Шаг 1 — подготовка каталогов
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:
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 групп на хосте
ls -la /dev/dri getent group video getent group render
Подставьте реальные числа из вывода getent group в group_add compose-файла и перезапустите контейнер. Затем убедитесь, что QuickSync виден изнутри:
docker exec -it jellyfin vainfo # ожидаемо в выводе: # vainfo: VA-API version: 1.x # VAProfileH264Main : VAEntrypointVLD # VAProfileHEVCMain : VAEntrypointVLD
Если команда возвращает ошибку доступа к устройству — почти всегда дело в неверном ID группы render, а не в самом железе.
Шаг 4 — включаем аппаратное ускорение в настройках
В панели администратора: Панель управления → Воспроизведение → Транскодирование. Ниже — какие поля там нужно заполнить (актуальный интерфейс меняется от релиза к релизу, поэтому это авторская схема, а не копия конкретной версии):
Включайте поддержку декодирования кодеков по одному (сначала 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 отключение буферизации, иначе начало воспроизведения ощутимо задерживается:
proxy_buffering off; client_max_body_size 20M; proxy_read_timeout 3600;
Что бэкапить, а что — нет
- Бэкапить: каталог
config— база метаданных, пользователи, настройки библиотек и плагины. - Не бэкапить отдельно: каталог
cache— временные файлы транскодирования, безопасно удаляются и пересоздаются заново. - Бэкапить по-другому: сама медиатека — как правило, это уже покрыто общим бэкапом дискового массива NAS, а не специфичной для Jellyfin стратегией.
Частые проблемы
| Симптом | Вероятная причина |
|---|---|
| vainfo выдаёт ошибку доступа к устройству | неверный числовой ID группы render в group_add |
| Транскодирование идёт через CPU, хотя QSV включён | кодек исходного файла не поддерживается конкретным поколением QuickSync |
| HDR-контент выглядит блёкло или зеленит | некорректный tone-mapping — попробуйте программный вместо аппаратного для этого профиля |
| Долгая пауза перед началом воспроизведения через прокси | не отключена proxy_buffering в конфигурации реверс-прокси |
| Метаданные и постеры не подтягиваются | структура папок не соответствует ожидаемому формату «Название (Год)» |
После того как QuickSync подтверждён через vainfo, библиотека структурирована по годам и сезонам, а прокси не буферизует поток — Jellyfin на домашнем NAS ощущается ничем не хуже коммерческих аналогов, только без ежемесячной подписки за функции, которые и так должны быть бесплатными.