2024-02-10 12:53:55 +00:00

451 lines
26 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

====== Сидбокс ======
Сидбокс (англ. Seedbox) - частное автономное устройство, выполняющее функцию сбора, хранения и распространения данных или сетевых мета-данных (информации об узлах) другим узлам в сети.
Зачастую реализуется на базе одноплатного компьютера, в виду низкой энергозатратности и отсутствием шума.
В отличии от десктоп сидирования, устройство обеспечивает высокий показатель up-time.
===== Примеры устройств =====
{{:yggdrasil:bittorrent:seedbox:orange-pi-pc-plus-1tb-seed-box.png?200|OrangePi PC Plus / 1 Tb}} {{:yggdrasil:bittorrent:seedbox:orange-pi-pc-plus-1tb-seed-box-side-view.png?196|OrangePi PC Plus / 1 Tb}}
===== Сидбоксинг =====
Культура и сообщество энтузиастов, мотивированных свободой обмена данными: метео, bittorrent, и другие направления.
===== Yggdrasil =====
Yggdrasil является отличным инструментом для организации сид-сервера, без необходимости аренды выделенного IP адреса или порта;
сквозное шифрование обеспечивает защиту трафика, повышая устойчивость к прослушиванию и блокировкам со стороны провайдеров.
Программное обеспечение может быть использовано как для нужд сидирования непосредственно в локальную сеть Yggdrasil, так и в качестве шлюза-ретранслятора данных между удаленными точками, находящихся за NAT или чувствительных к мониторингу трафика.
Поскольку Yggdrasil обеспечивает соединение пиров путем туннелирования, не нужно настраивать маршрутизацию (проброс) портов на роутере, активировать опцию UPnP, достаточно разрешить выданный BitTorrent клиентом порт в настройках фаервол (при использовании модели whitelist)
===== Аппаратная часть =====
==== Контроллер ====
=== Выбор устройства ===
Для организации раздач в локальной сети Yggdrasil, требования к производительности минимальны, в большинстве случаев подойдет ARM платформа с 1 Гб оперативной памяти и внешним накопителем.
Использование для этой цели старого ноутбука, с постоянно подключенным зарядным устройством нежелательно для АКБ, если в устройстве не предусмотрен аппаратный модуль активной зарядки, обеспечивающий питание устройства напрямую, в случае, когда аккумулятор заряжен.
Оптимальным выбором для создания сид-бокса будет [[https://www.raspberrypi.com/|Raspbery Pi]]. Из бюджетных вариантов, существует множество альтернатив, например для BitTorrent раздач подойдет [[http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-PC-Plus.html|Orange Pi PC Plus]], имеющий на борту процессор Allwinner H3 SoC Quad-core Cortex-A7, 1GB LPDDR3 SDRAM и встроенную память 8GB eMMC Flash.
=== Операционные системы ===
Обычно для обслуживания сид-сервера, используется операционные системы семейства Linux.
Например, Orange Pi [[http://www.orangepi.org/html/serviceAndSupport|предоставляет]] для загрузки свои официальные образы - Android, Linux, и другие, с адаптацией под характеристики каждой модели.
Также, существуют независимые проекты с открытым исходным кодом для множества устройств, например [[https://www.armbian.com/|Armbian]], [[https://dietpi.com/|DietPi]] и другие.
Не смотря на то, что большинство одноплатных компьютеров поставляется с предустановленной ОС, лучше установить последнюю версию подходящего для своих нужд дистрибутива.
Для установки операционной системы, после создания установочного образа (удобно использовать [[https://etcher.balena.io|Balena etcher]]), подключаемся с помощью SSH, VNC или локально, если имеется внешний монитор, например, с HDMI адаптером.
Если используется портативный LCD дисплей, лучше запитывать его от отдельного источника питания USB, так как потребление тока может превышать 2 Ампера, что нежелательно для питания от микрокомпьютера напрямую.
=== Охлаждение ===
Основной нагрузкой на процессор, при организации сида BitTorrent, является вычисление Info Hash при создании и валидации содержимого раздач (что в прочем можно оптимизировать в настройках выбранного клиента).
Поэтому желательно установить на модули процессора, питания и памяти дополнительные радиаторы пассивного охлаждения, которые можно приобрести в радио-любительских магазинах.
В операционной системе Linux, контроль температуры датчиков удобно осуществлять с помощью утилиты sensors, установить которую можно командой:
<code>
apt install lm-sensors
</code>
=== Расширение памяти ===
== Программное расширение ==
Если контроллер обладает малым объемом ОЗУ, расширить встроенную оперативную память можно с помощью файла подкачки на диске.
Чтобы добавить раздел swap на встроенную память, выполняем команды
<code>
fallocate -l 2G /swapfile
</code>
назначаем права root
<code>
chmod 600 /swapfile
</code>
форматируем файл
<code>
mkswap /swapfile
</code>
после чего подключаем командой
<code>
swapon /swapfile
</code>
для подключения /swapfile при загрузке системы, добавим в /etc/fstab
<code>
# <file system> <mount point> <type> <options> <dump> <pass>
/swapfile none swap sw 0 0
</code>
Память swap желательно размещать на легко заменяемых носителях с высокой скоростью записи/чтения.
Если накопитель используется также и для других нужд, важно предусмотреть отдельный раздел. На дисках HDD, желательно размещать swap в начале разделов.
Подробнее о подготовке внешнего носителя данных, можно прочитать в разделе [[yggdrasil:bittorrent:seedbox#подготовкаосителя|Подготовка носителя]]
==== Хранение данных ====
Объем внутренней памяти устройства минимален и ориентирован для установки операционной системы и программного обеспечения к ней. Чтобы превратить компьютер в полноценный сервер файло-обмена, необходимо подключить внешний накопитель.
Помимо расширения объема штатной памяти, внешний носитель удобен возможностью легкой замены, масштабированием или организацией массива RAID для ускорения операций чтения/записи, а также репликации данных.
Для небольшого файло-обменного сервера, может быть использована обычная USB "флешка" на 128 Gb или внешний HDD диск, например Seagate Basic STJL1000400 2.5 USB 3.0 с 1TB ST1000LM035-FR на борту.
Внешние SSD накопители имеют большую скорость обмена данными в мульти-поточном режиме, но бюджетные диски бытового класса особенно чувствительны к циклам записи.
Для HDD характерны долговечность но вместе с тем, ограниченная скорость чтения данных, что заметно при нескольких одновременных подключениях к серверу или работой с реляционными базами данных.
Поскольку внешний накопитель будет использоваться для раздач BitTorrent, лучше отдать предпочтение HDD.
Для надежности хранения и обеспечения целостности данных при аварийных отключениях питания, предпочтительнее использовать журналируемую файловую систему, например Ext4.
=== Внешний накопитель ===
Рассмотрим пример создания разделов и форматирования с помощью утилит parted и mkfs.
Подключаем накопитель и находим его в списке:
<code>
parted -l
</code>
В моем случае это /dev/sda, поэтому он будет указан в качестве примеров ниже и важно заменить актуальным, во избежание потери данных.
Переходим в редактирование разделов
<code>
parted /dev/sda
</code>
Документацию интерфейса можно получить командой
<code>
help mkpart
</code>
Указываем стандарт разметки, GPT
<code>
mklabel gpt
</code>
В зависимости от целей и способа монтирования диска, можно создать несколько разделов.
Поскольку не знаю, сколько места может потребоваться для каждого пользователя (планируется расширять память новыми устройствами аппаратно)
создаю один общий логический раздел для директории /home и указываю размер 0-100%. Отступы (alignment) раздела при этом будут созданы автоматически.
<code>
mkpart logical ext4 0% 100%
</code>
Проверяем разметку разделов
<code>
print free
</code>
Если всё устраивает, сохраняем изменения командой
<code>
quit
</code>
Форматируем раздел, например в журналируемую файловую систему Ext4
<code>
mkfs -t ext4 /dev/sda1
</code>
Далее необходимо узнать UUID раздела командой
<code>
lsblk -o PATH,SIZE,RO,TYPE,MOUNTPOINT,UUID,MODEL
</code>
и для автоматического монтирования после запуска системы, указать в
<code>
/etc/fstab
</code>
результат должен быть примерно таким:
<code>
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=cf3151b5-dc12-1248-95d4-4de43dga3273 /mnt/sda1 ext4 defaults,noatime,rw,user,auto 0 2
</code>
== Пример подключения в home ==
Копируем данные пользователей, предварительно остановив все службы, работающие с домашним каталогом, например, qbittorent-nox
<code>
service qbittorent-nox stop
</code>
производим резервное копирование и удаляем каталог /home
<code>
cp /home /home.bak
rm -R /home
</code>
монтируем диск
<code>
mount /dev/sda1 /home
</code>
копируем (или переносим) данные на носитель
<code>
cp /home.bak /home
</code>
каждому пользователю рекурсивно возвращаем права
<code>
chown -R qbittorent-nox:qbittorent-nox /home/qbittorent-nox
</code>
запускаем службы
<code>
service qbittorent-nox start
</code>
По аналогии, можно создать несколько разделов, задав при этом нужные точки монтирования.
Желательно размещать swap, временные файлы и журналы на внешних дисках для увеличения срока эксплуатации внутренней памяти микрокомпьютера.
=== Сетевой накопитель ===
Можно также подключить удалённый накопитель, расположенный на другом устройстве.
== curlftpfs ==
Утилита для монтирования удалённой директории посредством FTP и CURL.
<code>
/usr/bin/curlftpfs -o allow_other ftp://user:password@[host]:21/source /target
</code>
Поскольку монтирование происходит от root, права доступа к ресурсу будут ограничены для остальных служб. Чтобы разрешить доступ к директории другим службам/пользователям, добавлен флаг -o allow_other.
Для подключения диска при авто-запуске, можно использовать crontab, fstab и другие утилиты, но в виду зависимости использующего софта от этой директории, лучше всего добавить команды в инициализацию сервиса:
<code>
[Service]
Type=forking
ExecStartPre=+/usr/bin/curlftpfs -o allow_other ftp://user:password@[host]:21/source /target
ExecStop=+/usr/bin/umount /target
</code>
* //Знак "+" нужен для выполнения данных команд от root, в то время как основной сервис в ExecStart выполняется от своего пользователя.//\\
* * //Разрешить монтирование для других пользователей можно в файле /etc/fuse.conf раскомментировав параметр user_allow_other//
Следует заметить, что curlftpfs имеет ряд недостатков, например очистка памяти, проблемы с правами доступа на виртуальных машинах и тд.
== sshfs ==
Смонтировать сетевое устройство можно также с помощью SSH.
Подключение осуществляется с помощью пары ключей RSA или с помощью пароля одной командой:
<code>
/usr/bin/sshfs -o password_stdin user@server:/source '/target' <<< 'password'
</code>
К недостаткам такого метода можно отнести вопрос повышенных привилегий SSH и дополнительной нагрузки на процессор, особенно, если подключение к удалённому хосту происходит средствами Yggdrasil.
== rclone ==
Многофункциональная утилита для синхронизации с популярными облачными платформами, также поддерживает различные протоколы - SSH, FTP и другие.
Для монтирования сетевого диска, используется команда [[https://rclone.org/commands/rclone_mount|rclone mount]].
Прежде, чем смонтировать удалённый ресурс, необходимо настроить подключение с помощью [[https://rclone.org/commands/rclone_config/|rclone config]]
Монтирование:
<code>
/usr/bin/rclone mount remote:/source /target &
</code>
* при операциях записи, необходимо включить минимальный уровень кеширования, указав флаг //--vfs-cache-mode writes//
* при запуске через systemd, важно указывать путь к файлу профиля через //--config//
* rclone, в отличии от других альтернатив, не требует запуска от администратора
* пример локального зеркала [[yggdrasil:bittorrent:yggtracker:v2#rclone|FTP для qbittorrent-nox]]
===== Маршрутизация =====
В локальной сети, обычно, сидирующее устройство подключается к роутеру посредством интерфейса Ethernet, не занимая при этом эфир Wifi.
При одновременном сидировании в различные сети, в том числе - интернет, обойти ограничения NAT и расширить географию раздач можно добавлением интерфейса VPN, например с помощью [[https://github.com/angristan/openvpn-install|CLI установщика OpenVPN]].
Таким образом, раздачи будут осуществляться на интерфейсы eth0 (ISP), tun0 (Yggdrasil), tun1 (VPN) и т.д.
Использование каналов можно проверить с помощью утилиты ifstat
* Проброс портов и активация UPnP на роутере для работы BitTorrent-сервера в сети Yggdrasil не требуется.
===== Сервер на базе qBittorrent =====
<WRAP round info 60%>
Общая информация о клиенте, доступна в разделе [[yggdrasil:bittorrent:qbittorrent|qBittorrent]]
</WRAP>
Устанавливаем серверный клиент qbittorrent-nox
<code>
apt install qbittorrent-nox
</code>
добавляем пользователя
<code>
adduser --system --group qbittorrent-nox
</code>
настраиваем авто-запуск
<code>
nano /etc/systemd/system/qbittorrent-nox.service
</code>
<code>
[Unit]
Description=qBittorrent Command Line Client
After=network.target
[Service]
Type=forking
User=qbittorrent-nox
Group=qbittorrent-nox
UMask=007
ExecStart=/usr/bin/qbittorrent-nox -d --webui-port=8080
Restart=on-failure
[Install]
WantedBy=multi-user.target
</code>
* чтобы ограничить использование памяти, можно добавить лимиты в секцию [Service]:
<code>
MemoryHigh=256M
MemoryMax=512M
MemorySwapMax=512M
</code>
активируем
<code>
systemctl enable qbittorrent-nox
</code>
запускаем
<code>
systemctl start qbittorrent-nox
</code>
проверяем сервис и порт
<code>
systemctl status qbittorrent-nox
netstat -tupnl | grep 8080
</code>
добавляем правила iptables для подключения к веб-панели
<code>
ufw allow from ADMIN_REMOTE_IP to any port 8080
</code>
заходим в админ-панель указав admin/adminadmin в качестве логина по-умолчанию
<code>
http://SEED_SERVER_IP:8080
</code>
указываем базовые настройки
* **Connection → Listening Port** - этот порт необходимо добавить в правила iptables для сидирования раздач в Yggdrasil (см. далее)
* **Speed → Global Rate Limits** - ограничиваем скорость, чтобы сид-сервер не занимал весь пропускной канал на пиках
* **Web UI → Authentication → Username / Password** - указываем логин пароль, отличный от стандартного
* **BitTorrent → Automatically add these trackers to new downloads** - удобно указать адреса трекеров для автоматического добавления к загружаемым торрентам и магнет-ссылкам, например [[yggdrasil:sites_and_services:other_network_services#torrent|трекеры в сети Yggdrasil]]
* **Advanced → Always announce to all trackers, Always announce to all trackers in a tier** - активируем работу со всеми доступными трекерами в списке каждого торрента ([[yggdrasil:bittorrent:qbittorrent#зависание_скачиваний|подробнее]])
* **Advanced → qBittorrent Section → Optional IP address to bind to** - IPv6 из списка, если хотим делиться только в сети Yggdrasil или оставляем по-умолчанию для раздач всем сетям (адрес своего узла в сети Yggdrasil можно получить с помощью команды yggdrasilctl getSelf)
* **Advanced → Enable embedded tracker** - Включив данную опцию, можно активировать сервер торрент-трекера и опубликовать его в списке [[yggdrasil:sites_and_services:other_network_services#torrent|внутрисетевых сервисов]] (см. также [[yggdrasil:bittorrent:opentracker|Opentracker]])
Сохраняем настройки и открываем Listening Port (для раздач в сеть интернет, достаточно поддержки роутером и наличия включённой опции UPnP)
<code>
ufw allow from 0200::/7 to any port [Listening Port]
</code>
данные профиля сохранены в директории пользователя qbittorrent-nox
<code>
/home/qbittorrent-nox/.config/qBittorrent
</code>
в частности, журналы для отладки проблем
<code>
/home/qbittorrent-nox/.local/share/qBittorrent/logs
</code>
== Расширение доступа ==
По умолчанию, qbittorrent-nox работает с файлами только в рамках собственного каталога /home/qbittorrent-nox
Чтобы позволить клиенту оперировать файлами в других каталогах, например, с внешним монтированием или файлами общего пользователя family, приложению необходимо расширить стандартный уровень доступа.
Для этого, добавляем пользователя qbittorrent-nox в соответствующую группу, указав флаг append:
<code>
usermod -a -G family qbittorrent-nox
</code>
Разрешаем bash в файле /etc/passwd
<code>
qbittorrent-nox:...:/home/qbittorrent-nox:/usr/bin/bash
</code>
Совместным каталогам группы family назначаем права не ниже 0770
===== Общий доступ к файлам =====
Помимо раздачи файлов посредством BitTorrent, сидбокс может выполнять функцию домашнего мультимедиа-сервера для общего хранения файлов между устройствами.
Таким образом, загрузив файл с одного устройства и продолжив его раздачу, можно открыть файл на другом, при этом не занимать дисковое пространство клиентской машины.
Файловые менеджеры различных дистрибутивов достаточно удобны в настройке.
Например в графической среде Gnome, в файловом менеджере переходим в левом меню **+ Other Locations** и указываем в нижнем трее адрес подключения - ftp, ssh, smb или другой.
Соответственно на файловом сервере должно быть установлен и настроен соответствующий сервис, а также разрешено подключение в правилах iptables.