Настройка Plex, Samba, Transmission на Raspberry pi 4 с помощью Ansible

Предисловие

Не так давно я начал пользоваться Plex media server для просмотра видео на ТВ через Amazon fire stick. Plex server был настроен на десктопе, а файлы с видео были подключены через внешний USB диск и такая связка меня в принципе устраивала. Однако при выключенном ПК доступа к контенту нет и каждый раз включать ПК только для того, чтобы посмотреть фильм или послушать музыку уже стало напрягать. Поэтому решил настроить plex на raspberry и подключить к нему внешний USB с уже имеющимся контентом. А уже в процессе понял, что еще бы не плохо иметь доступ к файлам и качалку для торентов и заодно упростить процесс настройки с помощью автоматизации на Ansible. Playbook выложил на GitHub.

Что потребуется (железо / софт)

  • Window и Ubuntu Desktop. В принципе, можно только что-то одно, но мне привычнее какие-то вещи делать на Windows, а какие-то на Ubuntu. (Ubuntu установлена через VirtualBox на Windows). Все то же самое думаю удастся без проблем и на Mac.

  • Raspberry Pi Imager под Windows. Можно скачать с официального сайта.

  • Образ Raspberry Pi OS Lite. Тоже с официального сайта. Быстрее скачать через торрент, чем по прямой ссылке.

  • Raspberry pi 3/4. Изначально проводил опыты на третьей версии, но потом закупил четвертую.

  • SD-карта 8Gb или больше. (USB кардридер)

  • Ansible под Ubuntu описание и установка здесь.

  • USB диск. Желательно с USB 3.0, если собираете на pi 4.

  • Блок питания на 3A, чтобы хватало мощности для подключенного USB диска.

  • Playbook для Ansible с GitHub.

  • Git.

Подготовка raspberry pi

Для начала зальем скачанный образ с ОС на SD-карту с помощью Pi Imager. В пункте Choose image выбираем Use custom и выбираем тот образ, что скачали. Можно выбрать тот же образ в самой программе, но тогда он будет скачивать его из интернета, у меня процесс закачки занимал очень длительное время, поэтому снача попробовал скачать по прямой ссылке с сайта, но это тоже оказалось медленно и в итоге скачал через торрент. Указываем нашу SD-карту и жмем write.

Дальше отформатируем внешний USB накопитель в NTFS и присвоим ему понятный метку тома (например usb_750g), который будем использовать в дальнейшем для монтирования диска на raspberry. У меня внеший USB накопитель был уже с данными и отформатирован в NTFS, поэтому просто списал название метки тома. Можно также отформатировать в диск в exFAT, но в таком случае на raspberry придется ставить дополнительный пакет, поэтому в данной статье рассмотрю только случай с NTFS. Возможно, в дальнейшем добавлю и для других.

На данном этапе работа с Windows заканчивается и дальнейшие действия будут производиться на Ubuntu.

Подключаем нашу SD-карту к компьютеру с Ubuntu или переподключаем устройство на гостевую систему в VirtualBox. Должны появиться два подмонтированных диска boot и rootfs. В boot cd /media/ваш_пользователь/boot/. положим файл ssh-командой echo "" > /media/$LOGIN/boot/ssh (спасибо berez за подсказку), который при первом запуске даст понять raspberry, что нужно включить ssh-соединения.

Для подключения к raspberry я буду пользоваться ssh ключом, он также понадобится для плейбука на Ansible. Создадим его командой cd ~/.ssh && ssh-gen в папке для ключей (если ее нет, то создайте ее). Дайте понятное имя ключу например raspberry, на вопросе о секретной фразе жмем enter. На выходе получим два ключа: raspberry и raspberry.pub, приватный и публичный. С помощью приватного будем подключаться, а публичный скопируем на сам raspberry. На диске rootfs создадим директорию командой mkdir -p /media/$LOGIN/rootfs/home/pi/.ssh и и скопируем сам ключ командой cp ~/.ssh/raspberry.pub /media/$LOGIN/rootfs/home/pi/.ssh/authorized_keys.

Вставляем SD-карту в raspberry, подключем сетевой кабель, USB диск и питание. У меня в домашней сети IP адреса раздает роутер, если у вас такая же конфигурация, то в интерфейсе роутера можно посмотреть какой IP адрес выдан устройству и его MAC-адрес. А затем установть выдачу постоянного IP вашему raspberry по MAC-адресу. MAC-адрес можно посмотреть и на самом raspberry. Подключаем монитор с клавиатурой и запускаем команду cat /sys/class/net/eth0/address .

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

Если на Ubuntu еще не установлен Ansible, то сделать это можно по ссылке выше. Клонируем репозиторий git clone https://github.com/notfoundsam/raspberry-plex-ansible.git и заходим в папку с плейбуками cd raspberry-plex-ansible.

Для начала установим статический IP адрес нашего raspberry в файле hosts.ini , к которому будет обращаться Ansible для настройки. Можно указать и группу адресов, если необходимо настроить сразу несколько устройств.

В файле group_vars/all.yml , если вы не изменяли имя пользователя на raspberry, то ansible_user оставляем без изменений. Укажем путь к ssh ключу в переменной ansible_ssh_private_key_file. Если все делали по шагам как описано выше, то оставляем без изменений. Установим имя хоста в переменной host_name. В переменную usb_volume_label запишем имя метки тома подключенного USB диска. Монтирование диска будет производиться как раз по ней. Если предполагается использовать transmission для закачки торентов, то установите в переменные transmission_username, transmission_password, transmission_white_list свои значения. Для transmission_white_list обязательно оставьте адрес 127.0.0.1.

Установка Plex и монтирование диска. Запустите плейбук plex.yml командой ansible-playbook plex.yml который установит необходимые пакеты, сам Plex изменит имя хоста и сделает перезагрузку. После завершения работы скрипта запустите другой плейбук ansible-playbook usb-volume.yml , который подмонтирует наш USB диск и добавит автоматическое монтирование при старте. Зайдем на веб интерфейс плекса raspberry_ip:32400/web и пройдем шаги, которые plex предлагает. На некоторых шагах бывало, что plex выдавал ошибку что нет доступа, но после обновления страницы или повторного перехода на raspberry_ip:32400/web все корректно отображалось. Я думаю, это связано с тем, что при первом запуске plex сервер не успевает ответить клиенту из-за большой нагрузки. Дальше в интерфейсе plex уже можно выбрать наш USB диск.

Установка samba-сервера. Заливать файлы на raspberry удобнее по сети, поэтому добавил плейбук, который установит Samba сервер и расшарит USB диск в локальной сети. Для установки запускаем ansible-playbook samba.yml. Замечание, если ваш Windows хост принадлежит группе, отличной от workgroup, то поправьте на свою в файле /etc/samba/smb.conf на raspberry. Теперь можно зайти по IP и проверить доступ \\raspberry_ip в проводнике Windows.

Установка Transmission. Запустите плейбук, который установит transmission демон и утилиту для работы с iptables, добавит папку downloads на USB диск для загрузок и сделает ее папкой по умолчанию для загружаемых торентов. Папка для временных файлов та же самая, но transmission будет добавлять .part к еще незавершенным файлам. Также откроет порт 51413 для входящих подключений. Проверим доступ зайдя на raspberry_ip:9091/transmission, логин и пароль для входа те что прописаны в файле group_vars/all.yml. В настройках клиента на вкладке Network проверим, что порт 51413 открыт. Если написано closed, то нужно настроить перенаправление этого порта на вашем роутере.

Сравнение raspberry 3 с raspberry 4

Проводил проверку работы на raspberry pi 3B / 3B+/ 4B. У pi 3 сетевой интерфейс поддерживает только 100Mbs, поэтому скопировать туда 100-200GB данных займет много времени. С 3B+ ситуация уже получше, потому что установлен сетевой интерфейс на 1Gbs. Plex сервер достаточно хорошо себя показал на нем, особенно если видео файлы в формате H.264, но на некоторых avi файлах сжатых MPEG4(XVID) кодеком, процессор еле-еле тянул, открывал видео долго, и порой не успевал отдавать видео и картинка останавливалась. Впринципе такие файлы можно заранее оптимизировать в плексе под TV и тогда эта проблема уйдет, но потребуется больше места для перекодированных файлов.

После некоторого времени использования pi 3B+ все таки стал замечать, что обновление библиотеки с несколькими сотнями файлов занимает приличное время и редкие залипания плеера про воспроизведении видео. Например, ни как не может открыть фильм, решил заказать себе pi 4B. У pi 4B процессор уже помощнее и это решило проблему с MPEG4, уже можно было смотреть файлы без сильных задержек и при перемотке не ждать по 10-15 секунд. USB 3.0 добавил быстроты работы с диском при обновлении библиотеки.

После прочтения этой статьи решил приобрести себе Samsung Evo+ вместо SanDisk Ultra. И по ощущениям загрузка ОС стала быстрее.

Стоимость / Комплектущие

  • Raspberry pi 4B 4GB RAM ~ $62

  • SD-карта Samsung Evo+ ~ $8

  • Металлический корпус с пассивным охлаждением ~ $17 (магазин) либо в поисковике "Geekworm Raspberry Pi 4B (P173 Black) Passive Cooling Metal Case"

  • USB 3.0 жесткий диск 750GB (покупал 4 года назад) ~ $50

  • Питание Anker PowerPort 6 (покупал 3 года назад) ~ $30

Если какие то комплектующие уже есть в наличии, то и список можно сократить. В моем случае получилось $87.

Выводы

За небольшую сумму удалось собрать медиа-центр, который на данный момент удовлетворяет все мои потребности. При выходе из строя внешнего накопителя я согласен с полной или частичной потерей данных. Для снижения нагрузки на внешний диск медиа-сервера собрал еще один комплект USB диск + Samba + Transmission на raspberry pi 3B, но передача данных по сети со скоростью 100Mbs начинает напрягать, планирую перенести на pi 3B+. Благодаря созданному скрипту на Ansible процесс настройки стал занимать гораздо меньше времени.
Плейбуки написаны по отдельности, что бы можно было использовать в различных комбинациях, например только для настройки Samba с подключением внешнего диска, для организации простого сетевого хранилища.

Надеюсь что данный материал поможет быстрее справиться с аналогичной задачей. Если есть предложения по улучшению, критика или ошибки пишите в коментариях.

Дальнейшие планы

Объем данных постоянно растет, поэтому планирую докупить стойку с USB хабом и несколькими отсеками для HDD дисков. В планах приобрести что-то из этого: Yottamaster Hard Drive с 4 отсеками. Есть уже со встроенным RAID контроллером, но наверное возьму без него. Если потребуется RAID, то настрою его на raspberry и только для двух дисков остальные оставлю как single. А старый 750GB диск переключу на закачку торрентов.

Комментарии 12

    +1
    Объем данных постоянно растет, поэтому планирую докупить стойку с USB хабом

    не тратьте вы время на эти костыли из microSD, USB с raspberry, вложитесь сразу в нормальную железяку для этих задач.
      0
      Поддерживаю. Пусть это будет конечно не 12к, а немного дороже, но по крайней мере не будет проблем с производительностью того же трансмишена на высоких скоростях, когда проц будет просто захлёбываться
        0
        А можно примеры «нормальных железяк»?
        Я вот тоже подумывал сделать из малинки мини-NAS, в первую очередь из-за бесшумности. Останавливает отсутствие у нее SATA-интерфейсов. Но вот коробочка Yottamaster мне прям нравится.

        Что касается скоростей — ну, для просмотра фильмов USB 3.0 вполне достаточно, мне кажется. А высоких скоростей от трансмишена у меня лично, например, не бывает — от провайдера идет кабель 100 МБит.
          0
          если у вас зоопарк видеоформатов, то при транскодировании Plex будет молотить со 100% загрузкой всех ядер, даже если у вас 3+Ghz CPU и качество для кодирования ниже среднего. Это если FullHD источник, про 4К вообще отдельная тема. Поэтому если надо тихо и мощно, то что-то многоядерное с огромным радиатором и 12см кулерами лучший друг для Plex. Если транскодирование не нужно в принципе, то вероятно вам больше подходит не Plex, а samba share на диск, и плеер в ТВ.
            0
            Мне не нужен Plex. Телевизор переваривает большинство форматов, которые у меня есть, а если чего-то не понимает — я неспешно перекодирую в х264 каким-нибудь ffmpeg'ом.

            Вообще мой вопрос был больше про подсистему хранения.
            0
            Intel NUC :)
          0

          Есть старый телик, который умеет только http/mp4/h264/aac, никак не получается сделать под него профиль plex, пните в нужном направлении. Plex вроде бы транскодирование запускает, а телик пишет, что он этот файл не будет воспроизводить.

            0
            Через веб-интерфейс плекса, на видео файле можно выбрать опцию оптимизировать. Выдаст меню в котором можно выбрать «оптимизировать под ТВ». Он перекодирует в mpg4. Есть еще разные варианты. Вы как раз их пробовали?
              0

              Нет, я говорю про настройку транскодирования под конкретное устройство. "Оптимизировать" вручную несколько сотен файлов — не подходящий вариант.

                0
                Понятно. Можно еще массово все перекодировать. Но если нужно только выборочно, то не вариант.
                  0

                  Я решил это покупкой smart-приставки к TV. Plex стоит на Raspberry Pi 4, в настройках отключено транскодирование и файл отдатается как есть. Современым приставкам вполне хватает мощности адаптировать видео под требуемый формат, главное что бы роутер справлялся с потоком.

              0

              Обратите внимание на загрузку проца у pi3 при работе с ntfs и смените ntfs на ext4 и pi3 начнёт хватать. Да и в качестве плеера любая малина так себе. Купил PI4 и оставил на ней transmission + minidlna + шара, только NFS. Юзаю родной плеер телика и счастлив, 99% кодеков не доставляет проблем.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое