Я уже давно пользуюсь домашним облаком Seafile, которое развёрнуто дома на виртуальном сервере Ubuntu 18.
Seafile — это личное хранилище для хранения данных в стиле Dropbox. Seafile — замечательный инструмент для создания личного, семейного или корпоративного файлового хранилища. Не очень сложен в установке и настройке. Бесплатен.
Продолжаю тему развёртывания домашнего медиа сервера на базе Seafile. Цепочка Seafile → Fuse → DLNA позволила настроить медиа сервер с пакетом MiniDLNA.
DLNA (Digital Living Network Alliance) — набор стандартов, которые позволяют передавать и воспроизводить в реальном времени фото, видео и аудио файлы по домашней сети. Поддерживается проводная (Ethernet) и беспроводная (Wi-Fi) связь.
Это решение обладало рядом недостатков и достоинств, подробнее здесь:
Медиа сервер на базе Seafile + MiniDLNA
После этого я решил рассмотреть в качестве DLNA сервера бесплатный медиа сервер Emby. Этот вариант показался интересным, но тоже не без недостатков, читаем здесь:
Медиа сервер на базе Seafile + Emby
Переходим к следующему кандидату, это бесплатный медиа сервер Jellyfin.
Для настройки медиа сервера нужно решить две задачи:
- Получить доступ к данным Seafile как в обычной файловой системе.
- Поднять DLNA сервер.
По отдельности про решение этих двух задач можно почитать здесь:
В Seafile данные не хранятся в виде файлов а разбиты на блоки. Это позволяет эффективно использовать механизм дедупликации данных. Но для предоставления данных серверу DLNA эти блоки нужно превратить в обычные файлы. Для этого используется расширение seaf-fuse. Seaf-fuse является реализацией виртуальной файловой системы FUSE. Этот скрипт монтирует всё содержимое Seafile в папку (которая называется "mount point"), так что мы получаем доступ ко всем файлам Seafile так же, как к обычной папке на сервере.
https://manual.seafile.com/extension/fuse/
Доступ к зашифрованным папкам с помощью seaf-fuse не предоставляется, поэтому библиотеку с фильмами не шифруем. Данные доступны только для чтения, это нам подходит. В debian/centos для монтирования папки FUSE пользователь должен быть в группе "fuse".
Как использовать seaf-fuse
Создаём точку монтирования, назначаем владельцем пользователя, от имени которого работает seafile:
mkdir /opt/seafile-fuse
chown sf\: /opt/seafile-fuse
У меня Ubuntu, поэтому для монтирования директории пользователь должен быть участником группы fuse. Создадим группу и добавим в неё пользователя:
groupadd fuse
usermod -aG fuse sf
Для проверки можно запустить скрипт seaf-fuse от имени пользователя, под которым работает seafile:
/opt/seafile-server-latest/seaf-fuse.sh start /opt/seafile-fuse
В папке /opt/seafile-fuse появится содержимое Seafile. Теперь мы можем получить путь к папке с фильмами, например:
/opt/seafile-fuse/user@example.com/5403ac56-5552-4e31-a4f1-1de4eb889a5f_Video
Для остановки монтирования:
/opt/seafile-server-latest/seaf-fuse.sh stop
По умолчанию доступ к содержимому имеет пользователь root, дадим доступ всем пользователям сервера. Редактируем файл /etc/fuse.conf. Раскомментируем опцию:
user_allow_other
Для проверки можно запустить скрипт seaf-fuse от имени пользователя, под которым работает seafile, с параметрами:
/opt/seafile-server-latest/seaf-fuse.sh start -o allow_other /opt/seafile-fuse
В папке /opt/seafile-fuse появится содержимое Seafile. Доступ к содержимому имеют все пользователи.
Автоматизируем запуск seaf-fuse
Запуск служб Seafile у меня уже автоматизирован:
Добавим автозапуск seaf-fuse в systemd.
${seafile_dir} — измените переменную на путь к вашей директории Seafile. У меня /opt.
User и Group — измените на своего пользователя и группу.
Работаем под рутом. Создаём сервис seafile-fuse:
sudo vim /etc/systemd/system/seafile-fuse.service
Сервис будет запускаться после seafile и seahub. Содержимое:
[Unit]
Description=Seafile fuse
After=network.target seafile.service seahub.service
[Service]
Type=forking
ExecStart=${seafile_dir}/seafile-server-latest/seaf-fuse.sh start -o allow_other /opt/seafile-fuse
ExecStop=${seafile_dir}/seafile-server-latest/seaf-fuse.sh stop
LimitNOFILE=infinity
User=sf
Group=sf
[Install]
WantedBy=multi-user.target
Настраиваем автозагрузку:
systemctl daemon-reload
systemctl enable seafile-fuse
Проверяем:
systemctl start seafile-fuse
systemctl status seafile-fuse
Теперь после загрузки сервера папка с содержимым Seafile будет монтироваться автоматически.
Jellyfin
На базе Emby существует форк под названием Jellyfin. Этот медиа сервер должен быть чуточку свободнее и без назойливой рекламы. Проект развивается сообществом и полностью зависит от вклада добровольцев в его совершенствование.
Ссылки
Установка Jellyfin на Ubuntu 18
Заходим на официальный сайт.
Переходим в раздел Download now и находим инструкцию для установки медиа сервера на Ubuntu.
Работаем под sudo. Устанавливаем вспомогательный пакет apt-transport-https:
apt install apt-transport-https
Устанавливаем репозиторий jellyfin:
cd /tmp
wget -O - https://repo.jellyfin.org/jellyfin_team.gpg.key | sudo apt-key add -
echo "deb [arch=$( dpkg --print-architecture )] https://repo.jellyfin.org/$( awk -F'=' '/^ID=/{ print $NF }' /etc/os-release ) $( awk -F'=' '/^VERSION_CODENAME=/{ print $NF }' /etc/os-release ) main" | sudo tee /etc/apt/sources.list.d/jellyfin.list
Обновляем репозитории:
apt update
Устанавливаем пакет jellyfin:
apt install jellyfin
Медиа сервер jellyfin установлен. Проверим состояние службы:
service jellyfin status
После установки веб-интерфейс для настройки доступен по адресу http://localhost:8096. Служба HTTPS по умолчанию выключена, если включить, то она работает на порту 8920 — или https://localhost:8920. Аналогично серверу Emby.
Проверяю работающий порт 8096:
netstat -tanu | grep 8096
Порт работает, дальнейшую настройку можно производить в браузере:
http://localhost:8096
Начальная настройка Jellyfin
Проходим квест по первоначальной настройке сервера.
При создании библиотеки указываем путь к видео, который мы создали с помощью seaf-fuse, например:
/opt/seafile-fuse/user@example.com/5403ac56-5552-4e31-a4f1-1de4eb889a5f_Video
В итоге получаем работающий медиа сервер, который распознаёт фильмы.
Jellyfin по DLNA
Меня больше всего интересует вопрос работы Jellyfin по DLNA. Прошлый опыт с Emby был не очень удачен, на старом телевизоре Philips ничего не заработало. Поскольку Jellyfin, похоже, использует тот же самый плагин, то результат может быть таким же.
Здесь нужно выбрать пользователя по умолчанию, чьи библиотеки будут транслироваться по DLNA. Настройки DLNA такие же как у Emby.
Стоит обратить внимание на вкладку "Profiles".
Здесь можно выбрать профиль по умолчанию для DLNA сервера. Я выбрал LG Smart TV. Выбираем системный профиль, нажимаем OK. Далее настройки профиля можно переопределить.
Проверяю работу Emby DLNA на телевизоре LG
Сначала я расстроился из-за того, что превьюшки не показываются.
Однако, покопавшись в настройках Jellyfin, я понял, что проблема легко устраняется установкой плагина Fanart. Этот плагин добавляет дополнительные типы изображений, которые настраиваются в медиатеке.
Теперь превьюшки отображаются.
И фильм проигрывается.
Проверяю работу Emby DLNA на старом телевизоре Philips
О чудо! При первой загрузке телевизор не завис, как в Emby.
Внутри, однако, всё ещё наблюдается вывод папок в бесконечном цикле.
Если клювом не щёлкать и оперативно управлять пультом, то можно вывести список фильмов.
И даже посмотреть.
Результаты
На базе домашнего облака Seafile + Jellyfin получилось сделать домашний медиа сервер. Работу музыки я не тестировал. Протестировал медиатеку с фотографиями, всё работает. Только на превьюшках папок фотографии автоматически не поворачиваются вертикально.
Минусы
- DLNA на Philips заработало, но не без ошибок. Внутри всё ещё наблюдается вывод папок в бесконечном цикле, но фильм можно запустить.
- По умолчанию содержимое медиа библиотеки обновляется раз в 12 часов. Однако, содержимое папки можно обновить вручную через web GUI.
- Нет встроенной возможности запустить Jellyfin под нужным пользователем, так что seaf-fuse монтируем только с доступом на чтение всем пользователям.
- Нет пользователя для автоматического входа в локальной сети, однако, это обходится созданием пользователя без пароля.
- Телегид сожрал 100 ГБ кэша, пришлось от него отказаться из-за нехватки места.
- Обнаружил косяк в вёрстке при работе сайта на небольших разрешениях, когда сцены не отображались.
Плюсы
- Фильмы по DLNA заработали на телевизоре LG. Есть превьюшки.
- Фильмы по DLNA заработали на телевизоре Philips. Превьюшек для видео нет, только для фото. Работает с ошибками.
- Эфирное телевидение работает без премиального доступа, в отличие от Emby.
- Протестировал медиатеку с фотографиями, всё работает.
- Есть возможность трансляции фильма из браузера на телевизор. На LG работает, на Philips работает не со всеми форматами видео. Возможно, требуется настроить профиль для Philips.
- Jellyfin и Seafile не требовательны к ресурсам, процессор и память сильно не жрут.
- Есть кодирование на лету. Вот тогда могут использоваться ресурсы.
- Есть красивый web интерфейс с возможностью просмотра фильмов.
- Содержимое папки можно обновить вручную через web GUI.
- А ведь можно запустить несколько разных серверов DLNA, у меня вместе работает Jellyfinи MiniDLNA.
- Нет рекламы.
Заметки
- Фильмы высокого качества по Wi-Fi тормозят, нужно подключать телевизор к проводной сети Ethernet.
- Часто фильмы не распознаются или распознаются неправильно, пришлось научиться распознавать фильмы.
- Попробовал смеха ради воткнуть ссылку на домашний медиа сервер в приложение Yandex на Smart TV, всё равно яндекс отказался от него. Жалко, Jellyfin не заработал, возможно, с cookies плохо работает или ещё что-то, не стал разбираться.
- Отображение фонов (задников) постоянно отключается. Баг? Или эта штука через куки работает и нужно включать в каждом браузере?
В целом впечатление от Jellyfin хорошее, мне этот медиа сервер понравится больше, чем Emby. Связка Seafile + Jellyfin + MiniDLNA решила все поставленные задачи. Если бы без DLNA работало без ошибок, то MiniDLNA можно было бы и не ставить, но второй DLNA сервер каши не просит, пусть остаётся.
Я буду пробовать и другие медиа серверы с поддержкой DLNA, ждите новый статей.