Raspberry Pi. Настройка Raspberry 4.

Начальная установка

Для начала скачиваем образ операционной системы Raspbian (версию Lite если не нужен десктоп) по ссылке https://www.raspberrypi.org/downloads/raspbian/ и распаковываем образ из zip архива.

Качаем и устанавливаем программу для записи образа на SD карту Win32DiskImager (в дальнейшем ее же можно использовать для бакапа этой SD карты в файл образа).

Записываем скачанный образ этой программой на SD карту, вставляем ее в слот и загружаемся.

После загрузки жмем Enter и вводим логин pi и пароль raspberry.

Для первоначальной настройки можно использовать консольную программу настройки:

sudo raspi-config

Через нее можно сразу сменить дефолтный пароль, расширить раздел на весь объем флешки, выставить локаль на ru (после выбора локали будет еще запрос на каком языке выводить сообщения — лучше там выбрать англ. язык, на русском выглядит всё как-то не очень привычно и неудобно), настроить таймзону, включить SSH, если будет используется только через консоль без графической оболочки, то для GPU можно выбрать минимальный размер выделяемой памяти (16Мб).

Ставим сразу для удобства Midnight Commander:

sudo apt-get install mc

Настройка IP адреса

Если IP выдается через DCHP, то можно посмотреть какой был выдан адрес через команду

$ ifconfig eth0

Можно настроить руками статический IP.

Редактируем файл /etc/dhcpcd.conf

sudo nano /etc/dhcpcd.conf

ищем кусок

# Example static IP configuration:
#interface eth0
#static ip_address=192.168.0.10/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
#static routers=192.168.0.1
#static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1

раскомментируем его и ставим свои ip:

interface eth0
static ip_address=192.168.1.10/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1 8.8.8.8

Добавить своего пользователя вместо дефолтного pi

Чтобы усложнить жизнь хакерам лучше вообще грохнуть дефолтного пользователя и завести своего с админскими правами.

Получаем список групп, в которых находится дефолтный пользователь pi

cat /etc/group | grep pi

Далее создаем себе пользователя с членством в этих же группах

sudo useradd -m -G adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,pi,spi,i2c,gpio new_user_name

Устанавливаем пароль созданному пользователю

sudo passwd new_user_name

Перезагружаем (sudo reboot) и заходим под созданным пользователем, если вход успешен, то грохаем дефолтного пользователя pi:

sudo deluser --remove-all-files pi

Чтобы не вводить каждый раз пароль при команда с sudo, редактируем файл /etc/sudoers.d/010_pi-nopasswd и меняем там pi на свой логин.

Обновление системы в рамках одной версии Raspbian

Обновляем список пакетов:

sudo apt update

Затем запускаем обновление всех пакетов, которые нуждаются в обновлении (с приставкой full- обновляет с зависимостями).

sudo apt full-upgrade

При обновлении скачанные пакеты кешируются в папке /var/cache/apt/archives, можно грохнуть кеш, если места на карте не хватает.

sudo apt clean

Получение информации о системе

# информация о процессоре:
cat /proc/cpuinfo
# информация о памяти:
cat /proc/meminfo
# Информация о памяти:
cat /proc/meminfo
# Информация о разделах карты памяти:
cat /proc/partitions
Версия ОС:
cat /proc/version
Список USB устройств:
lsusb

Утилита для получения доп. информации — vcgencmd

# температура процессорного ядра
vcgencmd measure_temp

Установка сервера OpenVPN

Устанавливаем PiVPN

curl -L https://install.pivpn.io | bash

при установке спросит пароль, потом захочет статический ip (если настраивали ранее, то просто соглашаться), выбираем пользователя, которому настроить VPN соединение  (пользователей можно будет потом добавить из командной строки

# создать пользователя без пароля:
pivpn -a newadditionaluser nopass

потом установщик будет пугать что без автоматических обновлений (unattended upgrades) будет несекьюрно и предложит их включить, нажимаем Yes.

Потом выбираем какой протокол будем использовать UDP или TCP (наш выбор UDP).

Далее вводим номер порта на котором будет слушать VPN сервер (лучше нестандартный).

Далее выбираем использовать ли лучшую защиту (если у нас клиентские версии openvpn от 2.4), нам старье не нужно, поэтому нажимаем Yes.

После этого выбираем скольки битным шифрованием ECDSA шифровать соединение (256 соответствует 3072 бит RSA), выбираем золотую середину 384 между рекомендуемым размером и размером для параноиков.

Далее выбираем внешний белый IP для соединения снаружи или динамический DNS если белого IP у нас нет.

Затем выбираем провайдера DNS для подключаемых клиентов VPN (есть готовый список или можно забить свой), просто не паримся и выбираем Google, он и так о нас всё знает.

Далее на запрос Custom Search Domain отвечаем No.

На этом установка закончена и будет предложено ребутнуть систему.

Можно прописать в файле /etc/openvpn/server.conf версию протокола, добавив 4.

#proto udp
proto udp4

Далее создаем .ovpn файл который включает в себя ключ доступа, и который нужен для vpn клиента:

pivpn add

далее будет запрошено имя пользователя, срок действия сертификата (1080 дней по умолчанию), пароль для ключа, который будет запрашиваться при каждом подключении по VPN (защита на случай если сопрут ключ).

Сгенерированный файл сохраняется в каталоге
/home/Пользователь/ovpns.

Перетаскиваем файл конфигурации на устройство с клиентом и настраиваем на роутере форвардинг порта на внутренний ip raspberry.

Установка MySQL

С MySQL на rasperry облом, вместо него ставится MariaDB

sudo apt install mariadb-server

После установки нужно задать пароль для root (по умолчанию он пустой):

sudo mysql -u root -p

Также там на запрос об анонимных пользователях, отвечаем удалить им доступ, отключаем удаленное подключение рутом, удаляем тестовую базу. Вобщем на все вопросы отвечаем Yes.

После этого можно соединяться под рутом с новым паролем

sudo mysql -u root -p

Можно создать пользователей и базы:

CREATE DATABASE exampledb;
CREATE USER 'exampleuser'@'localhost' IDENTIFIED BY 'userpassword';
GRANT ALL PRIVILEGES ON exampledb.* TO 'exampleuser'@'localhost';

Установка PHP

Ставим апач

sudo apt install apache2

Ставим PHP 7.3 (версию можно поменять на свой вкус)

sudo apt install php7.3

Ставим нужные библиотеки (если потом ставить всякие пакеты типа phpmyadmin или фронт заббикса, то они сами подтянут необходимые для них библиотеки).

sudo apt install php7.3-curl php7.3-gd php7.3-intl php7.3-mbstring php7.3-mysql php7.3-opcache php7.3-xml php7.3-xmlrpc php7.3-zip php7.3-bcmath

Проверяем что php установился (выводим версию php)

php -v

Настройки лежат в /etc/php/7.3/

Установка модуля для апача

sudo apt install php libapache2-mod-php

Установка PHPMyAdmin

sudo apt install phpmyadmin

После установки можно запустить сразу dbconfig-common и ввести пароль для phpMyAdmin, эта штука настроит конфиги сама.

Правим настройки апача

sudo nano /etc/apache2/apache2.conf

добавляем в конец строчку

Include /etc/phpmyadmin/apache.conf

и рестартуем апач

sudo service apache2 restart

Ставим Zabbix 4.0

Создаем пользователя и базу для zabbix в MariaDB под рутом:

sudo mysql -u root -p

CREATE DATABASE zabbix;
CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'userpassword';
GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost';

Далее устанавливаем zabbix

sudo wget https://repo.zabbix.com/zabbix/4.0/raspbian/pool/main/z/zabbix-release/zabbix-release_4.0-3+$(lsb_release -sc)_all.deb
sudo dpkg -i zabbix-release_4.0-3+$(lsb_release -sc)_all.deb
sudo apt update
sudo apt -y install zabbix-server-mysql zabbix-frontend-php zabbix-agent

Импортируем схему и данные (вводим пароль от базы zabbix)

zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix

Редактируем конфиг:

sudo nano /etc/zabbix/zabbix_server.conf

Добавляем туда пароль от базы zabbix

DBPassword=пароль

Чтобы при перезагрузке сервера zabbix не вешал на пол часа систему из-за того MariaDB успела остановиться раньше чем zabbix (в этому случае zabbix будет пытаться долго и упорно сконнектиться с базой) — прописываем в настройках сервиса что требуется mysql:

systemctl edit zabbix-server

В редакторе прописываем следующие строчки и сохраняем файл:

[Unit]
Wants=mysql.service
After=mysql.service

Стартуем сервер и агент zabbix и прописываем в автозапуск

sudo systemctl restart zabbix-server zabbix-agent 
sudo systemctl enable zabbix-server zabbix-agent

Далее настраиваем фронтенд для zabbix, редактируем конфиг zabbix для апача

sudo nano /etc/zabbix/apache.conf

прописываем нашу таймзону там где комментарий # php_value date.timezone Europe/Riga и рестартуем апач

# php_value date.timezone Europe/Riga
php_value date.timezone Europe/Moscow

Выставляем права на файлы zabbix

sudo find /usr/share/zabbix -type f -exec chmod 664 {} \; 
sudo find /usr/share/zabbix -type d -exec chmod 775 {} \;

Заходим в веб-морду zabbix http://raspberry-ip/zabbix/ и прописываем настройки zabbix, после завершения входим с дефолтными пользователем и паролем:

Username: Admin

Password: zabbix

Меняем сразу пароль на свой.

Качаем этот архив, распаковываем. Файл userparameter_rpi.conf копируем в папку /etc/zabbix/zabbix_agentd.d , а файл rpi_zabbix_cputemp.xml импортируем в шаблоны zabbix (Настройка-Шаблоны-Импорт). Добавляем импортированный шаблон «Raspberry PI CPU Temperature» — Настройка-Узлы сети-Шаблоны.

Перезапускаем агент:

 sudo service zabbix-agent restart

Установка FTP сервера

Ставим proftpd сервер:

sudo apt install proftpd

Правим конфиг

sudo nano /etc/proftpd/proftpd.conf

Раскомментировать строчку, чтобы пользователи не вылазили за домашний каталог

DefaultRoot                   ~

После настройки перезагружаем конфиг

sudo service proftpd reload

Установка msmtp для отправки почты

sudo apt-get install msmtp msmtp-mta ca-certificates mailutils

Создаем и редактируем файл конфига

cd /etc
sudo touch msmtprc
sudo nano msmtprc

Заполняем данные от учетной записи нашего почтового сервера (если используем учетку от гугла, то при 2х факторной авторизации нужно получить в аккаунте пароль приложения, если 2х факторной авторизации нет, то нужно включить в аккаунте доступ небезопасным приложениям).

account gmail
host smtp.gmail.com
port 587
logfile /tmp/msmtp.log
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt

auth on
user user@gmail.com
password user_password
from user@gmail.com


account default : gmail

Проверяем отправку

echo 'your message' | msmtp destination-email-address@gmail.com
echo 'message' | mail -s "raspi-buster" destination-email-address@gmail.com
echo 'message' | sendmail destination-email-address@gmail.com

Подключение жестких дисков

Диски подключаем через USB3.0, через один или два порта. Если диски NTFS нужно поставить пакет (если еще не установлен).

sudo apt-get install ntfs-3g

Список подключенных дисков получаем командой:

sudo fdisk -l

Создаем каталоги, в который будем монтировать наши USB HDD (название можно придумать любое):

sudo mkdir /mnt/hdd1
sudo mkdir /mnt/hdd2

Устанавливаем права на запись на эти каталоги (либо другие если нужно ограничить)

sudo chmod 777 /mnt/hdd1
sudo chmod 777 /mnt/hdd2

Прописываем в конец файла /etc/fstab команду авто монтирования нашего USB HDD:

sudo nano /etc/fstab

Названия дисков смотрим из команды получения дисков, описанной выше (тип файловой системы указываем тот который присутствует на дисках, в данном случае NTFS).

/dev/sda1 /mnt/hdd1 ntfs-3g defaults,nofail,rw 0 1
/dev/sdb1 /mnt/hdd2 ntfs-3g defaults,nofail,rw 0 1
# если диск в ext-4 то монтируем так
/dev/sdb1 /mnt/hdd2 ext4 defaults,nofail,rw 0 1

После этого перезагружаемся и получаем примонтированные диски.

Параметр nofail позволяет загрузиться даже если не удастся примонтировать диск (без него придется проделать шаги, описанные ниже, но есть и отрицательный момент — если диск не примонтируется, а мы будем на него писать — по факту будет литься на нашу SD-карту, причем файлов будет не видно, чтобы их увидеть выполняем команды:

sudo mount --bind / /mnt
sudo ncdu -x /mnt

В этом случае в /mnt/ будет отображаться наша флешка и можно оттуда удалить файлы, которые должны были литься на HDD, но попали на флешку.

Если мы не прописали nofail и при редактировании fstab косякнули, то при загрузке можем получить такую надпись:

Cannot open access to console, the root account is locked.

В этом случае вытаскиваем SD карту, подключаем через картридер к компу, находим диск boot и в нем файл cmdline.txt.

Дописываем в конец первой строки с параметрами init=/bin/sh (создавать новую строку не надо, просто дописываем в конец).

Вставляем карту обратно и загружаемся.

Чтобы отредактировать fstab монтируем раздел для записи:

mount -o remount,rw /dev/mmcblk0p2 /

Вносим правки, исправляя косяки

nano /etc/fstab

Подключаем карту обратно к картридеру и убираем внесенный ранее текст init=/bin/sh

После этого перезагружаемся в обычном режиме.

Можно добавить пользователей под которым лить файлы на диски по FTP:

sudo useradd -m -d /mnt/hdd1/ hdd1 
sudo passwd hdd1

sudo useradd -m -d /mnt/hdd2/ hdd2
sudo passwd hdd2

Форматируем диск в ext-4

Для секьюрности можно отформатировать диски в ext4.

Если диск уже примонтирован, то нужно размонтировать

sudo umount /dev/sda1

Запускаем fdisk для нужного диска

sudo fdisk /dev/sda

Дальше выбираем команду d и удаляем раздел (если разделов несколько то несколько раз запускаем команду d и выбираем нужный раздел, если раздел только один то удаляется без лишних вопросов).

сommand (m for help): d
Partition number (1,2, default 2):

Partition 2 has been deleted.

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Затем создаем новый раздел командой n, первый сектор выбираем 2048.

Command (m for help): n
Partition number (1-128, default 1):
First sector (34-3907029134, default 65535): 2048
Last sector, +/-sectors or +/-size{K,M,G,T,P} (34-3907029134, default 3907029134):

Created a new partition 1 of type 'Linux filesystem' and of size 1.8 TiB.

Далее сохраняем изменения командой w

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

После этого форматируем созданный раздел в ext4

sudo mkfs.ext4 /dev/sda1

Проверка дисков SMART

Ставим smartmontools

sudo apt-get install smartmontools
#общая инфа о диске
sudo smartctl --info /dev/sda

# вывести подробную инфу
sudo smartctl -a /dev/sda

# начать длинный внутренний тест
sudo smartctl -t long -d sat /dev/sda -T permissive
# напишет сколько минут будет идти тест

# после теста смотрим результат
sudo smartctl -l selftest -d sat /dev/sda -T permissive

Добавляем параметры SMART в zabbix

Добавляем мониторинг состояния дисков в заббикс — берем скрипты из репозитория https://github.com/v-zhuravlev/zbx-smartctl

Чтобы zabbix мог запускать утилиты smartmontools копируем содержимое файла sudoers_zabbix_smartctl в файл /etc/sudoers.d/sudoers_zabbix_smartctl и ставим права на файл 440

sudo chmod 440 /etc/sudoers.d/sudoers_zabbix_smartctl

Копируем файл zabbix_smartctl.conf в папку /etc/zabbix/zabbix_agentd.d. В нем удаляем то что выше строчки (они для старых версий zabbix)

#With the latest 3.4 template you only need these

Копируем файл discovery-scripts/nix/smartctl-disks-discovery.pl в папку /etc/zabbix/scripts и устанавливаем права на файлы

sudo chown zabbix:zabbix /etc/zabbix/scripts/smartctl-disks-discovery.pl
sudo chmod u+x /etc/zabbix/scripts/smartctl-disks-discovery.pl

Тестируем скрипт, проверяем что он возвращает json с инфой о наших дисках.

sudo /etc/zabbix/scripts/smartctl-disks-discovery.pl

Если всё норм, то рестартуем агент

sudo systemctl restart zabbix-agent

Импортируем в zabbix шаблон Template_3.0_HDD_SMARTMONTOOLS_2_WITH_LLD.xml (Настройка->Шаблоны->Импорт) и подключаем его к нашему серверу (Настройка->Узлы сети->server_zabbx->шаблоны).

Установка minidnla

Ставим приложение

sudo apt-get install minidlna

Правим конфиг

sudo nano /etc/minidlna.conf

раскоментируем строчку чтобы не запускать от рута

#user=minidlna

Прописываем списком все папки где лежат наши медиа файлы (могут быть разбросаны в разных папках и на разных дисках)

media_dir=/mnt/hdd1/Films
media_dir=/mnt/hdd2/Films

можно там прописывать сразу и тип файлов:

A-аудио
P-картинки
V-видео
PV-картинки и видео,

если не указывать то minidlna сам определит тип файлов

media_dir=V,/mnt/hdd1/Films
media_dir=A,/mnt/hdd1/Music
media_dir=V,/mnt/hdd2/Films

Прописываем в конфиг папку, в которой будет хранится кеш-база медиа-ресурсов (чтобы не насиловать SD карту, прописываем на HDD), предварительно создав каталог на HDD.

db_dir=/mnt/hdd1/minidlna

Если нужно все папки выше указанные собрать в одну корневую, а не по отдельности то прописываем

merge_media_dirs=yes

Чтобы телек долго не ждал пока появится сервер в списке медиа ресурсов, прописываем чтобы minidnla каждые 15 секунд кричал в сеть что он работает

notify_interval=15

Рестартуем сервис

sudo systemctl restart minidlna

Добавляем генерацию превьюшек для видео

sudo apt install ffmpegthumbnailer

Создаем файл со скриптом:

#!/bin/bash

DIR=$1

if [ -z "$DIR" ]; then
	printf "%s\n" "This script will generate thumbnails for all video files inside the given directory"
	printf "%s\n" "moviexy.avi --> moviexy.jpg"
	printf "%s\n" "ffmpegthumbnailer is required"
	printf "%s\n" "Usage: generateThumbs "
	exit 1
fi

TYPES=( mov mp4 avi mkv m4v xvid divx wmv mpg mpeg )

# Create a regex of the extensions for the find command
TYPES_RE="\\("${TYPES[1]}
for t in "${TYPES[@]:1:${#TYPES[*]}}"; do
    TYPES_RE="${TYPES_RE}\\|${t}"
done
TYPES_RE="${TYPES_RE}\\)"

find $DIR -regex ".*\.${TYPES_RE}" -type f | while read -r FILEPATH
do
	printf "%s\n" "--- Start Thumbnailcreation for ---"
	printf "%s\n" "$FILEPATH"
	THUMBFILE="${FILEPATH%.*}.jpg" # remove video ext. and add .jpg
	if [ -f "$THUMBFILE" ]; then
		printf "\e[1;33m%s\e[0m\n" "Thumbnail exists"
	else
		printf "\e[1;32m%s\e[0m\n" "Generating thumbnail..."
		ffmpegthumbnailer -i "$FILEPATH" -o "$THUMBFILE" -s 160 -q 10
	fi
	printf "%s\n" "--- End Thumbnailcreation ---"
done
exit 0

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

Установка торрент-клиента Transmission

Сначала устанавливаем демон

sudo apt install transmission-daemon

Создаем папки на жестком диске torrent-inprogress для скачиваемых торрентов и torrent-complete для уже скачанных (это будет дефолтный каталог при добавлении торрент-файла, в окне добавления можно забить другой путь или диск).

sudo mkdir -p /mnt/hdd2/torrent-inprogress
sudo mkdir -p /mnt/hdd2/Films/torrent-complete

Редактируем конфиг

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

Прописываем строчки

"incomplete-dir": "/mnt/hdd2/torrent-inprogress",
"download-dir": "/mnt/hdd2/Films/torrent-complete",
"incomplete-dir-enabled": true,

Прописываем пароль для удаленного управления (после перезапуска там будет хеш этого пароля):

"rpc-password": "Your_Password",

Прописываем пользователя, которым будем коннектиться с веб-мордой

"rpc-username": "Your_Username",

Прописываем удаленный доступ только из локальной сети

"rpc-whitelist": "192.168.1.*",

Перечитываем настройки демона (иначе если просто перезапустить, то он затрет новые настройки)

sudo invoke-rc.d transmission-daemon reload

Стартуем демона

sudo systemctl start transmission-daemon

Веб-морда у Transmission слишком простая и не удобная, поэтому ставим китайскую альтернативу Transmission Web Control

Скачиваем установочный скрипт

wget https://github.com/ronggang/transmission-web-control/raw/master/release/install-tr-control.sh --no-check-certificate

Запускаем его

sudo bash install-tr-control.sh

Там выбираем первый пункт

1. Install the latest release.

После установки можно заходить в web-интерфейс по IP адресу raspberry и порту 9091, вводим там свой логин/пароль который забили в конфиг ранее

http://<RASPBERRY_IPADDRESS>:9091

Backup системы (с sd-карты)

Чтобы не снимать образ флешки можно бакапить систему файлами, используя rsync. Так образ занимает меньше места и при регулярном бакапе обновляет только изменившиеся файлы.

Создаем файл rsync-exclude.txt, со списком каталогов, которые мы не будем бакапить

/proc/*
/sys/*
/dev/*
/boot/*
/tmp/*
/run/*
/mnt/*
/media/*

На внешнем диске создаем каталог для бакапа, к примеру /mnt/hdd1/backups/pi/

И запускаем команду для бакапа (указываем где лежит файл исключений и куда копируем).

rsync -aHxv --delete --exclude-from=/rsync-exclude.txt / /mnt/hdd1/backups/pi/

Когда понадобится восстановить используем обратную команду и восстанавливаем на второй раздел

rsync -av --delete-during /mnt/hdd1/backups/pi/ /mnt/sdcard_partition2/

Если редактировали раздел boot то можно бакапить и его, сначала восстановить его, а потом второй раздел.

Сервер rsyslog для сброса логов с роутера

Для настройки сброса логов с роутера (например Zyxel Kinetic) или любого другого сетевого устройства, включаем 514 порт в файле /etc/rsyslog.conf , для этого нужно раскомментировать строчки

# provides UDP syslog reception
#module(load="imudp")
#input(type="imudp" port="514")

# provides TCP syslog reception
#module(load="imtcp")
#input(type="imtcp" port="514")

Далее создаем файл для лога

sudo mkdir /var/log/rsyslog
sudo chmod 750 /var/log/rsyslog
sudo touch /var/log/rsyslog/zyxel.log
sudo chmod 640 /var/log/rsyslog/zyxel.log

Теперь создаем в папке /etc/rsyslog.d/ файл с любым именем и расширением conf, например zyxel.conf, со следующим содержанием (меняем адрес 192.168.1.1 на ip роутера, который будет отправлять логи).

$template NetworkLog, "/var/log/rsyslog/zyxel.log"
:fromhost-ip, isequal, "192.168.1.1" -?NetworkLog
& ~

Возможно потребуется написать & stop вместо & ~, но пока работает и так.

Рестартуем сервис

sudo service rsyslog restart

Прописываем в роутере в качестве syslog сервера ip raspberry.

Теперь чтобы логи не раздувались, в папке /etc/logrotate.d/ создаем файл с любым именем (например, zyxel), с правилами архивации:

/var/log/rsyslog/zyxel.log {
        rotate 7
        size 500k
        notifempty
        compress
        postrotate
                invoke-rc.d rsyslog rotate > /dev/null
        endscript
}
Раздел

Полезные ссылки

Raspberry Pi 3. Мониторинг температуры процессора и других показателей

Raspberry Pi 3. Установка медиасервера Plex

Raspberry Pi 3. Создание собственного облачного хранилища Nextcloud 

Raspberry Pi 3. Организация сетевого доступа к файлам через Samba