Медиа сервер на базе Seafile + MiniDLNA

Thank you for reading this post, don't forget to subscribe!

В 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. Содер­жи­мое:

Настра­и­ва­ем автозагрузку:

systemctl daemon-reload
systemctl enable seafile-fuse

Про­ве­ря­ем:

systemctl start seafile-fuse
systemctl status seafile-fuse

Теперь после загруз­ки сер­ве­ра пап­ка с содер­жи­мым Seafile будет мон­ти­ро­вать­ся автоматически.

MiniDLNA

Мож­но уста­но­вить любой DLNA сер­вер, пер­вый кан­ди­дат на уста­нов­ку — minidlna. Сей­час про­ект носит назва­ние ReadyMedia, но паке­ты в Ubuntu носят преж­нее назва­ние. Это лег­ко­вес­ный DLNA/UPnP медиа сер­вер. По сути осу­ществ­ля­ет един­ствен­ную функ­цию: предо­став­ля­ют сете­вой доступ к меди­фай­лам по про­то­ко­лу DLNA/UPnP. Обла­да­ет рядом досто­инств и недо­стат­ков, выяв­лен­ных в про­цес­се эксплуатации.

Досто­ин­ства minidlna:

  • Потреб­ля­ет мало ресур­сов. При фор­ми­ро­ва­нии базы гру­зит про­цес­сор, после рабо­та­ет почти незаметно.
  • Про­сто­та настрой­ки. Есть паке­ты под раз­ные ОС, NAS, DD-WRT/OpenWRT.
  • Воз­мож­ность рабо­ты под любым ука­зан­ным поль­зо­ва­те­лем в каче­стве демона.
  • Ниче­го лишнего.

Недо­стат­ки minidlna:

  • DLNA под­дер­жи­ва­ет­ся не в пол­ной мере. Может не обна­ру­жи­вать­ся неко­то­ры­ми устройствами.
  • Не про­из­во­дит пере­ко­ди­ро­ва­ние на лету. Если теле­ви­зор не может рас­по­знать файл, то про­иг­рать не сможет.
  • Про­бле­мы с авто­ма­ти­че­ским обнов­ле­ни­ем базы. Подроб­но­сти в статье.

Осо­бен­но­сти minidlna:

  • Нет GUI и web. Это для кого-то недо­ста­ток, а для кого-то достоинство.

Ссылки

https://sourceforge.net/projects/minidlna/

Установка MiniDLNA в Ubuntu 18

Уста­нав­ли­ва­ем пакет из репозитория:

apt-get install -y minidlna

Кон­фи­гу­ра­ци­он­ный файл нахо­дит­ся по адре­су: /etc/minidlna.conf.

Сер­вис у меня будет рабо­тать от поль­зо­ва­те­ля sf. Созда­дим рабо­чую пап­ку для базы и логов:

mkdir /opt/minidlna
chown sf\: /opt/minidlna

Настро­им /etc/minidlna.conf:

media_dir — дирек­то­рия, к кото­рой будем предо­став­лять доступ.

merge_media_dirs — объ­еди­нять медиа директории.

db_dir — дирек­то­рия, в кото­рой фор­ми­ру­ет­ся база дан­ных DLNA.

log_dir — дирек­то­рия, в кото­рой нахо­дит­ся log файл. Мне кажет­ся, пере­опре­де­ля­ет­ся в /etc/defaults/minidlna.

root_container — кон­тей­нер для кор­не­вой директории.

port — порт, по умол­ча­нию 8200.

friendly_name — назва­ние сер­ве­ра, кото­рое будет отоб­ра­жать­ся на теле­ви­зо­ре, кли­ен­те DLNA.

model_name — модель, тоже для DLNA клиента.

inotify=yes — важ­ный пара­метр, кото­рый вклю­ча­ет воз­мож­ность авто­ма­ти­че­ско­го отсле­жи­ва­ния добав­ле­ние и уда­ле­ния кон­тен­та в дирек­то­рии. Вот толь­ко дан­ный функ­ци­о­нал не рабо­та­ет в при­мон­ти­ро­ван­ных дирек­то­ри­ях типа cifs или вир­ту­аль­ных папок fuse, они про­сто не фор­ми­ру­ют уве­дом­ле­ния для опе­ра­ци­он­ной системы.

notify_interval — интер­вал в секун­дах, через кото­рый minidlna бро­ад­ка­стом уве­дом­ля­ет по сети о сво­ём суще­ство­ва­нии всем устрой­ствам. По умол­ча­нию при­мер­но 15 минут (895 секунд).

user — здесь мож­но ука­зать поль­зо­ва­те­ля, под кото­рым будет рабо­тать minidlna, одна­ко, в Ubuntu дан­ный пара­метр (вме­сте с груп­пой) пере­опре­де­ля­ет­ся в фай­ле /etc/defaults/minidlna, поэто­му его нуж­но ука­зать там в пара­мет­рах USER и GROUP:

Здесь же ука­зы­ва­ет­ся запуск в режи­ме демона:

START_DAEMON="yes"

Обра­ща­ем вни­ма­ние на опцию:

DAEMON_OPTS="-r"

Опция при­ме­ня­ет пара­метр при запус­ке службы:

  • -r — добав­ля­ет новые объ­ек­ты в базу, уда­ля­ет несу­ще­ству­ю­щие. На вир­ту­аль­ной пап­ке fuse рабо­та­ло толь­ко удаление.
  • -R — уда­ля­ет базу и фор­ми­ру­ет зано­во. Рабо­та­ет без нареканий.

Пере­за­пус­ка­ем службу:

systemctl restart minidlna

Или:

service minidlna restart

Про­ве­ря­ем, рабо­та­ет ли служ­ба, так­же смот­рим пара­мет­ры запуска:

service minidlna status

Настрой­ка MiniDLNA медиа сер­ве­ра завершена.

Исправление ошибок

В логах ошибка:

[2021/10/25 12:53:17] monitor.c:218: warn: WARNING: Inotify max_user_watches [8192] is low or close to t he number of used watches [92] and I do not have permission to increase this limit. Please do so manual ly by writing a higher value into /proc/sys/fs/inotify/max_user_watches

Пра­вим /etc/sysctl.conf, дописываем:

#MiniDLNA warning fix

fs.inotify.max_user_watches = 100000

Глав­ное, что­бы зна­че­ние было не мень­ше 65536.

Изме­не­ние при­ме­нит­ся после пере­за­груз­ки системы.

В бра­у­зе­ре http://адрес_сервера:8200, видим коли­че­ство фай­лов в биб­лио­те­ке и спи­сок под­клю­чен­ных клиентов.

Сканирование библиотеки

При запус­ке демо­на minidlna ска­ни­ру­ет под­клю­чён­ные медиа дирек­то­рии. Ска­ни­ро­ва­ние зада­но пара­мет­ром "-r" в фай­ле /etc/defaults/minidlna опцией:

DAEMON_OPTS="-r"

Опция добав­ля­ет новые объ­ек­ты в базу, уда­ля­ет несу­ще­ству­ю­щие. Если ука­зать опцию "-R", то при запус­ке демо­на база уда­лит­ся и сфор­ми­ру­ет­ся зано­во. Ска­ни­ро­ва­ние боль­ших биб­лио­тек может длить­ся несколь­ко минут.

Пере­за­пу­стить ска­ни­ро­ва­ние биб­лио­те­ки мож­но вручную:

rm /opt/minidlna/cache/minidlna/files.db
systemctl restart minidlna

Или:

minidlnad -R && systemctl restart minidlna

Авто­ма­ти­че­ское обнов­ле­ние дан­ных с помо­щью inotify на вир­ту­аль­ных пап­ках не рабо­та­ет. Един­ствен­ный вари­ант пол­но­го обнов­ле­ния биб­лио­те­ки — запуск коман­ды вруч­ную или с помо­щью crontab по ночам.

Результат работы на стареньком телевизоре Philips

Вхо­дим в сеть.

Обна­ру­жен наш сервер.

Пап­ки читаются.

Результаты

На базе домаш­не­го обла­ка Seafile + MiniDLNA полу­чи­лось сде­лать домаш­ний медиа сер­вер. С филь­ма­ми, фото­гра­фи­я­ми и музыкой.

Мину­сы

  • После загруз­ки филь­ма при­хо­дит­ся ждать, когда ночью (или в дру­гое настро­ен­ное вами в crontab вре­мя) сра­бо­та­ет скрипт обнов­ле­ния базы DLNA. Или запус­кать скрипт вручную.
  • База обнов­ля­ет­ся дол­го, если в Seafile боль­шой аль­бом фото­гра­фий и филь­мов, то обнов­ле­ние может длить­ся несколь­ко минут.
  • При запус­ке скрип­та обнов­ле­ния базы сер­вис DLNA пере­за­пус­ка­ет­ся. Если в этот момент про­иг­ры­ва­ет­ся фильм, то вос­про­из­ве­де­ние останавливается.
  • Нет встро­ен­но­го меха­низ­ма пре­вью­шек для фильмов.
  • Нет коди­ро­ва­ния видео на лету. Нуж­но под­би­рать фор­мат филь­ма, кото­рый пони­ма­ет телевизор.
  • Нет GUI веб интер­фей­са для про­смот­ра филь­мов в браузере.

Плю­сы

  • Филь­мы по DLNA зара­бо­та­ли и на ста­ром теле­ви­зо­ре Philips и на более новом LG.
  • MiniDLNA и Seafile не тре­бо­ва­тель­ны к ресур­сам, про­цес­сор и память не жрут.
  • Оно-таки рабо­та­ет.
  • А ведь мож­но запу­стить несколь­ко раз­ных сер­ве­ров DLNA, парал­лель­но с MiniDLNA