Как запустить медиасервер?

Проблема

В какой-то момент начинаешь замечать, что у тебя на устройствах скопилось довольно много контетнта (фильмы, сериалы, музыка), который хотелось бы централизовано просматривать и обновлять. Так приходишь к мысли о создании медиасервера, который должен быть доступен 24/7 со всех устройств. Довольно долго я использовал Plex, хоть это и закрытый код. Но слишком хорошо все работало в комплексе и это подкупало. В один из дней получил письмо:

As of April 29, 2025, we’re changing how remote streaming works for personal media libraries, and it will no longer be a free feature on Plex. Going forward, you’ll need a Plex Pass, or our newest subscription offering, Remote Watch Pass, to stream personal media remotely. As a server owner, if you elect to upgrade to a Plex Pass, anyone with access to your server can continue streaming your server content remotely as part of your subscription benefits. Not sure which option is best for you? Check out our plans below to learn more. As always, thanks for your continued support. Sincerely, Your Friends at Plex

Таким образом, я в очередной раз убедился, что меня могут принудительно лишить доступа к моему личному медиа. Поэтому параллельно искал решения. После получения письма я начал экстренный переход на другое решение, так я пришел к Jellyfin.

docker-compose

Для запуска используется docker-compose. Создаём файлы конфигурации:

touch {.env,docker-composse.yml}

Редактируем через nano .env:

HTTP_PROXY=<your_proxy>

По понятным причинам не могу дать подробных инструкций как настроить свой прокси, но могу описать общилими словами, что необходимо чтобы наш трафик проходил через доверенный IP, который не блокируют. Можно и без прокси, но тогда Вы будете ограничены в получении метаданных из открытых источников, часть из которых «недоступна» на текущий момент :).

Редактируем через nano docker-compose.yml:

services:
  jellyfin:
    image: jellyfin/jellyfin
    container_name: jellyfin
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Moscow
      - LD_LIBRARY_PATH=/opt/cuda/lib64:/usr/local/cuda/lib64
      - NVIDIA_VISIBLE_DEVICES=all
      - NVIDIA_DRIVER_CAPABILITIES=all
      - CUDADIR=/usr/local/cuda
      - CUDA_HOME=/usr/local/cuda
      - FORCE_CUDA=1
      - CUDA_VISIBLE_DEVICES=0
      - CUDA_LAUNCH_BLOCKING=1
      - HTTP_PROXY=${HTTP_PROXY}
      - HTTPS_PROXY=${HTTP_PROXY}
    volumes:
      - ./config_jellyfin:/config
      - /mnt/media/serial:/data/tvshows
      - /mnt/media/video:/data/movies
      - /mnt/media/serial:/data/serial
      - /dev/vcsm:/dev/vcsm
      - /dev/vchiq:/dev/vchiq
      - /mnt/media/cources:/data/cources
      - /mnt/media/audiobook:/data/audiobook
      - /mnt/media/music:/data/music
    ports:
      - 8096:8096
      - 8920:8920
      - 7359:7359/udp
      - 1900:1900/udp
    restart: unless-stopped
    devices:
      - /dev/dri:/dev/dri
      - /dev/nvidiactl:/dev/nvidiactl
      - /dev/nvidia0:/dev/nvidia0
    dns:
      - 9.9.9.9
    runtime: nvidia
    network_mode: host

Нюансы:

  1. Пути к вашим медиафайлам замените на свои..

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

  3. Для работы с видеоконтентом крайне рекомендую использовать видеокарту,. Я использую NVidia видеокарту. Прчина моей рекомендации описана ниже, в разделе «Трансодирование».

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

- HTTP_PROXY=${HTTP_PROXY}
- HTTPS_PROXY=${HTTP_PROXY}

Настройка приложения

  1. К UI доступ мы имеем по адресу http://<your_ip>:8096.

  2. Добавляем медиатеки: Панель управления -> Медиатеки -> Медиатеки. Добавляем папки с медиа.

  3. Добаляем плагины через: Панель управления -> Плагины -> Плагины. Я использую в настощий момент:

Название

Описание

URL репозитория (Manifest)

AniDB

Предоставляет метаданные для аниме из базы данных AniDB .

AniList

Загружает информацию о фильмах и сериалах из базы данных AniList .

Artwork

Плагин для улучшения или управления обложками и художественным оформлением медиатеки.

Bookshelf

Добавляет поддержку метаданных и специальных возможностей для организации коллекции книг и аудиокниг .

Cover Art Archive

Позволяет загружать обложки альбомов из архива Cover Art Archive для музыкальной библиотеки.

Discogs

Поставщик метаданных для музыки из базы данных Discogs.

DLNA

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

Fanart

Загружает изображения (постеры, фоны, логотипы) для фильмов, сериалов и исполнителей с сайта fanart.tv .

Google Books

Предоставляет метаданные для книг из Google Books.

Kitsu

Загружает информацию о сериалах и аниме из базы данных Kitsu .

LrcLib Lyrics

Автоматически загружает и применяет тексты песен для вашей музыкальной библиотеки с сервиса LrcLib .

NextPVR

Обеспечивает интеграцию с системой записи ТВ NextPVR, добавляя функционал Live TV и управления записями .

Open Subtitles

Автоматически ищет и загружает субтитры для ваших фильмов и сериалов с OpenSubtitles.org .

Playback Reporting

Собирает и отображает статистику просмотров пользователей, показывая общее время просмотра и другие данные .

Reports

Генерирует подробные отчёты по вашей медиатеке (списки фильмов, сериалов и т.д.) .

Subtitle Extract

Автоматически извлекает встроенные (вшитые в файл) субтитры, чтобы ускорить их отображение при стриминге .

TheTVDB

Основной поставщик метаданных для сериалов из базы данных TheTVDB.com .

TMDb Box Sets

Автоматически создает коллекции (например, «Трилогия «Властелин колец»») на основе данных с сайта TMDb .

TVHeadend

Обеспечивает интеграцию с сервером TVHeadend для просмотра и записи Live TV .

TVmaze

Альтернативный источник метаданных для сериалов из базы данных TVmaze.

VGMdb

Предоставляет метаданные (в основном, для музыки из видеоигр) из базы данных VGMdb.

КиноПоиск

Загружает русскоязычную информацию о фильмах и сериалах (названия, описания, постеры, рейтинги, актёры) с сайта КиноПоиск .

https://raw.githubusercontent.com/LinFor/jellyfin-plugin-kinopoisk/master/dist/manifest.json

SmartLists

Позволяет создавать динамические списки (плейлисты) на основе заданных вами правил и условий.

https://raw.githubusercontent.com/jyourstone/jellyfin-plugin-manifest/main/manifest.json

MusicTags

Плагин для более детального управления и обработки тегов в музыкальных файлах.

https://raw.githubusercontent.com/jyourstone/jellyfin-plugin-manifest/master/manifest.json

Last.fm

Позволяет «скробблить» (отправлять информацию о прослушивании) музыки в Last.fm и может служить источником метаданных .

https://raw.githubusercontent.com/danielfariati/jellyfin-plugin-lastfm/refs/heads/master/manifest.json

Последние 4 плагина устанавливал так:

  1. Войдите в веб-интерфейс Jellyfin (обычно http://<your_ip>:8096) под учётной записью администратора.

  2. Откройте панель управления: нажмите на иконку с тремя горизонтальными полосками (☰) в левом верхнем углу, затем выберите «Dashboard» (Панель управления).

  3. Перейдите в раздел «Plugins» (Плагины) в левой боковой панели.

  4. Переключитесь на вкладку «Repositories» (Репозитории) в верхней части страницы.

  5. Добавьте новый репозиторий:

    • Нажмите кнопку «Add repository» (Добавить репозиторий).

    • Введите:

      • Name — любое понятное название (например, КиноПоиск).

      • URL — вставьте ссылку на manifest.json из таблицы выше.

    • Нажмите «Save» (Сохранить).

  6. Вернитесь на вкладку «Catalog» (Каталог) — теперь в списке должны появиться плагины из добавленного репозитория.

  7. Найдите нужный плагин (например, КиноПоиск) и нажмите «Install» (Установить).

  8. Подтвердите установку и дождитесь завершения процесса. После установки может потребоваться перезапустить Jellyfin, чтобы плагин начал работать (в некоторых случаях система предложит сделать это автоматически).

Через эти плагины мы можем автоматически заполнять метаданные:

Транскодирование

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

        ---
title: Работа транскодирования
---
graph TD
    A[Телефон / Мобильный] --> B[480p / 1 Mbps]
    C[Планшет / Ноутбук] --> D[720p / 2 Mbps]
    E[ПК / Телевизор] --> F[1080p / 3 Mbps]

    B --> G[Транскодирование]
    D --> G
    F --> G

    style A fill:#f9f,stroke:#333
    style C fill:#f9f,stroke:#333
    style E fill:#f9f,stroke:#333
    style B fill:#9cf,stroke:#333
    style D fill:#9cf,stroke:#333
    style F fill:#9cf,stroke:#333
    style G fill:#9f9,stroke:#333
    

Из схемы видно, что для разных устройств требуется разное качество. Для таких операций идеально подходит видеокарта, так как иначе ресурсы сервера будут тратиться неэффективно.

У меня медиасервер установлен в LXC с проброшенной видеокартой, поэтому все процессы смотрю на хосте Proxmox:

Видим, что процесс транскодирования присутсвует, что означает верную настройку системы.

Обслуживание

Данные хранятся в SQLite и для ускорения работы желательно ее периодически осблуживать. Устанавливаем SQLite:

sudo apt update
sudo apt install sqlite3

Добавляем задачи в cron для регулярного обслуживания (crontab -e):

# Пути
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

# Ежедневная лёгкая оптимизация (ANALYZE + PRAGMA optimize) – в 3:00 ночи
0 3 * * * /usr/bin/sqlite3 /home/volokzhanin/media_server/config_jellyfin/data/jellyfin.db "ANALYZE; PRAGMA optimize;"

# Еженедельный VACUUM каждое воскресенье в 4:00
0 4 * * 0 docker stop jellyfin  && /usr/bin/sqlite3 /home/volokzhanin/media_server/config_jellyfin/data/jellyfin.db "VACUUM; ANALYZE; PRAGMA optimize;" && docker start jellyfin

Устройства

На тв и смартфон ставим приложение Jellyfin.

Умный дом

Подключаем интеграцию Jellyfin.

Итог

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

Ссылки:

  1. Зачем нужен собственный сервер в 2025?

  2. Как установить Docker?

  3. Как установить драйвера Nvidia в Linux?

  4. Как запустить сервис по управлению умным домом?