Импортозамещаю Netflix себе в дом

В связи с уникальной сложившейся политической ситуацией в Российской Федерации, меня отключили от моей честно оплаченной подписки на сервис Netflix. Также, с уходом больших кинокомпаний с российского рынка, не остается большой надежды на трансляцию свежего кино и сериалов в отечественных онлайн кинотеатрах. Поэтому я принял волевое решение создать домашний сервер для видеохостинга, а также скачивания и раздачи торрентов на одноплатном компьютере Raspberry Pi, который был куплен по наитию и, как и у тысяч программистов-энтузиастов по всему миру, лежал без дела который год.

Hidden text

В целом, эта статья подойдет для любого компьютера c Unix-подобной системой. Можно взять старый ненужный ПК, поставить на него какой-нибудь дистрибутив, даже роутер с OpenWRT сгодится для медиа сервера. 

Мои требования к серверу

  • Возможность просмотра контента на всех умных устройствах в домашней сети

  • Круглосуточная работа, без необходимости нажимать на кнопки вкл. и выкл.

  • Использование свободного ПО (free software, по заветам Ричарда Столлмана)

  • Терабайтовое хранилище для «пула» раздачи

  • Lightweight операционная система

  • Удобный однокликовый headless доступ 

  • Просмотр контента сразу после начала загрузки, не дожидаясь завершения (по-сути стриминг) 

Первый и последний пункт в полной мере реализовать не удалось, опишу подробнее в конце, в любом случае, сервером я остался доволен и хочу поделиться инструкцией по установке и настройке. Для выполнения первого пункта у нас есть следующие варианты: некий веб-сервис, который будет открываться через веб-браузер устройства, проприетарное решение с каким-нибудь приложением на конечных устройствах и DLNA сервер. Проприетарное ПО выбирать не хочется, по понятным причинам, веб-сервис по типу какого-нибудь NAS (напр. OpenMedia Vault) слишком многофункциональный и «тяжелый» для наших целей, оперативка не резиновая. DLNA сервер — наш выбор.

Небольшая справка. 

DLNA (англ. Digital Living Network Alliance) — набор стандартов, позволяющих совместимым устройствам передавать и принимать по домашней сети различный медиаконтент (изображения, музыку, видео), а также отображать его в режиме реального времени.

Был создан в 2003, в 2017 союз распался. Работает по протоколу UPnP.

Несмотря на то, что поддержка технологии остановлена, она по инерции остается во многих новых девайсах. Samsung Smart TV имеет приложение AllShare, многие умные ТВ от Xiaomi, LG, Sony поддерживают DLNA, PlayStation 3 и 4 (но не 5) поддерживают DLNA. Собственно, мой ТВ не умный, я ориентировался на PS4, плеер которой имеет много недостатков, но об этом позже. Для ПК, планшета и телефона я использовал VLC плеер (правильно настроенный сервер появляется на вкладке Local Network — Universal Plug«n"Play)

Железо:

Создадим образ ОС для raspberry pi с помощью официального приложения Raspberry Pi Imager. Выберем Raspberry Pi Os Lite 64-bit, так как наша модель поддерживает 64 битную версию, а Lite, потому что мы будем пользоваться ей в режиме «headless» через СLI. 

Выберем запоминающее устройство, и для упрощения пользования выберем некоторые настройки по умолчанию:

Обязательно включаем SSH. Для удобного подключения рекомендую создать SSH-key

ssh-keygen -t rsa -b 4096 -C " key for raspberry pi" -f ~/.ssh/rpi_key
  • -t указываем тип ключа rsa

  • -b длинна

  • -C комментарий, чтобы не забыть для чего он

  • -f путь

Придумываем пароль для приватного ключа и жмем enter.

Теперь у нас в папке ~/.ssh есть 2 ключа:  «rpi_key» и «rpi_key.pub»

Для macOS

Чтобы терминал не спрашивал пароль каждый раз, когда мы логинимся с помощью ключа, можно добавить его в keychain. Для этого прописываем в файле ~/.ssh/config следующие параметры:

Host *

  AddKeysToAgent yes

  UseKeychain yes

  IdentityFile ~/.ssh/rpi_key

Если вы используете ключи только для подключения к raspberry pi такие параметры файла config вам подойдут, однако при использовании многих ключей, рекомендую изучить как работает файл ~/.ssh/config.

Выполняем cat ~/.ssh/rpi_key.pub и копируем полученное в настройки нашего образа. 

af5daf3d1e4a80f4693d78494cf453f9.png

Здесь же пишем username и password (это будет наш пароль для команды sudo), SSID и пароль от вайфая (для нашего проекта рекомендую пользоваться ethernet). Жмем write, по завершению вставляем карточку в Raspberry PI.

Cоздадим sh скрипт для быстрого подключения к pi 

touch ~/Desktop/remote_pi.command
chmod 755 ~/Desktop/remote_pi.command
vim ~/Desktop/remote_pi.command

Добавьте следующие 2 строки в файл:

#!/bin/sh

ssh username@192.168.x.x 

(username, который мы написали ранее и IP адрес вашего устройства, рекомендую присвоить ему постоянный IP адрес в настройках роутера)

: w и перезагрузите компьютер, чтобы выйти из vim«а.

Теперь, одним кликом по ярлыку remote_pi.command на рабочем столе мы подключаемся к нашему будущему серверу.

На всякий случай, чтобы мой будущий сервер не подключался к сети wi-fi, а выбирал только проводную сеть, я использовал утилиту rfkill для блокировки wi-fi даже при перезагрузке.

sudo apt update
sudo apt full-upgrade
sudo apt install rfkill
sudo rfkill block wifi

и bluetooth за ненадобностью

sudo rfkill block bluetooth

разблокируются они простой командой

sudo rfkill unblock wifi
sudo rfkill unblock bluetooth

Наверное, это делать необязательно. Однако, rfkill физически отключает ненужные нам интерфейсы, таким образом, на них не тратится энергия и меньше точек входа для хакеров. Изначально, мне не удавалось раскрутить мой жесткий диск, питая его лишь USB портом, однако, используя хороший блок питания и опробовав 4 micro-usb провода мне удалось запитать свой жесткий диск. В интернете пишут, что диск к raspberry pi 3B+ можно подключить только с питаемым хабом, на деле мне удалось это сделать лишь от порта. Ваш жесткий диск может не запитаться. 

Форматируем диск и настраиваем auto-mounting

Вставив USB диск в Raspberry PI выполняем следующую команду, чтобы узнать его название и путь:

sudo fdisk -l

Здесь у меня подключена SanDisk флешка на 32GB , которую я буду использовать для примера в этой статье и уже настроенный и рабочий 1TB диск.Здесь у меня подключена SanDisk флешка на 32GB, которую я буду использовать для примера в этой статье и уже настроенный и рабочий 1TB диск.

Запускаем команду fdisk с путём нашего диска, полученным предыдущей командой.

sudo fdisk /dev/sdb

удаляем все существующие partitions на диске командой 'd' (у меня их было 2):

281f444775c9455c5f7e56f6f631e566.png

Создаем новую partition командой 'n'. Оставляем все настройки по умолчанию — жмем enter:

7048efd759d0f1c62e1582f8a34a1098.png

Сохраняем изменения командой 'w'

Проверяем и запоминаем название нашего свежесозданного раздела 

sudo fdisk -l

c339bc0ad10af6fde5490db57640d6bd.png

Теперь отсоединим и отформатируем раздел 

sudo umount /dev/sdb1
sudo mkfs.ext4 /dev/sdb1

Далее, создадим папку, где будет жить диск

sudo mkdir /media/usb
sudo mount /dev/sdb1 /media/usb

Автоматизируем mount нашего диска при перезагрузке системы. Для этого находим UUID раздела командой 

sudo blkid

72f5d6b336fd440ed0711fead7063cc4.png

И добавляем следующую строчку в файл /etc/fstab. Обратите внимание, что PARTUUID вам требуется указать свой, который вы получили предыдущей командой.

sudo nano /etc/fstab

PARTUUID=7c40767d-edc7-40d3-b79b-ddfa94c00aa1   /media/usb      ext4    auto,nofail,user,rw     0       3

Установка и настройка miniDLNA

sudo apt-get install minidlna
sudo nano /etc/minidlna.conf

Важные настройки в config’е. Остальное можете оставить под комментариями.

Путь к медиафайлам. Мы создадим эти папки нижеПуть к медиафайлам. Мы создадим эти папки нижеНомер порта и дружелюбное имя, которое будет отображаться на устройствахНомер порта и дружелюбное имя, которое будет отображаться на устройствах

Создадим необходимые папки и определим их к юзеру tv (по умолчанию имя pi, но при создании образа я установил себе такой username)

sudo mkdir /media/usb/torrent-inprogress
sudo mkdir /media/usb/movies
sudo chown -R tv:tv /media/usb

Установка и настройка Transmission

sudo apt install transmission-daemon
sudo systemctl stop transmission-daemon

Мы его остановили, потому что после установки он запускается по умолчанию, а нам нужно пошаманить с настройками. Для начала смотрим settings.json

sudo nano /etc/transmission-daemon/settings.json

Важные параметры здесь:

"download-dir": "/media/usb/movies",
"incomplete-dir": "/media/usb/torrent-inprogress",
"rpc-password": "YOURPASSWORD",
"rpc-username": "tv",
"umask": 2,

incomplete и download dir, путь к папкам, куда файлы сначала загружаются, а готовые перемещаются

Username и password, соответственно, данные для входа в веб-интерфейс.

umask — маска прав, применяемая к загруженным файлам, обязательно оставьте 2, иначе miniDLNA не получит к загруженным файлам доступ.

sudo nano /etc/init.d/transmission-daemon

Здесь меняем только USER= на имя нашего пользователя

d7188389e4fc8ec66c65b30f01450f85.png

sudo nano /etc/systemd/system/multi-user.target.wants/transmission-daemon.service

Аналогично меняем user=

d2b38ac37ae0f6a08ef076b0c1d35034.png

Так как мы поменяли пользователей daemon’а, необходимо повозиться с правами и путями файлов. (А меняли мы пользователя, для того, чтобы не было проблем с папкой, которую между собой делят Transmission и miniDLNA.)

НЕ ЗАБУДЬТЕ везде где у меня стоит «tv» поменять на своё имя пользователя.

sudo chown -R tv:tv /etc/transmission-daemon
sudo mkdir /home/tv/.config/transmission-daemon/
sudo ln -s /etc/transmission-daemon/settings.json /home/tv/.config/transmission-daemon/
sudo chown -R tv:tv /home/tv/.config/transmission-daemon/

Теперь перезагружаем все сервисы и PI заодно

sudo service minidlna start
sudo service minidlna force-reload
sudo systemctl daemon-reload
sudo systemctl start transmission-daemon
sudo reboot

Если мы сделали всё правильно, то после перезагрузки должен быть доступен web-интерфейс Transmission по адресу http://192.168.31.112:9091 (мой ip адрес Raspberry PI, ваш может отличаться)

Интерфейс Transmission будет знаком всем, кто пользовался Torrent-клиентом. Слева сверху добавляем торренты по ссылке или загружая файл, можно ставить галочки на нужные и ненужные файлы, ограничивать скорость и проч. После загрузки файла из папки /media/usb/torrent-inprogress, он должен переместиться в папку /media/usb/movies, откуда miniDLNA сервер, в свою очередь, транслирует их на все приемники в домашней сети. Если по какой-то причине minidlna пустой, попробуйте перезагрузить базу данных командой «sudo service minidlna force-reload». Мне приходилось это делать только в начале использования, потом сервер 'разгоняется' и работает как по маслу.

Впечатления

Я доволен своим небольшим сервером, VLC идеально прожевывает все файлы, со сменой субтитров и языка, а пропускной способности хватает для просмотра 4k HDR фильмов. К сожалению, плеер PS4 не так хорош, читает не все файлы и тормозит. Просмотр файлов во время загрузки мне не удалось настроить. Судя по всему, протоколы DLNA не поддерживают воспроизведение неполного видео-файла. Однако, используя проводной интернет мои любимые шоу загружаются за 15–20 минут — как раз время, чтобы приготовить ужин. Если у вас есть ненужный компьютер и лишний вечер, рекомендую попробовать настроить подобный сервер. Качество видео и скорость радует больше чем «бесплатно и без регистрации» сайты, да и приятно иметь полный контроль над системой.

Источники

Understanding SSH Keys

Setup Personal MediaServer Using RaspberryPi and MiniDLNA

How to Disable your Raspberry Pi«s Wi-Fi

Format a Linux Disk as Ext4 from the Command Line

How to Setup Transmission on the Raspberry Pi

© Habrahabr.ru