"Быстрый
<br />
<strong>Установка Jellyfin через Docker Compose — 4 шага:</strong></p>
<ol>
<li>Создай docker-compose.yml с образом jellyfin/jellyfin</li>
<li>Пропиши пути к медиатеке и папке с конфигом</li>
<li>Запусти контейнер: <strong><a class="wpil_keyword_link" href="https://it-apteka.com/tag/docker/" target="_blank" rel="noopener" title="Docker" data-wpil-keyword-link="linked" data-wpil-monitor-id="2533">docker</a> compose up -d</strong></li>
<li>Открой браузер: <strong>http://IP:8096</strong> — пройди мастер настройки</li>
</ol>
<p>Всё. Дальше — детали, без которых оно либо не заработает, либо заработает не так.<br />
<h2>Зачем Jellyfin, если есть Plex и Emby</h2>
<p>Plex требует аккаунт. Emby в бесплатной версии срезает функции. Jellyfin — полностью открытый, без регистрации, без подписки, без телеметрии. Установил, настроил — работает. Никто не знает что у тебя на диске, и никто не отберёт функциональность если ты не платишь.</p>
<p>Установка Jellyfin занимает от 10 минут. На выходе получаешь медиасервер который стримит фильмы, сериалы и музыку на любое устройство в <a class="wpil_keyword_link" href="https://it-apteka.com/category/networks/" target="_blank" rel="noopener" title="Сети" data-wpil-keyword-link="linked" data-wpil-monitor-id="2536">сети</a> — и за её пределами, если настроишь внешний доступ.</p>
<p>Это вторая статья серии про OpenMediaVault homelab. В <a title="20 лучших приложений для OpenMediaVault" href="https://it-apteka.com/prilozhenija-dlja-openmediavault-20-luchshih-dlja-homelab/" target="_blank" rel="noopener">первой части</a> разобрали 20 приложений для OMV. Здесь — Jellyfin от <a title="OpenMediaVault 8: установка и настройка NAS на Debian (Docker, RAID, SMB, HTTPS)" href="https://it-apteka.com/openmediavault-8-ustanovka-i-nastrojka-nas-na-debian-docker-raid-smb-https/" target="_blank" rel="noopener" data-wpil-monitor-id="2525">установки до продакшн-конфига с HTTPS</a>, плагинами и нормальной структурой медиатеки.</p>
<p>Что будет в статье:</p>
<ul>
<li>Установка через Docker Compose — самый правильный способ</li>
<li>Структура папок которая не сломает метаданные</li>
<li>Настройка библиотек, сканирование, обложки</li>
<li>HTTPS через <a title="Nginx Proxy Manager: настройка reverse proxy для Proxmox, Nextcloud, Vaultwarden и ещё семи сервисов" href="https://it-apteka.com/nginx_proxy_manager/" target="_blank" rel="noopener" data-wpil-monitor-id="2520">Nginx Proxy Manager</a> или Caddy</li>
<li>Полезные плагины: Intro Skipper, Open Subtitles, Playback Reporting</li>
<li>Клиенты для телевизора, телефона и браузера</li>
<li><a title="Troubleshooting сетевых проблем: 15 команд для диагностики в Windows и Linux" href="https://it-apteka.com/troubleshooting-setevyh-problem-15-komand-dlja-diagnostiki-v-windows-i-linux/" target="_blank" rel="noopener" data-wpil-monitor-id="2526">Troubleshooting — 8 типичных проблем</a> с решениями</li>
</ul>
<p>Потребуется: <a class="wpil_keyword_link" href="https://it-apteka.com/category/linux/" target="_blank" rel="noopener" title="Linux" data-wpil-keyword-link="linked" data-wpil-monitor-id="2534">Linux</a>-сервер или NAS с Docker, ~30 минут, папка с медиаконтентом. Железо — в таблице ниже.</p>
<h2>Системные требования</h2>
<table>
<thead>
<tr>
<th>Параметр</th>
<th>Минимум</th>
<th>Комфортно</th>
<th>Для транскодинга 4K</th>
</tr>
</thead>
<tbody>
<tr>
<td>CPU</td>
<td>2 ядра, x86_64</td>
<td>4 ядра</td>
<td>6+ ядер или Intel QSV/NVENC</td>
</tr>
<tr>
<td>RAM</td>
<td>2 ГБ</td>
<td>4 ГБ</td>
<td>8 ГБ+</td>
</tr>
<tr>
<td>Диск (система)</td>
<td>20 ГБ <a class="wpil_keyword_link" href="https://it-apteka.com/tag/ssd/" target="_blank" rel="noopener" title="ssd" data-wpil-keyword-link="linked" data-wpil-monitor-id="2535">SSD</a></td>
<td>40 ГБ SSD</td>
<td>40 ГБ SSD</td>
</tr>
<tr>
<td>ОС</td>
<td><a class="wpil_keyword_link" href="https://it-apteka.com/tag/debian/" target="_blank" rel="noopener" title="Debian" data-wpil-keyword-link="linked" data-wpil-monitor-id="2531">Debian</a> 11+, Ubuntu 22.04+</td>
<td>Debian 12</td>
<td>Debian 12 + GPU драйверы</td>
</tr>
<tr>
<td>Docker</td>
<td>24.x+</td>
<td>25.x+</td>
<td>25.x+ с nvidia-container-toolkit</td>
</tr>
<tr>
<td>Сеть</td>
<td>100 Мбит (для 1080p direct play)</td>
<td>Гигабит LAN</td>
<td>Гигабит LAN</td>
</tr>
</tbody>
</table>
<p>На момент публикации актуальна версия Jellyfin 10.10.x. Перед установкой проверь свежие релизы на <a href="https://github.com/jellyfin/jellyfin/releases" target="_blank" rel="nofollow noopener noreferrer">github.com/jellyfin/jellyfin/releases</a>.</p>
<p>Важный момент про транскодинг. Если клиент воспроизводит файл напрямую без перекодирования — это Direct Play, нагрузки почти нет. Если нужно конвертировать на лету — Transcoding, и тут без нормального железа будут тормоза. Современные смарт-телевизоры и приставки умеют H.264 и H.265 напрямую. Старые и некоторые веб-браузеры — нет.</p>
<h2>Структура папок до установки</h2>
<p>Сначала разберись с папками — потом всё остальное. Jellyfin определяет тип контента по структуре директорий. Если положить сериалы не туда — метаданные не подтянутся, а разбираться потом неприятно.</p>
<p>Правильная структура:</p>
<pre><code class="language-bash">
/opt/jellyfin/
├── config/ # конфиг Jellyfin - маппится в контейнер
├── cache/ # кеш метаданных и обложек
└── data/ # БД, журналы, временные файлы транскодинга
/mnt/media/ # или где у тебя лежат файлы
├── movies/ # фильмы
│ ├── Inception (2010)/
│ │ └── Inception (2010).mkv
│ └── The Matrix (1999)/
│ └── The Matrix (1999).mkv
├── tvshows/ # сериалы
│ ├── Breaking Bad/
│ │ ├── Season 01/
│ │ │ ├── Breaking Bad S01E01.mkv
│ │ │ └── Breaking Bad S01E02.mkv
│ │ └── Season 02/
│ └── Severance/
│ └── Season 01/
├── music/ # музыка
└── photos/ # фото
</code></pre>
<p>Запомни правило именования: <strong>Название (Год)</strong> для фильмов и <strong>SxxExx</strong> для серий. Jellyfin использует TMDb и TheTVDB для <a title="Поиск файлов в Linux: шпаргалка по find, locate и grep" href="https://it-apteka.com/poisk-fajlov-v-linux-shpargalka-po-find-locate-i-grep/" target="_blank" rel="noopener" data-wpil-monitor-id="2523">поиска метаданных — если имя файла</a> не совпадает с базой, будут проблемы. Год в скобках критичен если фильм выходил несколько раз или есть ремейк.</p>
<p>Создай структуру:</p>
<pre><code class="language-bash">
mkdir -p /opt/jellyfin/{config,cache,data}
# Медиапапки - замени путь на свой
mkdir -p /mnt/media/{movies,tvshows,music,photos}
</code></pre>
<h2>Установка Jellyfin через Docker Compose</h2>
<p>Ставить через Docker Compose — правильный выбор. Конфиг в одном файле, легко обновлять, легко переносить. Нативная установка через deb-пакет тоже работает, но потом будешь вручную следить за обновлениями и зависимостями.</p>
<p>Создай файл конфигурации:</p>
<pre><code class="language-bash">
nano /opt/jellyfin/docker-compose.yml
</code></pre>
<p>Вставь содержимое:</p>
<pre><code class="language-text">
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
network_mode: host
environment:
- JELLYFIN_PublishedServerUrl=http://192.168.1.100:8096 # замени на свой IP
volumes:
- /opt/jellyfin/config:/config
- /opt/jellyfin/cache:/cache
- /opt/jellyfin/data:/data
- /mnt/media:/media:ro
# Если есть Intel iGPU для аппаратного транскодинга:
# devices:
# - /dev/dri:/dev/dri
# group_add:
# - "109" # группа render, проверь: getent group render
</code></pre>
<p>Несколько пояснений по compose-файлу. Параметр <code>network_mode: host</code> даёт контейнеру прямой доступ к сети хоста. Это нужно для DLNA и автообнаружения в локальной сети — без этого смарт-телевизоры не найдут сервер автоматически. Медиапапка монтируется как <code>:ro</code> (read-only) — Jellyfin не должен ничего писать туда, только читать. <code>restart: unless-stopped</code> — контейнер поднимется после перезагрузки, если ты его сам не остановил.</p>
"Про
<br />
В <a title="Автоматическое обновление Docker контейнеров: полное руководство и примеры" href="https://it-apteka.com/avtomaticheskoe-obnovlenie-docker-kontejnerov-polnoe-rukovodstvo-i-primery/" target="_blank" rel="noopener" data-wpil-monitor-id="2528">примере</a> не указаны PUID и PGID — контейнер запустится от root. Для homelab это приемлемо. Для продакшн-среды добавь переменные окружения PUID и PGID с UID/GID пользователя у которого есть доступ к медиафайлам. Узнать: <strong>id имя_пользователя</strong><br />
<p>Запусти контейнер:</p>
<pre><code class="language-bash">
cd /opt/jellyfin
docker compose up -d
</code></pre>
<p>Проверь что запустился:</p>
<pre><code class="language-bash">
docker compose ps
docker compose logs --tail=50
</code></pre>
<p>В логах должна появиться строка вида <code>Jellyfin version: 10.x.x</code> и <code>Startup complete</code>. Если видишь ошибки доступа к файлам — проверь права на папки.</p>
<h2>Первый запуск и мастер настройки</h2>
<p>Открой браузер и иди по адресу <code>http://IP-сервера:8096</code>. Пойдёт мастер начальной настройки — он запускается только один раз.</p>
<p>Шаги мастера:</p>
<ol>
<li><strong>Язык интерфейса</strong> — выбери русский, если хочешь. Jellyfin переведён прилично.</li>
<li><strong>Создание администратора</strong> — придумай имя и пароль. Не admin/admin, серьёзно.</li>
<li><strong>Настройка медиатеки</strong> — добавляй библиотеки здесь. Тип контента выбери правильно: фильмы / сериалы / музыка / фото. Путь — /media/movies (или что ты назвал в compose).</li>
<li><strong>Метаданные</strong> — выбери язык для метаданных. Русский для русских тайтлов, английский как запасной.</li>
<li><strong>Готово</strong> — сервер начнёт сканирование библиотек.</li>
</ol>
<p>После завершения мастера — иди в <strong>Панель управления → Библиотеки</strong> и нажми «Сканировать все библиотеки». Первое сканирование может занять несколько минут для большой коллекции.</p>
<pre class="mermaid">%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '14px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 45, 'rankSpacing': 45}
}}%%
flowchart TD
A["Клиент"] --> B["Jellyfin :8096"]
B --> C{"Транскодинг нужен?"}
C -->|"Direct Play"| D["Файл → клиент"]
C -->|"Transcoding"| E["FFmpeg перекодирует"]
E --> F{"GPU доступен?"}
F -->|"Intel QSV/NVENC"| G["Аппаратный транскодинг"]
F -->|"Нет GPU"| H["CPU транскодинг"]
G --> D
H --> D
B --> I["TMDb / TheTVDB"]
I --> J["Метаданные и обложки"]
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style B fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style E fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#c2410c
style H fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#dc2626
</pre>
<h2>Настройка портов Jellyfin</h2>
<p>По умолчанию Jellyfin слушает на двух портах. Если используешь <code>network_mode: host</code> — они открыты сразу. Если bridge — пропиши маппинг в compose.</p>
<table>
<thead>
<tr>
<th>Порт</th>
<th>Протокол</th>
<th>Назначение</th>
<th>Нужен снаружи?</th>
</tr>
</thead>
<tbody>
<tr>
<td>8096</td>
<td>TCP</td>
<td>Web UI и API (HTTP)</td>
<td>Через reverse proxy</td>
</tr>
<tr>
<td>8920</td>
<td>TCP</td>
<td>Web UI и API (HTTPS)</td>
<td>Опционально</td>
</tr>
<tr>
<td>1900</td>
<td>UDP</td>
<td>DLNA autodiscovery (SSDP)</td>
<td>Нет (только LAN)</td>
</tr>
<tr>
<td>7359</td>
<td>UDP</td>
<td>Jellyfin autodiscovery</td>
<td>Нет (только LAN)</td>
</tr>
</tbody>
</table>
<p>Для внешнего доступа открывай только 443 через reverse proxy. Напрямую 8096 наружу — нежелательно: нет HTTPS, нет ограничений по IP.</p>
<p>Если используешь UFW:</p>
<pre><code class="language-bash">
# Только для доступа из локальной сети (замени на свою подсеть)
ufw allow from 192.168.1.0/24 to any port 8096 proto tcp
ufw allow from 192.168.1.0/24 to any port 1900 proto udp
ufw allow from 192.168.1.0/24 to any port 7359 proto udp
ufw reload
</code></pre>
<h2>Настройка HTTPS через Nginx Proxy Manager</h2>
<p>Без HTTPS Jellyfin доступен по HTTP — это нормально для локальной сети. Но если хочешь заходить снаружи или через мобильное приложение вне дома — нужен HTTPS. Самый простой способ для homelab — Nginx Proxy Manager.</p>
<p>Если NPM у тебя уже стоит — добавь проксирование для Jellyfin. Если нет — добавь в тот же docker-compose.yml или в отдельный файл:</p>
<pre><code class="language-text">
services:
nginx-proxy-manager:
image: jc21/nginx-proxy-manager:latest
container_name: npm
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "81:81" # веб-интерфейс NPM
volumes:
- /opt/npm/data:/data
- /opt/npm/letsencrypt:/etc/letsencrypt
</code></pre>
<p>После запуска NPM зайди на <code>http://IP:81</code>, дефолтные креды: <code>admin@example.com / changeme</code>. Смени их сразу.</p>
<p>Создай Proxy Host в NPM:</p>
<ul>
<li>Domain Names: jellyfin.твойдомен.ru</li>
<li>Forward Hostname/IP: IP сервера (или jellyfin если в одной docker-сети)</li>
<li>Forward Port: 8096</li>
<li>Websockets Support: включи</li>
<li>SSL Certificate: Request a new SSL Certificate (Let’s Encrypt)</li>
</ul>
<p>После этого зайди в Jellyfin — <strong>Панель управления → Сеть → Публичный URL сервера Jellyfin</strong> — и вбей туда <code>https://jellyfin.твойдомен.ru</code>.</p>
"Важно
<br />
Без правильно указанного PublishedServerUrl мобильные клиенты не подключатся снаружи. Jellyfin выдаёт клиенту свой адрес при подключении — и если там localhost или внутренний IP, стриминг падает после первого экрана настройки.<br />
<h3>Альтернатива: Caddy как reverse proxy</h3>
<p>Caddy проще в конфигурации — он сам получает и обновляет сертификаты без NPM. Создай Caddyfile:</p>
<pre><code class="language-text">
jellyfin.твойдомен.ru {
reverse_proxy localhost:8096
}
</code></pre>
<p>Это всё. Caddy сам сходит в Let’s Encrypt, получит сертификат и настроит HTTPS. Без дополнительных действий.</p>
<h2>Настройка метаданных и библиотек</h2>
<p>Метаданные — это обложки, описания, рейтинги, актёры. Без них Jellyfin выглядит как файловый менеджер. По умолчанию он тянет данные с TMDb для фильмов и TheTVDB для сериалов. Если не заработало — скорее всего проблема в именовании файлов или регионе.</p>
<p>Зайди в <strong>Панель управления → Библиотеки → [выбери библиотеку] → Настроить метаданные</strong>.</p>
<p>Что важно настроить:</p>
<ul>
<li><strong>Провайдеры метаданных</strong> — TMDb на первом месте для фильмов, TheTVDB для сериалов</li>
<li><strong>Язык метаданных</strong> — ru для русских названий, en как запасной</li>
<li><strong>Загружать обложки</strong> — включи все типы: Primary, Backdrop, Banner</li>
<li><strong>Периодическое обновление метаданных</strong> — раз в 30 дней достаточно</li>
</ul>
<p>Если метаданные не подтянулись для конкретного фильма — кликни на него, нажми три точки, выбери «Обновить метаданные». Jellyfin откроет диалог поиска — можно вручную ввести правильное название или ID из TMDb.</p>
<pre><code class="language-bash">
# Принудительное обновление метаданных через API (если нужно массово)
curl -X POST "http://localhost:8096/Library/Refresh" \
-H "X-Emby-Token: ВАШ_API_КЛЮЧ"
</code></pre>
<p>API-ключ найдёшь в <strong>Панель управления → API-ключи → Создать</strong>.</p>
<h3>Jellyfin сериалы не определяются: правильное именование</h3>
<p>Самая частая проблема с сериалами — неправильное имя файла. Jellyfin строго следует соглашению Kodi/Emby:</p>
<pre><code class="language-text">
# Правильно:
Название сериала/Season 01/Название сериала S01E01.mkv
# Тоже работает:
Название сериала/S01E01 - Название серии.mkv
# Не работает:
Название сериала/1x01.mkv
Название сериала/01-01.mkv
Название сериала/ep01.mkv
</code></pre>
<p>Если файлы уже лежат с неправильными именами — не паникуй. Есть два пути: переименовать через <a href="https://github.com/Tautulli/Tautulli" target="_blank" rel="nofollow noopener noreferrer">FileBot</a> или вручную найти нужный сериал через «Изменить метаданные» в интерфейсе Jellyfin.</p>
<h2>Плагины Jellyfin: что ставить</h2>
<p>Jellyfin поддерживает плагины — расширения функциональности. Каталог доступен прямо в интерфейсе: <strong><a title="Плагины WordPress: облако таксономий в боковую панель (без боли и шаманства)" href="https://it-apteka.com/plaginy-wordpress-oblako-taksonomij-v-bokovuju-panel-bez-boli-i-shamanstva/" target="_blank" rel="noopener" data-wpil-monitor-id="2527">Панель управления → Плагины</a> → Каталог</strong>.</p>
<p>Вот что реально полезно из коробочного каталога:</p>
<table>
<thead>
<tr>
<th>Плагин</th>
<th>Что делает</th>
<th>Обязателен?</th>
</tr>
</thead>
<tbody>
<tr>
<td>Intro Skipper</td>
<td>Автоматически пропускает интро и концовки в сериалах</td>
<td>Да, если смотришь сериалы</td>
</tr>
<tr>
<td>Open Subtitles</td>
<td>Скачивает субтитры с opensubtitles.org</td>
<td>Да, если нужны субтитры</td>
</tr>
<tr>
<td>Playback Reporting</td>
<td>Статистика просмотров по пользователям</td>
<td>Нет (для семьи или ценителей)</td>
</tr>
<tr>
<td>Merge Versions</td>
<td>Объединяет дубли одного фильма в разных качествах</td>
<td>Нет (если есть дубли)</td>
</tr>
<tr>
<td>Skin Manager</td>
<td>Кастомные темы интерфейса</td>
<td>Нет</td>
</tr>
</tbody>
</table>
<p>Для установки Intro Skipper нужно немного больше настроек. Плагин анализирует аудиодорожки и находит повторяющиеся участки (типичный интро). После <a title="Proxmox Backup Server: установка, настройка и восстановление VM — полный гайд" href="https://it-apteka.com/proxmox-backup-server-stavim-nastraivaem-ne-terjaem-vm/" target="_blank" rel="noopener" data-wpil-monitor-id="2524">установки зайди в настройки</a> плагина и запусти анализ библиотеки — это займёт время.</p>
"Внешние
<br />
Кроме официального каталога есть сторонние репозитории плагинов. Добавлять их нужно через Панель управления → Плагины → Репозитории. Самый известный сторонний плагин — Jellyfin.Plugin.Anime для лучшей поддержки аниме с AniDB. Сторонние плагины ставь осторожно — они не проходят проверку от команды Jellyfin.<br />
<h2>Клиенты Jellyfin: на чём смотреть</h2>
<p>Клиент — это приложение которое подключается к серверу и воспроизводит контент. Сам сервер — только хранилище и стриминг. Jellyfin работает почти на всём.</p>
<table>
<thead>
<tr>
<th>Платформа</th>
<th>Клиент</th>
<th>Где скачать</th>
<th>Качество</th>
</tr>
</thead>
<tbody>
<tr>
<td>Android TV / Google TV</td>
<td>Jellyfin for Android TV</td>
<td>Google Play</td>
<td>Отличное</td>
</tr>
<tr>
<td>Android (телефон)</td>
<td>Jellyfin for Android</td>
<td>Google Play / F-Droid</td>
<td>Хорошее</td>
</tr>
<tr>
<td>iOS / iPadOS</td>
<td>Jellyfin Mobile</td>
<td>App Store</td>
<td>Хорошее</td>
</tr>
<tr>
<td><a class="wpil_keyword_link" href="https://it-apteka.com/category/windows-server/" target="_blank" rel="noopener" title="Windows Server" data-wpil-keyword-link="linked" data-wpil-monitor-id="2532">Windows</a></td>
<td>Jellyfin Media Player</td>
<td>GitHub Releases</td>
<td>Отличное</td>
</tr>
<tr>
<td>macOS</td>
<td>Jellyfin Media Player</td>
<td>GitHub Releases</td>
<td>Хорошее</td>
</tr>
<tr>
<td>Веб-браузер</td>
<td>Встроенный веб-клиент</td>
<td>http://IP:8096</td>
<td>Зависит от браузера</td>
</tr>
<tr>
<td>Roku</td>
<td>Jellyfin for Roku</td>
<td>Roku Channel Store</td>
<td>Базовое</td>
</tr>
<tr>
<td>Kodi</td>
<td>Jellyfin for Kodi</td>
<td>kodi.jellyfin.org</td>
<td>Отличное</td>
</tr>
<tr>
<td>Samsung Smart TV</td>
<td>Только веб-браузер</td>
<td>Встроенный браузер</td>
<td>Среднее</td>
</tr>
</tbody>
</table>
<p>Лучший клиент для десктопа — Jellyfin Media Player на базе MPV. Он играет почти всё без транскодинга, поддерживает HDR и субтитры. Веб-клиент в Chrome/Firefox нормально тянет H.264, но H.265 и AV1 зависят от поддержки браузером.</p>
<p>Для телевизоров LG (webOS) и Samsung (Tizen) официальных клиентов нет — только встроенный браузер. Но если у тебя Android TV приставка — всё отлично, клиент есть и работает хорошо.</p>
<h2>Аппаратный транскодинг: Intel QSV</h2>
<p>Если сервер на Intel (Celeron N5105, N100, i3/i5 с iGPU) — включи аппаратный транскодинг. Это уменьшит нагрузку на CPU при конвертации видео в разы. 4K поток который убивает CPU транскодингом — на Intel QuickSync проходит с нагрузкой 15-20%.</p>
<p>Проверь что GPU виден в системе:</p>
<pre><code class="language-bash">
ls /dev/dri
# Должно быть: card0 renderD128
</code></pre>
<p>Узнай GID группы render:</p>
<pre><code class="language-bash">
getent group render
# Вывод: render:x:109:
# 109 - это GID, подставь его в compose
</code></pre>
<p>Обнови compose-файл — раскомментируй строки с devices и group_add:</p>
<pre><code class="language-text">
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
network_mode: host
environment:
- JELLYFIN_PublishedServerUrl=http://192.168.1.100:8096
volumes:
- /opt/jellyfin/config:/config
- /opt/jellyfin/cache:/cache
- /opt/jellyfin/data:/data
- /mnt/media:/media:ro
devices:
- /dev/dri:/dev/dri
group_add:
- "109"
</code></pre>
<p>Перезапусти контейнер:</p>
<pre><code class="language-bash">
cd /opt/jellyfin
docker compose down && docker compose up -d
</code></pre>
<p>Теперь в Jellyfin — <strong>Панель управления → Воспроизведение → Транскодирование</strong>. В поле «Аппаратное ускорение» выбери «Intel QuickSync (QSV)». Включи все кодеки которые поддерживает твой процессор.</p>
<h2>Автоматическое обновление Jellyfin</h2>
<p>Ручное обновление — одна команда. Но лучше автоматизировать через Watchtower или cron.</p>
<p>Ручное обновление:</p>
<pre><code class="language-bash">
cd /opt/jellyfin
docker compose pull
docker compose up -d
# Проверь что новая версия запустилась
docker compose logs --tail=20
</code></pre>
<p>Через Watchtower — автообновление всех контейнеров ночью:</p>
<pre><code class="language-text">
services:
watchtower:
image: containrrr/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_SCHEDULE=0 0 3 * * * # 3:00 ночи
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_NOTIFICATIONS=email # опционально
</code></pre>
<p>Но учти: Watchtower обновит все контейнеры без предупреждения. Если это не то что хочешь — используй его только для Jellyfin, указав конкретный контейнер через label.</p>
<h2>Резервное копирование</h2>
<p>Что бэкапить и зачем:</p>
<table>
<thead>
<tr>
<th>Что</th>
<th>Путь</th>
<th>Почему важно</th>
<th>Как часто</th>
</tr>
</thead>
<tbody>
<tr>
<td>Конфиг сервера</td>
<td>/opt/jellyfin/config/</td>
<td>Настройки, пользователи, API-ключи</td>
<td>Ежедневно</td>
</tr>
<tr>
<td>БД (jellyfin.db)</td>
<td>/opt/jellyfin/data/data/</td>
<td>Вся медиатека, история просмотров</td>
<td>Ежедневно</td>
</tr>
<tr>
<td>Кеш метаданных</td>
<td>/opt/jellyfin/cache/</td>
<td>Обложки, описания (можно скачать заново)</td>
<td>Раз в неделю</td>
</tr>
<tr>
<td>docker-compose.yml</td>
<td>/opt/jellyfin/</td>
<td>Конфиг контейнера</td>
<td>При изменениях</td>
</tr>
</tbody>
</table>
<p>Скрипт бэкапа конфига (добавь в cron):</p>
<pre><code class="language-bash">
#!/bin/bash
BACKUP_DIR="/backup/jellyfin"
DATE=$(date +%Y%m%d)
mkdir -p "$BACKUP_DIR"
# Останови контейнер перед бэкапом БД
docker stop jellyfin
# Бэкап конфига и данных
tar -czf "$BACKUP_DIR/jellyfin-config-$DATE.tar.gz" /opt/jellyfin/config /opt/jellyfin/data
# Запусти обратно
docker start jellyfin
# Удали бэкапы старше 7 дней
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +7 -delete
echo "Backup complete: jellyfin-config-$DATE.tar.gz"
</code></pre>
<p>Добавь в cron:</p>
<pre><code class="language-bash">
crontab -e
# Добавь строку:
0 2 * * * /opt/scripts/jellyfin-backup.sh >> /var/log/jellyfin-backup.log 2>&1
</code></pre>
<h2>Troubleshooting: 8 проблем и их решения</h2>
<h3>1. Jellyfin не запускается после docker compose up</h3>
<p>Смотри логи:</p>
<pre><code class="language-bash">
docker compose logs jellyfin --tail=100
</code></pre>
<p>Типичные причины: нет прав на папки конфига, занят порт 8096, неправильный путь в volumes.</p>
<pre><code class="language-bash">
# Проверь что порт свободен
ss -tlnp | grep 8096
# Проверь права
ls -la /opt/jellyfin/
# Исправь права если нужно
chown -R 1000:1000 /opt/jellyfin/config /opt/jellyfin/cache /opt/jellyfin/data
</code></pre>
<h3>2. Медиатека пустая, файлы не появляются</h3>
<p>Проверь что путь в compose совпадает с реальным путём. Контейнер видит файлы через маппинг — если написал <code>/mnt/data:/media</code>, то в интерфейсе при добавлении библиотеки путь должен быть <code>/media</code>, а не <code>/mnt/data</code>.</p>
<pre><code class="language-bash">
# Зайди в контейнер и проверь что файлы видны
docker exec -it jellyfin ls /media/movies/
</code></pre>
<h3>3. Метаданные не загружаются</h3>
<p>Чаще всего — <a class="wpil_keyword_link" href="https://it-apteka.com/tag/dns/" target="_blank" rel="noopener" title="DNS" data-wpil-keyword-link="linked" data-wpil-monitor-id="2537">DNS</a> в контейнере не работает или TMDb недоступен. Проверь:</p>
<pre><code class="language-bash">
# Проверь доступ к TMDb изнутри контейнера
docker exec -it jellyfin curl -I https://api.themoviedb.org
</code></pre>
<p>Если нет ответа — проблема с DNS или файрволом. При network_mode: host используется DNS хоста. Проверь <code>/etc/resolv.conf</code> на сервере.</p>
<h3>4. Видео тормозит или не воспроизводится</h3>
<p>Определи: это Direct Play или Transcoding. Зайди в веб-интерфейс, начни воспроизведение, нажми на иконку «i» (информация о воспроизведении). Там покажет метод.</p>
<ul>
<li>Direct Play тормозит — проблема с сетью или диском. Проверь скорость чтения с диска: <code>dd if=/mnt/media/test.mkv of=/dev/null bs=1M</code></li>
<li>Transcoding тормозит — нагрузка на CPU. Включи аппаратное ускорение или снизь качество транскодинга</li>
<li>Браузер не играет H.265 — нормально, большинство браузеров не поддерживают. Используй настольный клиент Jellyfin Media Player</li>
</ul>
<h3>5. Jellyfin не виден в локальной сети</h3>
<p>Если используешь <code>network_mode: bridge</code> вместо host — DLNA не работает. Либо переключись на host, либо смирись с тем что телевизоры не найдут сервер автоматически и добавляй вручную по IP.</p>
<pre><code class="language-bash">
# Проверь что Jellyfin слушает на нужном интерфейсе
ss -tlnp | grep 8096
</code></pre>
<h3>6. Ошибка «Invalid username or password» после обновления</h3>
<p>После некоторых обновлений случается сброс сессий. Просто войди заново. Если не помогает — пароль можно сбросить через конфиг:</p>
<pre><code class="language-bash">
# Останови сервер
docker stop jellyfin
# Отредактируй файл пользователя
# Пользователи хранятся в /opt/jellyfin/config/data/users/
ls /opt/jellyfin/config/data/users/
</code></pre>
<p>Проще — создай нового администратора через <code>jellyfin --nowebclient</code> если доступ к серверу есть по SSH.</p>
<h3>7. Субтитры не отображаются</h3>
<p>Встроенные субтитры (.srt рядом с файлом) работают сразу. ASS/SSA требуют конвертации — это нагрузка на транскодинг. PGS субтитры из Blu-ray тоже требуют транскодинга.</p>
<pre><code class="language-bash">
# Субтитры должны лежать рядом с файлом с тем же именем
Inception (2010)/
├── Inception (2010).mkv
├── Inception (2010).ru.srt # русские
└── Inception (2010).en.srt # английские
</code></pre>
<h3>8. После обновления пропали плагины</h3>
<p>Плагины для Jellyfin привязаны к конкретной версии API. После мажорного обновления плагины могут стать несовместимы — это нормально. Зайди в каталог плагинов и переустанови их. Если плагин не появился в каталоге — ищи обновлённую версию на GitHub.</p>
<h2>Мониторинг и профилактика</h2>
<p>Jellyfin пишет логи в <code>/opt/jellyfin/config/log/</code>. Периодически чисти старые:</p>
<pre><code class="language-bash">
# Логи старше 30 дней
find /opt/jellyfin/config/log/ -name "*.log" -mtime +30 -delete
</code></pre>
<p>Кеш метаданных растёт со временем. Если диск с конфигом заполнился — первый подозреваемый именно он:</p>
<pre><code class="language-bash">
du -sh /opt/jellyfin/cache/
# Если несколько гигабайт - можно почистить
# Jellyfin скачает всё заново при следующем сканировании
docker stop jellyfin
rm -rf /opt/jellyfin/cache/*
docker start jellyfin
</code></pre>
<p><a title="Установка и настройка Uptime Kuma: self-hosted мониторинг сайтов за 5 минут" href="https://it-apteka.com/uptime-kuma-alerting-bez-zamorochek-dlja-admina-kotoryj-cenit-vremja/" target="_blank" rel="noopener" data-wpil-monitor-id="2522">Uptime Kuma для мониторинга</a> доступности — добавь HTTP-монитор на <code>http://IP:8096/health</code>. Этот endpoint возвращает 200 если Jellyfin жив.</p>
<h2>Альтернативы Jellyfin</h2>
<table>
<thead>
<tr>
<th>Решение</th>
<th>Лицензия</th>
<th>Аккаунт нужен?</th>
<th>Когда выбирать</th>
</tr>
</thead>
<tbody>
<tr>
<td>Jellyfin</td>
<td>GPL-2.0, бесплатно</td>
<td>Нет</td>
<td>Приватность, полный контроль</td>
</tr>
<tr>
<td>Plex</td>
<td>Freemium</td>
<td>Да, обязательно</td>
<td>Лучшие клиенты, простота</td>
</tr>
<tr>
<td>Emby</td>
<td>Freemium</td>
<td>Нет (но Premier платный)</td>
<td>Промежуточный вариант</td>
</tr>
<tr>
<td>Kodi (локально)</td>
<td>GPL, бесплатно</td>
<td>Нет</td>
<td>Только локальное воспроизведение без сервера</td>
</tr>
</tbody>
</table>
<p>Plex выигрывает по клиентам — его приложения на TV полированнее. Но требует аккаунт, и если серверы Plex лягут — твой медиасервер тоже перестанет работать снаружи. Jellyfin полностью автономен.</p>
<h2>FAQ</h2>
<h3>Почему Jellyfin не работает после настройки?</h3>
<p>Проверь три вещи по порядку. Первое — запущен ли контейнер: <code>docker compose ps</code>. Второе — порт 8096 слушается: <code>ss -tlnp | grep 8096</code>. Третье — файрвол разрешает подключение: <code>ufw status</code>. В 90% случаев проблема в одном из этих трёх мест.</p>
<h3>Как проверить что Jellyfin работает правильно?</h3>
<p>Открой <code>http://IP:8096/health</code> — должен вернуть статус 200 и слово «Healthy». Затем зайди в веб-интерфейс, открой любой файл и проверь в информации о воспроизведении — там покажет Direct Play или Transcoding. Если Direct Play — сервер работает корректно.</p>
<h3>Что делать если Jellyfin не находит сериалы?</h3>
<p>Переименуй файлы по шаблону <code>Название S01E01.mkv</code>. Папки: <code>Название сериала/Season 01/</code>. После переименования принудительно запусти сканирование: <strong>Панель управления → Библиотеки → Сканировать все библиотеки</strong>. Если не помогло — кликни на сериал и выбери «Обновить метаданные» вручную.</p>
<h3>Чем Jellyfin отличается от Plex?</h3>
<p>Jellyfin полностью бесплатный и открытый, не требует аккаунта и работает без интернета. Plex требует аккаунт и часть функций платная. Клиенты Plex на TV лучше отполированы, зато Jellyfin не передаёт данные о просмотрах на внешние серверы.</p>
<h3>Как открыть Jellyfin снаружи безопасно?</h3>
<p>Поставь <a title="ACME + Nginx: настройка Let’s Encrypt вручную и через Nginx Proxy Manager" href="https://it-apteka.com/acme-nginx-nastrojka-let-s-encrypt-vruchnuju-i-cherez-nginx-proxy-manager/" target="_blank" rel="noopener" data-wpil-monitor-id="2521">Nginx Proxy Manager</a> или Caddy, получи SSL-сертификат для своего домена, проксируй трафик на порт 8096. Не открывай 8096 напрямую в интернет. Дополнительно ограничь число попыток входа в <a href="https://it-apteka.com/kakoj-vpn-server-ustanovit-na-ubuntu-dlja-nativnogo-podkljuchenija/" title="Настройка IKEv2 VPN сервера на Ubuntu 24.04: StrongSwan без лишних клиентов" target="_blank" rel="noopener" data-wpil-monitor-id="2759">настройках Jellyfin — Панель управления → Сеть</a><strong> → Ограничение входа</strong>.</p>
<h2>Итог</h2>
<p>Jellyfin сервер поднят, метаданные тянутся, клиенты подключаются. Структура папок правильная — сериалы определяются, обложки загружаются. HTTPS через NPM или Caddy — снаружи всё работает через твой домен.</p>
<p>Следующий шаг для homelab — Sonarr и Radarr. Они автоматически скачивают новые серии и фильмы и кладут в нужные папки с правильными именами. Jellyfin подхватит всё автоматически. Про эту связку напишу отдельно.</p>
"Не
<br />
Пиши в комментарии — разберёмся. Указывай версию Jellyfin, ОС, и что именно происходит. Скопируй вывод <strong>docker compose logs jellyfin —tail=50</strong> — это сэкономит время.<br />
Быстрый ответ
Установка Jellyfin через Docker Compose — 4 шага:
- Создай docker-compose.yml с образом jellyfin/jellyfin
- Пропиши пути к медиатеке и папке с конфигом
- Запусти контейнер: docker compose up -d
- Открой браузер: http://IP:8096 — пройди мастер настройки
Всё. Дальше — детали, без которых оно либо не заработает, либо заработает не так.
Зачем Jellyfin, если есть Plex и Emby
Plex требует аккаунт. Emby в бесплатной версии срезает функции. Jellyfin — полностью открытый, без регистрации, без подписки, без телеметрии. Установил, настроил — работает. Никто не знает что у тебя на диске, и никто не отберёт функциональность если ты не платишь.
Установка Jellyfin занимает от 10 минут. На выходе получаешь медиасервер который стримит фильмы, сериалы и музыку на любое устройство в сети — и за её пределами, если настроишь внешний доступ.
Это вторая статья серии про OpenMediaVault homelab. В первой части разобрали 20 приложений для OMV. Здесь — Jellyfin от установки до продакшн-конфига с HTTPS, плагинами и нормальной структурой медиатеки.
Что будет в статье:
- Установка через Docker Compose — самый правильный способ
- Структура папок которая не сломает метаданные
- Настройка библиотек, сканирование, обложки
- HTTPS через Nginx Proxy Manager или Caddy
- Полезные плагины: Intro Skipper, Open Subtitles, Playback Reporting
- Клиенты для телевизора, телефона и браузера
- Troubleshooting — 8 типичных проблем с решениями
Потребуется: Linux-сервер или NAS с Docker, ~30 минут, папка с медиаконтентом. Железо — в таблице ниже.
Системные требования
| Параметр |
Минимум |
Комфортно |
Для транскодинга 4K |
| CPU |
2 ядра, x86_64 |
4 ядра |
6+ ядер или Intel QSV/NVENC |
| RAM |
2 ГБ |
4 ГБ |
8 ГБ+ |
| Диск (система) |
20 ГБ SSD |
40 ГБ SSD |
40 ГБ SSD |
| ОС |
Debian 11+, Ubuntu 22.04+ |
Debian 12 |
Debian 12 + GPU драйверы |
| Docker |
24.x+ |
25.x+ |
25.x+ с nvidia-container-toolkit |
| Сеть |
100 Мбит (для 1080p direct play) |
Гигабит LAN |
Гигабит LAN |
На момент публикации актуальна версия Jellyfin 10.10.x. Перед установкой проверь свежие релизы на github.com/jellyfin/jellyfin/releases.
Важный момент про транскодинг. Если клиент воспроизводит файл напрямую без перекодирования — это Direct Play, нагрузки почти нет. Если нужно конвертировать на лету — Transcoding, и тут без нормального железа будут тормоза. Современные смарт-телевизоры и приставки умеют H.264 и H.265 напрямую. Старые и некоторые веб-браузеры — нет.
Структура папок до установки
Сначала разберись с папками — потом всё остальное. Jellyfin определяет тип контента по структуре директорий. Если положить сериалы не туда — метаданные не подтянутся, а разбираться потом неприятно.
Правильная структура:
/opt/jellyfin/
├── config/ # конфиг Jellyfin - маппится в контейнер
├── cache/ # кеш метаданных и обложек
└── data/ # БД, журналы, временные файлы транскодинга
/mnt/media/ # или где у тебя лежат файлы
├── movies/ # фильмы
│ ├── Inception (2010)/
│ │ └── Inception (2010).mkv
│ └── The Matrix (1999)/
│ └── The Matrix (1999).mkv
├── tvshows/ # сериалы
│ ├── Breaking Bad/
│ │ ├── Season 01/
│ │ │ ├── Breaking Bad S01E01.mkv
│ │ │ └── Breaking Bad S01E02.mkv
│ │ └── Season 02/
│ └── Severance/
│ └── Season 01/
├── music/ # музыка
└── photos/ # фото
Запомни правило именования: Название (Год) для фильмов и SxxExx для серий. Jellyfin использует TMDb и TheTVDB для поиска метаданных — если имя файла не совпадает с базой, будут проблемы. Год в скобках критичен если фильм выходил несколько раз или есть ремейк.
Создай структуру:
mkdir -p /opt/jellyfin/{config,cache,data}
# Медиапапки - замени путь на свой
mkdir -p /mnt/media/{movies,tvshows,music,photos}
Установка Jellyfin через Docker Compose
Ставить через Docker Compose — правильный выбор. Конфиг в одном файле, легко обновлять, легко переносить. Нативная установка через deb-пакет тоже работает, но потом будешь вручную следить за обновлениями и зависимостями.
Создай файл конфигурации:
nano /opt/jellyfin/docker-compose.yml
Вставь содержимое:
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
network_mode: host
environment:
- JELLYFIN_PublishedServerUrl=http://192.168.1.100:8096 # замени на свой IP
volumes:
- /opt/jellyfin/config:/config
- /opt/jellyfin/cache:/cache
- /opt/jellyfin/data:/data
- /mnt/media:/media:ro
# Если есть Intel iGPU для аппаратного транскодинга:
# devices:
# - /dev/dri:/dev/dri
# group_add:
# - "109" # группа render, проверь: getent group render
Несколько пояснений по compose-файлу. Параметр network_mode: host даёт контейнеру прямой доступ к сети хоста. Это нужно для DLNA и автообнаружения в локальной сети — без этого смарт-телевизоры не найдут сервер автоматически. Медиапапка монтируется как :ro (read-only) — Jellyfin не должен ничего писать туда, только читать. restart: unless-stopped — контейнер поднимется после перезагрузки, если ты его сам не остановил.
Про PUID/PGID
В
примере не указаны PUID и PGID — контейнер запустится от root. Для homelab это приемлемо. Для продакшн-среды добавь переменные окружения PUID и PGID с UID/GID пользователя у которого есть доступ к медиафайлам. Узнать:
id имя_пользователя
Запусти контейнер:
cd /opt/jellyfin
docker compose up -d
Проверь что запустился:
docker compose ps
docker compose logs --tail=50
В логах должна появиться строка вида Jellyfin version: 10.x.x и Startup complete. Если видишь ошибки доступа к файлам — проверь права на папки.
Первый запуск и мастер настройки
Открой браузер и иди по адресу http://IP-сервера:8096. Пойдёт мастер начальной настройки — он запускается только один раз.
Шаги мастера:
- Язык интерфейса — выбери русский, если хочешь. Jellyfin переведён прилично.
- Создание администратора — придумай имя и пароль. Не admin/admin, серьёзно.
- Настройка медиатеки — добавляй библиотеки здесь. Тип контента выбери правильно: фильмы / сериалы / музыка / фото. Путь — /media/movies (или что ты назвал в compose).
- Метаданные — выбери язык для метаданных. Русский для русских тайтлов, английский как запасной.
- Готово — сервер начнёт сканирование библиотек.
После завершения мастера — иди в Панель управления → Библиотеки и нажми «Сканировать все библиотеки». Первое сканирование может занять несколько минут для большой коллекции.
%%{init: {
'theme': 'base',
'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e293b',
'primaryBorderColor': '#94a3b8',
'lineColor': '#64748b',
'fontSize': '14px',
'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
},
'flowchart': {'curve': 'linear', 'nodeSpacing': 45, 'rankSpacing': 45}
}}%%
flowchart TD
A["Клиент"] --> B["Jellyfin :8096"]
B --> C{"Транскодинг нужен?"}
C -->|"Direct Play"| D["Файл → клиент"]
C -->|"Transcoding"| E["FFmpeg перекодирует"]
E --> F{"GPU доступен?"}
F -->|"Intel QSV/NVENC"| G["Аппаратный транскодинг"]
F -->|"Нет GPU"| H["CPU транскодинг"]
G --> D
H --> D
B --> I["TMDb / TheTVDB"]
I --> J["Метаданные и обложки"]
style A fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
style B fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
style E fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#c2410c
style H fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#dc2626
Настройка портов Jellyfin
По умолчанию Jellyfin слушает на двух портах. Если используешь network_mode: host — они открыты сразу. Если bridge — пропиши маппинг в compose.
| Порт |
Протокол |
Назначение |
Нужен снаружи? |
| 8096 |
TCP |
Web UI и API (HTTP) |
Через reverse proxy |
| 8920 |
TCP |
Web UI и API (HTTPS) |
Опционально |
| 1900 |
UDP |
DLNA autodiscovery (SSDP) |
Нет (только LAN) |
| 7359 |
UDP |
Jellyfin autodiscovery |
Нет (только LAN) |
Для внешнего доступа открывай только 443 через reverse proxy. Напрямую 8096 наружу — нежелательно: нет HTTPS, нет ограничений по IP.
Если используешь UFW:
# Только для доступа из локальной сети (замени на свою подсеть)
ufw allow from 192.168.1.0/24 to any port 8096 proto tcp
ufw allow from 192.168.1.0/24 to any port 1900 proto udp
ufw allow from 192.168.1.0/24 to any port 7359 proto udp
ufw reload
Настройка HTTPS через Nginx Proxy Manager
Без HTTPS Jellyfin доступен по HTTP — это нормально для локальной сети. Но если хочешь заходить снаружи или через мобильное приложение вне дома — нужен HTTPS. Самый простой способ для homelab — Nginx Proxy Manager.
Если NPM у тебя уже стоит — добавь проксирование для Jellyfin. Если нет — добавь в тот же docker-compose.yml или в отдельный файл:
services:
nginx-proxy-manager:
image: jc21/nginx-proxy-manager:latest
container_name: npm
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "81:81" # веб-интерфейс NPM
volumes:
- /opt/npm/data:/data
- /opt/npm/letsencrypt:/etc/letsencrypt
После запуска NPM зайди на http://IP:81, дефолтные креды: admin@example.com / changeme. Смени их сразу.
Создай Proxy Host в NPM:
- Domain Names: jellyfin.твойдомен.ru
- Forward Hostname/IP: IP сервера (или jellyfin если в одной docker-сети)
- Forward Port: 8096
- Websockets Support: включи
- SSL Certificate: Request a new SSL Certificate (Let’s Encrypt)
После этого зайди в Jellyfin — Панель управления → Сеть → Публичный URL сервера Jellyfin — и вбей туда https://jellyfin.твойдомен.ru.
Важно для мобильных клиентов
Без правильно указанного PublishedServerUrl мобильные клиенты не подключатся снаружи. Jellyfin выдаёт клиенту свой адрес при подключении — и если там localhost или внутренний IP, стриминг падает после первого экрана настройки.
Альтернатива: Caddy как reverse proxy
Caddy проще в конфигурации — он сам получает и обновляет сертификаты без NPM. Создай Caddyfile:
jellyfin.твойдомен.ru {
reverse_proxy localhost:8096
}
Это всё. Caddy сам сходит в Let’s Encrypt, получит сертификат и настроит HTTPS. Без дополнительных действий.
Настройка метаданных и библиотек
Метаданные — это обложки, описания, рейтинги, актёры. Без них Jellyfin выглядит как файловый менеджер. По умолчанию он тянет данные с TMDb для фильмов и TheTVDB для сериалов. Если не заработало — скорее всего проблема в именовании файлов или регионе.
Зайди в Панель управления → Библиотеки → [выбери библиотеку] → Настроить метаданные.
Что важно настроить:
- Провайдеры метаданных — TMDb на первом месте для фильмов, TheTVDB для сериалов
- Язык метаданных — ru для русских названий, en как запасной
- Загружать обложки — включи все типы: Primary, Backdrop, Banner
- Периодическое обновление метаданных — раз в 30 дней достаточно
Если метаданные не подтянулись для конкретного фильма — кликни на него, нажми три точки, выбери «Обновить метаданные». Jellyfin откроет диалог поиска — можно вручную ввести правильное название или ID из TMDb.
# Принудительное обновление метаданных через API (если нужно массово)
curl -X POST "http://localhost:8096/Library/Refresh" \
-H "X-Emby-Token: ВАШ_API_КЛЮЧ"
API-ключ найдёшь в Панель управления → API-ключи → Создать.
Jellyfin сериалы не определяются: правильное именование
Самая частая проблема с сериалами — неправильное имя файла. Jellyfin строго следует соглашению Kodi/Emby:
# Правильно:
Название сериала/Season 01/Название сериала S01E01.mkv
# Тоже работает:
Название сериала/S01E01 - Название серии.mkv
# Не работает:
Название сериала/1x01.mkv
Название сериала/01-01.mkv
Название сериала/ep01.mkv
Если файлы уже лежат с неправильными именами — не паникуй. Есть два пути: переименовать через FileBot или вручную найти нужный сериал через «Изменить метаданные» в интерфейсе Jellyfin.
Плагины Jellyfin: что ставить
Jellyfin поддерживает плагины — расширения функциональности. Каталог доступен прямо в интерфейсе: Панель управления → Плагины → Каталог.
Вот что реально полезно из коробочного каталога:
| Плагин |
Что делает |
Обязателен? |
| Intro Skipper |
Автоматически пропускает интро и концовки в сериалах |
Да, если смотришь сериалы |
| Open Subtitles |
Скачивает субтитры с opensubtitles.org |
Да, если нужны субтитры |
| Playback Reporting |
Статистика просмотров по пользователям |
Нет (для семьи или ценителей) |
| Merge Versions |
Объединяет дубли одного фильма в разных качествах |
Нет (если есть дубли) |
| Skin Manager |
Кастомные темы интерфейса |
Нет |
Для установки Intro Skipper нужно немного больше настроек. Плагин анализирует аудиодорожки и находит повторяющиеся участки (типичный интро). После установки зайди в настройки плагина и запусти анализ библиотеки — это займёт время.
Внешние репозитории плагинов
Кроме официального каталога есть сторонние репозитории плагинов. Добавлять их нужно через Панель управления → Плагины → Репозитории. Самый известный сторонний плагин — Jellyfin.Plugin.Anime для лучшей поддержки аниме с AniDB. Сторонние плагины ставь осторожно — они не проходят проверку от команды Jellyfin.
Клиенты Jellyfin: на чём смотреть
Клиент — это приложение которое подключается к серверу и воспроизводит контент. Сам сервер — только хранилище и стриминг. Jellyfin работает почти на всём.
| Платформа |
Клиент |
Где скачать |
Качество |
| Android TV / Google TV |
Jellyfin for Android TV |
Google Play |
Отличное |
| Android (телефон) |
Jellyfin for Android |
Google Play / F-Droid |
Хорошее |
| iOS / iPadOS |
Jellyfin Mobile |
App Store |
Хорошее |
| Windows |
Jellyfin Media Player |
GitHub Releases |
Отличное |
| macOS |
Jellyfin Media Player |
GitHub Releases |
Хорошее |
| Веб-браузер |
Встроенный веб-клиент |
http://IP:8096 |
Зависит от браузера |
| Roku |
Jellyfin for Roku |
Roku Channel Store |
Базовое |
| Kodi |
Jellyfin for Kodi |
kodi.jellyfin.org |
Отличное |
| Samsung Smart TV |
Только веб-браузер |
Встроенный браузер |
Среднее |
Лучший клиент для десктопа — Jellyfin Media Player на базе MPV. Он играет почти всё без транскодинга, поддерживает HDR и субтитры. Веб-клиент в Chrome/Firefox нормально тянет H.264, но H.265 и AV1 зависят от поддержки браузером.
Для телевизоров LG (webOS) и Samsung (Tizen) официальных клиентов нет — только встроенный браузер. Но если у тебя Android TV приставка — всё отлично, клиент есть и работает хорошо.
Аппаратный транскодинг: Intel QSV
Если сервер на Intel (Celeron N5105, N100, i3/i5 с iGPU) — включи аппаратный транскодинг. Это уменьшит нагрузку на CPU при конвертации видео в разы. 4K поток который убивает CPU транскодингом — на Intel QuickSync проходит с нагрузкой 15-20%.
Проверь что GPU виден в системе:
ls /dev/dri
# Должно быть: card0 renderD128
Узнай GID группы render:
getent group render
# Вывод: render:x:109:
# 109 - это GID, подставь его в compose
Обнови compose-файл — раскомментируй строки с devices и group_add:
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
network_mode: host
environment:
- JELLYFIN_PublishedServerUrl=http://192.168.1.100:8096
volumes:
- /opt/jellyfin/config:/config
- /opt/jellyfin/cache:/cache
- /opt/jellyfin/data:/data
- /mnt/media:/media:ro
devices:
- /dev/dri:/dev/dri
group_add:
- "109"
Перезапусти контейнер:
cd /opt/jellyfin
docker compose down && docker compose up -d
Теперь в Jellyfin — Панель управления → Воспроизведение → Транскодирование. В поле «Аппаратное ускорение» выбери «Intel QuickSync (QSV)». Включи все кодеки которые поддерживает твой процессор.
Автоматическое обновление Jellyfin
Ручное обновление — одна команда. Но лучше автоматизировать через Watchtower или cron.
Ручное обновление:
cd /opt/jellyfin
docker compose pull
docker compose up -d
# Проверь что новая версия запустилась
docker compose logs --tail=20
Через Watchtower — автообновление всех контейнеров ночью:
services:
watchtower:
image: containrrr/watchtower:latest
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_SCHEDULE=0 0 3 * * * # 3:00 ночи
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_NOTIFICATIONS=email # опционально
Но учти: Watchtower обновит все контейнеры без предупреждения. Если это не то что хочешь — используй его только для Jellyfin, указав конкретный контейнер через label.
Резервное копирование
Что бэкапить и зачем:
| Что |
Путь |
Почему важно |
Как часто |
| Конфиг сервера |
/opt/jellyfin/config/ |
Настройки, пользователи, API-ключи |
Ежедневно |
| БД (jellyfin.db) |
/opt/jellyfin/data/data/ |
Вся медиатека, история просмотров |
Ежедневно |
| Кеш метаданных |
/opt/jellyfin/cache/ |
Обложки, описания (можно скачать заново) |
Раз в неделю |
| docker-compose.yml |
/opt/jellyfin/ |
Конфиг контейнера |
При изменениях |
Скрипт бэкапа конфига (добавь в cron):
#!/bin/bash
BACKUP_DIR="/backup/jellyfin"
DATE=$(date +%Y%m%d)
mkdir -p "$BACKUP_DIR"
# Останови контейнер перед бэкапом БД
docker stop jellyfin
# Бэкап конфига и данных
tar -czf "$BACKUP_DIR/jellyfin-config-$DATE.tar.gz" /opt/jellyfin/config /opt/jellyfin/data
# Запусти обратно
docker start jellyfin
# Удали бэкапы старше 7 дней
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +7 -delete
echo "Backup complete: jellyfin-config-$DATE.tar.gz"
Добавь в cron:
crontab -e
# Добавь строку:
0 2 * * * /opt/scripts/jellyfin-backup.sh >> /var/log/jellyfin-backup.log 2>&1
Troubleshooting: 8 проблем и их решения
1. Jellyfin не запускается после docker compose up
Смотри логи:
docker compose logs jellyfin --tail=100
Типичные причины: нет прав на папки конфига, занят порт 8096, неправильный путь в volumes.
# Проверь что порт свободен
ss -tlnp | grep 8096
# Проверь права
ls -la /opt/jellyfin/
# Исправь права если нужно
chown -R 1000:1000 /opt/jellyfin/config /opt/jellyfin/cache /opt/jellyfin/data
2. Медиатека пустая, файлы не появляются
Проверь что путь в compose совпадает с реальным путём. Контейнер видит файлы через маппинг — если написал /mnt/data:/media, то в интерфейсе при добавлении библиотеки путь должен быть /media, а не /mnt/data.
# Зайди в контейнер и проверь что файлы видны
docker exec -it jellyfin ls /media/movies/
3. Метаданные не загружаются
Чаще всего — DNS в контейнере не работает или TMDb недоступен. Проверь:
# Проверь доступ к TMDb изнутри контейнера
docker exec -it jellyfin curl -I https://api.themoviedb.org
Если нет ответа — проблема с DNS или файрволом. При network_mode: host используется DNS хоста. Проверь /etc/resolv.conf на сервере.
4. Видео тормозит или не воспроизводится
Определи: это Direct Play или Transcoding. Зайди в веб-интерфейс, начни воспроизведение, нажми на иконку «i» (информация о воспроизведении). Там покажет метод.
- Direct Play тормозит — проблема с сетью или диском. Проверь скорость чтения с диска:
dd if=/mnt/media/test.mkv of=/dev/null bs=1M
- Transcoding тормозит — нагрузка на CPU. Включи аппаратное ускорение или снизь качество транскодинга
- Браузер не играет H.265 — нормально, большинство браузеров не поддерживают. Используй настольный клиент Jellyfin Media Player
5. Jellyfin не виден в локальной сети
Если используешь network_mode: bridge вместо host — DLNA не работает. Либо переключись на host, либо смирись с тем что телевизоры не найдут сервер автоматически и добавляй вручную по IP.
# Проверь что Jellyfin слушает на нужном интерфейсе
ss -tlnp | grep 8096
6. Ошибка «Invalid username or password» после обновления
После некоторых обновлений случается сброс сессий. Просто войди заново. Если не помогает — пароль можно сбросить через конфиг:
# Останови сервер
docker stop jellyfin
# Отредактируй файл пользователя
# Пользователи хранятся в /opt/jellyfin/config/data/users/
ls /opt/jellyfin/config/data/users/
Проще — создай нового администратора через jellyfin --nowebclient если доступ к серверу есть по SSH.
7. Субтитры не отображаются
Встроенные субтитры (.srt рядом с файлом) работают сразу. ASS/SSA требуют конвертации — это нагрузка на транскодинг. PGS субтитры из Blu-ray тоже требуют транскодинга.
# Субтитры должны лежать рядом с файлом с тем же именем
Inception (2010)/
├── Inception (2010).mkv
├── Inception (2010).ru.srt # русские
└── Inception (2010).en.srt # английские
8. После обновления пропали плагины
Плагины для Jellyfin привязаны к конкретной версии API. После мажорного обновления плагины могут стать несовместимы — это нормально. Зайди в каталог плагинов и переустанови их. Если плагин не появился в каталоге — ищи обновлённую версию на GitHub.
Мониторинг и профилактика
Jellyfin пишет логи в /opt/jellyfin/config/log/. Периодически чисти старые:
# Логи старше 30 дней
find /opt/jellyfin/config/log/ -name "*.log" -mtime +30 -delete
Кеш метаданных растёт со временем. Если диск с конфигом заполнился — первый подозреваемый именно он:
du -sh /opt/jellyfin/cache/
# Если несколько гигабайт - можно почистить
# Jellyfin скачает всё заново при следующем сканировании
docker stop jellyfin
rm -rf /opt/jellyfin/cache/*
docker start jellyfin
Uptime Kuma для мониторинга доступности — добавь HTTP-монитор на http://IP:8096/health. Этот endpoint возвращает 200 если Jellyfin жив.
Альтернативы Jellyfin
| Решение |
Лицензия |
Аккаунт нужен? |
Когда выбирать |
| Jellyfin |
GPL-2.0, бесплатно |
Нет |
Приватность, полный контроль |
| Plex |
Freemium |
Да, обязательно |
Лучшие клиенты, простота |
| Emby |
Freemium |
Нет (но Premier платный) |
Промежуточный вариант |
| Kodi (локально) |
GPL, бесплатно |
Нет |
Только локальное воспроизведение без сервера |
Plex выигрывает по клиентам — его приложения на TV полированнее. Но требует аккаунт, и если серверы Plex лягут — твой медиасервер тоже перестанет работать снаружи. Jellyfin полностью автономен.
FAQ
Почему Jellyfin не работает после настройки?
Проверь три вещи по порядку. Первое — запущен ли контейнер: docker compose ps. Второе — порт 8096 слушается: ss -tlnp | grep 8096. Третье — файрвол разрешает подключение: ufw status. В 90% случаев проблема в одном из этих трёх мест.
Как проверить что Jellyfin работает правильно?
Открой http://IP:8096/health — должен вернуть статус 200 и слово «Healthy». Затем зайди в веб-интерфейс, открой любой файл и проверь в информации о воспроизведении — там покажет Direct Play или Transcoding. Если Direct Play — сервер работает корректно.
Что делать если Jellyfin не находит сериалы?
Переименуй файлы по шаблону Название S01E01.mkv. Папки: Название сериала/Season 01/. После переименования принудительно запусти сканирование: Панель управления → Библиотеки → Сканировать все библиотеки. Если не помогло — кликни на сериал и выбери «Обновить метаданные» вручную.
Чем Jellyfin отличается от Plex?
Jellyfin полностью бесплатный и открытый, не требует аккаунта и работает без интернета. Plex требует аккаунт и часть функций платная. Клиенты Plex на TV лучше отполированы, зато Jellyfin не передаёт данные о просмотрах на внешние серверы.
Как открыть Jellyfin снаружи безопасно?
Поставь Nginx Proxy Manager или Caddy, получи SSL-сертификат для своего домена, проксируй трафик на порт 8096. Не открывай 8096 напрямую в интернет. Дополнительно ограничь число попыток входа в настройках Jellyfin — Панель управления → Сеть → Ограничение входа.
Итог
Jellyfin сервер поднят, метаданные тянутся, клиенты подключаются. Структура папок правильная — сериалы определяются, обложки загружаются. HTTPS через NPM или Caddy — снаружи всё работает через твой домен.
Следующий шаг для homelab — Sonarr и Radarr. Они автоматически скачивают новые серии и фильмы и кладут в нужные папки с правильными именами. Jellyfin подхватит всё автоматически. Про эту связку напишу отдельно.
Не заработало?
Пиши в комментарии — разберёмся. Указывай версию Jellyfin, ОС, и что именно происходит. Скопируй вывод docker compose logs jellyfin —tail=50 — это сэкономит время.