Установка 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
Откройте в браузере:

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

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

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

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

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

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

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

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

Шаг 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.
Иллюстрации и шаги интерфейса (скриншоты):
Конец инструкции. Удачного развёртывания!
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента