Не так давно я начал пользоваться 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. Для начала зальем скачанный образ с ОС на 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 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 диск переключу на закачку торрентов.