Гид по технологиям

Установка Jellyfin в Docker на Rocky Linux 9

• 7 min read • Инструкции • Обновлено 21 Nov 2025
Jellyfin в Docker на Rocky Linux 9 — пошагово
Jellyfin в Docker на Rocky Linux 9 — пошагово

О чём эта инструкция

  • Цель: быстро и надёжно запустить Jellyfin через Docker на Rocky Linux 9 и сделать его доступным по HTTPS через Nginx.
  • Аудитория: системные администраторы, DevOps-инженеры и продвинутые пользователи Linux.

Важное

  • Используйте FQDN (например, jellyfin.example.com) и укажите корректный DNS на ваш сервер.
  • Не используйте этот сервер для критичных публичных данных без дополнительной защиты и резервного копирования.

Предварительные требования

  • Сервер с Rocky Linux 9, минимум 2 CPU и 4 ГБ оперативной памяти; при необходимости увеличьте ресурсы.
  • Непривилегированный пользователь с sudo.
  • Полностью квалифицированное доменное имя (FQDN), указывающее на сервер (в примерах используется jellyfin.example.com).
  • Обновите систему:
$ sudo dnf update
  • Установите базовые утилиты (некоторые могут уже быть установлены):
$ sudo dnf install wget curl nano unzip yum-utils -y

Шаг 1 — Настройка брандмауэра

Rocky Linux использует firewalld. Проверьте статус:

$ sudo firewall-cmd --state
running

Покажите активные сервисы и порты:

$ sudo firewall-cmd --permanent --list-services

Откройте HTTP и HTTPS:

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https

Добавьте маскарадинг — полезно, если контейнеры общаются с внешними инстансами:

$ sudo firewall-cmd --permanent --add-masquerade

Примените изменения:

$ sudo firewall-cmd --reload

Важно: при использовании нестандартных зон/правил скорректируйте команды под нужную зону.

Шаг 2 — Установка Docker и Docker Compose

Добавьте официальный репозиторий Docker:

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

Установите последнюю версию Docker:

$ sudo dnf install docker-ce docker-ce-cli containerd.io

Если появится конфликт с пакетами runc/buildah, установите с опцией –allowerasing:

$ sudo dnf install docker-ce docker-ce-cli containerd.io docker-compose-plugin --allowerasing

Включите и запустите Docker:

$ sudo systemctl enable docker --now

Проверьте состояние службы (пример вывода оставлен авторским):

? docker.service - Docker Application Container Engine
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
     Active: active (running) since Sat 2022-11-12 00:19:44 UTC; 6s ago
TriggeredBy: ? docker.socket
       Docs: https://docs.docker.com
   Main PID: 99263 (dockerd)
      Tasks: 8
     Memory: 28.1M
        CPU: 210ms
     CGroup: /system.slice/docker.service
             ??99263 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Если не хотите каждый раз использовать sudo с docker, добавьте пользователя в группу docker:

$ sudo usermod -aG docker $(whoami)

Перезапуститесь в сессии или выполните:

$ su - ${USER}

Проверьте группы:

$ groups
navjot wheel docker

Шаг 3 — Создание конфигурации Docker Compose

Создайте директорию для конфигурации:

$ mkdir ~/jellyfin

Перейдите в неё:

$ cd ~/jellyfin

Откройте файл docker-compose.yml для редактирования:

$ nano docker-compose.yml

Вставьте следующий контент (сохраните как docker-compose.yml):

version: '3.8'
services:
  jellyfin:
    image: jellyfin/jellyfin
    container_name: jellyfin
    user: 1000:1000
    volumes:
      - ./config:/config
      - ./cache:/cache
      - ./media:/media
      - ./media2:/media2:ro
    restart: 'unless-stopped'
    ports:
      - 8096:8096
    # Optional - alternative address used for autodiscovery
    environment:
      - JELLYFIN_PublishedServerUrl=http://jellyfin.example.com

Примечания по файлу compose:

  • Параметр user: 1000:1000 задаёт UID:GID; при необходимости замените на свой.
  • ./media2 примонтирован в режиме только для чтения. Можно добавить любые каталоги с медиа.
  • Порт 8096 проброшен для внутреннего использования Nginx.

Создайте каталоги для конфигурации, кэша и медиабиблиотек и убедитесь в правильных правах доступа:

$ mkdir -p ~/jellyfin/config ~/jellyfin/cache ~/jellyfin/media ~/jellyfin/media2
$ chown -R $(id -u):$(id -g) ~/jellyfin

Шаг 4 — Запуск Jellyfin

Проверьте корректность docker-compose:

$ docker compose config

Пример валидного вывода (с путями):

name: jellyfin
services:
  jellyfin:
    container_name: jellyfin
    environment:
      JELLYFIN_PublishedServerUrl: http://jellyfin.nspeaks.xyz
    image: jellyfin/jellyfin
    network_mode: host
    restart: unless-stopped
    user: 1000:1000
    volumes:
    - type: bind
      source: /home/navjot/jellyfin/config
      target: /config
      bind:
        create_host_path: true
    - type: bind
      source: /home/navjot/jellyfin/cache
      target: /cache
      bind:
        create_host_path: true
    - type: bind
      source: /home/navjot/jellyfin/media
      target: /media
      bind:
        create_host_path: true
    - type: bind
      source: /home/navjot/jellyfin/media2
      target: /media2
      read_only: true
      bind:
        create_host_path: true

Запустите контейнер в фоне:

$ docker compose up -d

Проверьте логи, если нужно:

$ docker compose logs -f jellyfin

Шаг 5 — Установка Nginx

Добавьте официальный репозиторий Nginx (в CentOS-формате):

$ sudo nano /etc/yum.repos.d/nginx.repo

Вставьте:

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Установите Nginx:

$ sudo dnf install nginx

Проверьте версию:

$ nginx -v
nginx version: nginx/1.22.1

Включите и запустите Nginx:

$ sudo systemctl enable nginx --now

Проверьте статус:

$ sudo systemctl status nginx

Шаг 6 — Установка SSL с помощью Certbot

Certbot ставится через snapd. Сначала установите EPEL и snapd:

$ sudo dnf install epel-release
$ sudo dnf install snapd
$ sudo systemctl enable snapd --now

Установите и обновите core snap:

$ sudo snap install core
$ sudo snap refresh core

Создайте символьную ссылку, чтобы snap был доступен в PATH и установите certbot:

$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh
$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Запрос сертификата (замените email и домен на свои):

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d jellyfin.example.com

Сертификаты будут размещены в /etc/letsencrypt/live/jellyfin.example.com.

Сгенерируйте параметры Диффи‑Хеллмана для качества TLS:

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Проверьте процедуру автоматического обновления сертификатов в сухом режиме:

$ sudo certbot renew --dry-run

Если dry-run прошёл без ошибок — автоматическое продление будет происходить по расписанию.

Шаг 7 — Конфигурация Nginx для Jellyfin

Откройте основной конфиг:

$ sudo nano /etc/nginx/nginx.conf

Добавьте перед include /etc/nginx/conf.d/*.conf; строку:

server_names_hash_bucket_size  64;

Создайте файл конфигурации /etc/nginx/conf.d/jellyfin.conf и вставьте предоставленный в исходном руководстве большой блок конфигурации Nginx (включая кэширование, заголовки безопасности, SSL, proxy_pass для /socket, /web, и правила для /Videos и /Items). Этот блок полностью совместим с Docker-сборкой Jellyfin и использует пути к сертификатам Let’s Encrypt.

(Внимательно проверьте server_name, пути к cert и privkey, а также значение переменной set $jellyfin — при использовании DNS оставьте hostname, при прямом пробросе используйте IP и удалите resolver).

Проверьте синтаксис конфигурации:

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Разрешите SELinux подключаться к сети для httpd:

$ sudo setsebool -P httpd_can_network_connect 1

Перезапустите Nginx:

$ sudo systemctl restart nginx

Если при старте Nginx вы получили ошибку permissions (пример):

nginx: [emerg] open() "/var/run/nginx.pid" failed (13: Permission denied)

Это, скорее всего, связано с ограничениями SELinux. Можно сгенерировать модуль с audit2allow и установить его:

$ sudo ausearch -c 'nginx' --raw | audit2allow -M my-nginx
$ sudo semodule -X 300 -i my-nginx.pp
$ sudo systemctl start nginx

Шаг 8 — Доступ и первичная настройка Jellyfin

Откройте в браузере:

https://jellyfin.example.com

Мастер настройки Jellyfin

Выберите язык интерфейса и нажмите Next (Далее).

Настройка пользователя Jellyfin

Создайте учётную запись администратора и продолжите.

Конфигурация библиотек Jellyfin

Добавьте медиатеки, укажите папки и тип контента (фильмы, сериалы, музыка).

Страница настройки библиотек Jellyfin

Выберите язык и страну для метаданных.

Выбор языка метаданных

Разрешите удалённые подключения, если сервер должен быть доступен извне.

Настройки удалённого доступа

Завершите мастер установки.

Завершение настройки Jellyfin

Войдите в систему.

Страница входа Jellyfin

После входа вы попадёте на панель управления.

Панель Jellyfin

Шаг 9 — Обновление Jellyfin

Процесс обновления контейнера простой:

$ cd ~/jellyfin
$ docker compose down --remove-orphans
$ docker compose pull
$ docker compose up -d

Рекомендация: перед обновлением сделайте резервную копию каталога ./config и, при необходимости, ./cache (конфигурация важнее).

Тестирование и приёмка

Критерии приёмки:

  • Доступ по HTTPS: https://jellyfin.example.com открывает веб‑интерфейс.
  • Пользователь может войти и просмотреть библиотеку.
  • Проигрывание видео локально и по сети работает без критических ошибок.
  • Автоматическое продление Certbot успешно (dry-run без ошибок).

Безопасность и жёсткая настройка

Рекомендации по безопасности:

  • Ограничьте доступ к административному аккаунту сильным паролем и двухфакторной аутентификацией (если доступно).
  • Отключите ненужные плагины и проверьте права на папки с медиаконтентом.
  • Размещайте каталоги конфигурации и кэша на отдельном разделе с ограниченными правами.
  • Регулярно обновляйте систему, Docker и образы Jellyfin.
  • Создайте политики резервного копирования для ~/jellyfin/config и метаданных.
  • При необходимости используйте VPN для доступа к серверу из внешней сети.

SELinux:

  • Если SELinux включён, используйте setsebool httpd_can_network_connect=1 и при ошибках анализируйте логи audit.log и применяйте audit2allow.

Nginx:

  • Регулярно проверяйте заголовки безопасности и CSP; при проблемах с клиентскими приложениями (например webOS) адаптируйте политики.

Отказоустойчивость и резервирование

  • Для малых инсталляций достаточно snapshot/backup каталога config и списка библиотек.
  • Для продакшн‑решений используйте внешнее хранилище для медиа (NAS, NFS, SMB) и мониторинг состояния дисков.
  • План восстановления: остановить контейнер, восстановить каталог config из бэкапа, поднять контейнер.

Альтернативные подходы

  • Развертывание без Docker: установка пакета Jellyfin на систему напрямую (rpm/deb) — удобнее для интеграции с systemd, но сложнее в переносимости.
  • Использование Podman: если политика безопасности запрещает Docker, Podman + systemd unit может заменить Docker Compose.
  • Облачные контейнеры: запуск в облаке с управляемым балансировщиком и SSL — повышает доступность, но увеличивает стоимость.

Чек‑листы по ролям

Для администратора:

  • Удостовериться в наличии FQDN и корректных DNS-записей.
  • Настроить резервное копирование ~/jellyfin/config.
  • Включить автоматическое обновление сертификатов и проверить dry-run.

Для DevOps:

  • Интегрировать образ jellyfin/jellyfin в CI/CD (сканирование образов, тесты).
  • Настроить мониторинг контейнера и алерты по невозобновлению или падению сервиса.

Для конечного пользователя:

  • Создать учётную запись, добавить библиотеки и проверить метаданные.
  • Проверить воспроизведение на несколько устройств и режимы кодирования.

Методика тестирования после развёртывания

Минимальный набор тестов:

  • Проверить, что https://jellyfin.example.com доступен и валиден сертификат.
  • Войти под созданным пользователем.
  • Открыть коллекцию фильмов/сериалов, выбрать произвольный файл и начать воспроизведение на локальном устройстве.
  • Запустить параллельные стримы с разных устройств и проверить стабилность.
  • Проверить автообновление сертификата через sudo certbot renew –dry-run.

Траблшутинг — распространённые проблемы и решения

Проблема: Нельзя подключиться по HTTPS

  • Проверьте, что DNS указывает на ваш сервер.
  • Убедитесь, что порты 80 и 443 открыты (firewall-cmd –list-all).
  • Проверьте логи Nginx: /var/log/nginx/jellyfin.error.log.

Проблема: Видео не воспроизводится или прерывается

  • Проверьте нагрузку CPU и дисковую подсистему.
  • Отключите кэширование в Nginx, чтобы изолировать проблему (проксирование напрямую к контейнеру).

Проблема: SELinux блокирует Nginx

  • Используйте audit2allow для анализа и генерации политики (пример приведён выше).

Проблема: Ошибки при обновлении Docker с конфликтующими пакетами

  • Используйте –allowerasing при установке docker-ce, чтобы удалить конфликтующие пакеты.

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

Q: Можно ли использовать HTTP/3 и QUIC? A: Для HTTP/3 требуется поддержка Nginx Mainline или дополнительные модули; в большинстве конфигураций достаточно HTTP/2, но HTTP/3 возможен при обновлении Nginx и настройке TLS.

Q: Как обеспечить доступ к библиотеке в локальной сети без открытия в интернет? A: Отключите проброс портов в маршрутизаторе, не давайте FQDN публичному DNS и используйте VPN для удалённого доступа.

Короткое резюме

  • Jellyfin — бесплатный медиа‑сервер; Docker‑развёртывание даёт переносимость и простые обновления.
  • Nginx нужен как обратный прокси для SSL, кэширования и безопасности.
  • Сертификаты Let’s Encrypt автоматически продлеваются с помощью Certbot.

Иллюстрации и шаги интерфейса (скриншоты):

Конец инструкции. Удачного развёртывания!

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро