Вторая версия каталога BitTorrent c открытым исходным кодом для сети Yggdrasil.
С учетом полученной в первой версии аналитики, во второй версии принято решение отказаться от разделения групп пользователей на локальные и распределенные. Вместо этого, планируется создание инструментов экспорта личных данных в файл и последующего импорта на выбранный пользователем узел. При таком подходе также возможна автоматизация посредством веб-хуков, при подключении внешнего узла в настройках аккаунта.
Также рассматривается интеграция протокола ActivityPub для полноценной интеграции с Fediverse.
Для реализации распределенного индекса а также интеграции сторонних приложений, таких как qBittorrent (поисковый плагин), Jackett и других, доступны следующие интерфейсы:
GET /api/torrents?search=value&sensitive=0&locales=en|uk&yggdrasil=1&page=1
* search - опционально, отображаются последние торренты, если параметр не указан
* sensitive - опционально, 0/1 отображать чувствительный контент или отображать любой если параметр не указан
* locales - опционально, список локалей разделенных | или отображать все, если параметр не указан
* yggdrasil - опционально, 0/1 фильтр yggdrasil-only или не применять фильтр, если параметр не указан
* page - опционально, страница результатов, 1 по-умолчанию
Для установки актуальной версии, достаточно выполнить несколько команд:
composer create-project yggverse/yggtracker
Инициализация базы данных:
php bin/console doctrine:schema:update --force
Установка последних обновлений пакетов:
composer update
Обновление базы данных:
php bin/console doctrine:migrations:migrate
Очистить кеш в режиме production можно командой:
APP_ENV=prod APP_DEBUG=0 php bin/console cache:clear
В зависимости от типа доступа, ниже приведены различные сценарии настроек Nginx:
При использовании доменного имени (на примере tracker.ygg):
server { listen [::]:80; # Ограничить доступ только для сети Yggdrasil # allow 0200::/7; # deny all; root /var/www/YGGverse/YGGtracker/public; index index.html index.htm index.nginx-debian.html index.php; server_name tracker.ygg; location / { try_files $uri /index.php$is_args$args; } location ~ ^/index\.php(/|$) { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root; # Environment variables # bin/console cache:clear fastcgi_param APP_ENV prod; internal; } location ~ \.php$ { return 404; } }
Если каталог расположен по IP адресу Yggdrasil в поддиректории, можно использовать следующую инструкцию на стандартной конфигурации Nginx:
ln -s /var/www/YGGverse/YGGtracker/public /var/www/html/yggtracker
# /etc/nginx/sites-available/default server { # http / 80 порт / IPv6 listen [::]:80 default; # Ограничить доступ только для сети Yggdrasil # allow 0200::/7; # deny all; root /var/www/html; index index.html index.htm index.nginx-debian.html index.php; server_name _; location / { try_files $uri $uri/ /index.php?$args; } location /yggtracker { root /var/www/YGGverse/YGGtracker/public; rewrite ^/yggtracker/(.*)$ /$1 break; try_files $uri @yggtracker; } location @yggtracker { # Provide actual php -v fastcgi_pass unix:/run/php/php8.1-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /var/www/YGGverse/YGGtracker/public/index.php; fastcgi_param SCRIPT_NAME /yggtracker/index.php; fastcgi_param REQUEST_URI /yggtracker$uri?$args; # Среда окружения # При любых изменениях в prod не забываем о команде bin/console cache:clear # fastcgi_param APP_ENV prod; }
Обновление статистики пиров (scrape)
* * * * * wget -q -O /dev/null 'http://[address]/crontab/torrent/scrape/{key}' &> /dev/null
* где {key} - ключ ограничения доступа для запросов по http, указать можно в файле среды окружения .env / директива APP_KEY
В версии 2.2.0 расширена функция «Wanted», которая теперь позволяет автоматизировать запросы на раздачу, а также осуществлять «конвертацию» любой раздачи в сеть Yggdrasil.
Работает эта функция следующим образом:
После того, как скрипт crontab обнаруживает торрент с активными личерами, но без сидеров, он автоматически копирует исходный торрент-файл в общедоступную директорию /app/var/ftp
при этом, к торрент файлу добавляются все возможные трекеры как с исходного файла, так и настроек приложения.
* К такому файлу также добавляется префикс wanted#torrentId вместо стандартного yggtracker#torrentId, чтобы отличать файлы и открывать их особым образом, во избежание утечки данных в интернет, например (в отличии от обычной загрузки, которая фильтрует внешние адреса по-умолчанию)
Как только файл был загружен и ретранслирован в сеть Yggdrasil, он автоматически удаляется из FTP каталога.
В прочем, FTP хранилище нужно не столько для ручного доступа, сколько для того, чтобы позволить владельцам сид-узлов автоматизировать процесс обработки запросов, например, с помощью функции автосканирования директории, доступной в большинстве современных bittorrent клиентов.
При этом, сидирующему боту не нужно загружать весь реестр - YGGtracker автоматически копирует только востребованные торренты по тематическим каталогам, выполняющих функцию фильтра и администратор узла может выбрать для себя интересующий фильтр.
На данный момент, доступны следующие варианты для прослушивания запросов:
Поскольку bittorrent клиенты не умеют сканировать директории по протоколу FTP, в системах Linux можно примонтировать удалённый раздел в локальную директорию сервера с помощью различных утилит (частично эта тема раскрыта в материале Сидбокс - Сетевой накопитель) или использовать официальную утилиту для автозагрузки востребованных торрентов со всех узлов YGGtracker.
Ниже будет рассмотрен пример рабочей конфигурации FTP/API на базе vsftpd, qbittorrent-nox и rclone; корень проекта расположен в директории /var/www/YGGverse/YGGtracker
Устанавливаем командой
apt install vsftpd
Создадим директорию и добавим приложению доступ на запись
mkdir /var/www/YGGverse/YGGtracker/var/ftp chown www-data:www-data /var/www/YGGverse/YGGtracker/var/ftp
Редактируем файл /etc/vsftpd.conf
listen_ipv6=YES anonymous_enable=YES local_enable=NO anon_root=/var/www/YGGverse/YGGtracker/var/ftp no_anon_password=YES hide_ids=YES pasv_min_port=40000 pasv_max_port=50000
Разрешаем входящие подключения (Yggdrasil)
ufw allow proto tcp from 0200::/7 to any port 21 ufw allow proto tcp from 0200::/7 to any port 40000:50000
Перезапускаем сервер
service vsftpd restart
Настроим монтирование на целевом сид-сервере, установив rclone
apt install rclone
Запускаем команду rclone config и отвечаем на вопросы:
n) New remote name> yggtracker // название подключения Storage> ftp // указываем FTP host> [201:23b4:991a:634d:8359:4521:5576:15b7] // официальный узел, если нужен свой, меняем port> 21 // можно оставить по-умолчанию user> anonymous // для анонимного подключения - anonymous password> anonymous ... // остальные пункты по-умолчанию
Создадим точку монтирования и актуализируем права
mkdir /home/qbittorrent-nox/yggtracker chown qbittorrent-nox:qbittorrent-nox /home/qbittorrent-nox/yggtracker
Монтирование осуществляется командой
rclone mount yggtracker:/yggtracker/torrents/wanted/all /home/qbittorrent-nox/yggtracker &
Демонтировать
umount /home/qbittorrent-nox/yggtracker
Лучше всего подключать FTP при запуске клиента, поэтому добавим следующие настройки сервиса в файл /etc/systemd/system/qbittorrent-nox.service
ExecStartPre=/usr/bin/rclone mount --config /home/qbittorrent-nox/.config/rclone/rclone.conf --daemon --read-only yggtracker:/yggtracker/torrents/wanted/all /home/qbittorrent-nox/yggtracker ExecStop=/usr/bin/umount /home/qbittorrent-nox/yggtracker
Затем
systemctl daemon-reload service qbittorrent-nox restart
* О том, как настроить сервер на базе qbittorrent-nox
Теперь можно перейти в веб-интерфейс и указать локальную директорию для прослушивания запросов на раздачи:
Web UI → Preferences → Download → Automatically add torrents from
Также желательно копировать торрент-файлы локально для стабильной работы клиента
Web UI → Preferences → Download → Saving Management → Copy .torrent files to
Поскольку в работе qbittorrent-nox и rclone замечена проблема синхронизации, которую можно решить только рестартом клиента, было принято решение отказаться от rclone и создать специальную утилиту, позволяющую также загружать торренты от всех провайдеров YGGtracker, без необходимости вручную добавлять настройки подключения для каждого из них.
Скрипт написан на языке PHP 8 (возможно будет добавлена альтернатива на Python или Bash) и подразумевает загрузку торрент-файлов локально, посредством crontab.
Установка последней версии выполняется одной командой:
git clone https://github.com/YGGverse/yggtracker-wanted-torrents-receiver.git
crontab:
* * * * * /usr/bin/php src/cli.php > /dev/null 2>&1
В README.md указаны подробные комментарии по тонкой настройке, хотя сам скрипт достаточно установить как есть - торренты будут загружены в директорию storage.
Из полезных функций - можно указать собственные условия получения торрентов, возможность обновления реестра провайдеров из репозитория, и т.д.
При активной опции import.storage.common загруженные торренты будут скопированы в общую директорию storage/_common, что позволяет работать с торрент клиентами, не поддерживающими рекурсивное сканирование или прослушивание нескольких директорий, а также вручную мониторить и настраивать клиент для каждого провайдера - эта задача теперь делегирована провайдерам в рамках в PR на GitHub.
Торренты в директории storage/_common защищены от дублирования хешированием содержимого по MD5. В остальных случаях, торрент файлы копируются в директории провайдеров, например storage/yggtracker/original_name, после чего можно указать нужную директорию в клиенте qBittorrent или другом, без необходимости что либо менять в systemd.
Базовые настройки приложения указываются в файлах группы .env
# Название проекта APP_NAME=YGGtracker # Локаль по-умолчанию APP_LOCALE=en # Список доступных локалей APP_LOCALES=en|cs|eo|fr|ka|de|he|it|lv|pl|pt|ru|es|uk # Количество записей на страницу APP_PAGINATION=10 # Тема оформления по-умолчанию APP_THEME=default # Список доступных тем оформления APP_THEMES=default # Настройки чувствительного контента для новых пользователей по-умолчанию APP_SENSITIVE=0 # Утверждение новых пользователей для новых пользователей по-умолчанию APP_APPROVED=0 # Фильтрация ресурсов Yggdrasil для новых пользователей по-умолчанию APP_YGGDRASIL=1 # Настройки дополнительных трекеров APP_TRACKERS=http://[201:23b4:991a:634d:8359:4521:5576:15b7]:2023/announce|... # Адреса поисковых ботов, для которых отключены социальные функции на сайте - загрузки, лайки, ведение журнала активности и т.д. APP_CRAWLERS=30a:5fad::e|... # Ограничение на размер загружаемого файла .torrent APP_TORRENT_FILE_SIZE_MAX=1024000 # Ограничение на размер загружаемых постеров APP_TORRENT_POSTER_FILE_SIZE_MAX=10240000 # Включить экспорт запросов на раздачу средствами FTP APP_TORRENT_WANTED_FTP_ENABLED=1 # Директория FTP APP_TORRENT_WANTED_FTP_FOLDER=/yggtracker # Транслировать по FTP только подтвержденные торренты APP_TORRENT_WANTED_FTP_APPROVED_ONLY=1 # Индексировать названия торрентов APP_INDEX_TORRENT_NAME_ENABLED=1 # Индексировать названия info hash v1 APP_INDEX_TORRENT_HASH_V1_ENABLED=1 # Индексировать названия info hash v2 APP_INDEX_TORRENT_HASH_V2_ENABLED=1 # Индексировать названия файлов APP_INDEX_TORRENT_FILENAMES_ENABLED=1 # Индексировать содержимое поля "источник" APP_INDEX_TORRENT_SOURCE_ENABLED=1 # Индексировать содержимое поля "комментарий" APP_INDEX_TORRENT_COMMENT_ENABLED=1 # Минимальная длина слова для индексации APP_INDEX_WORD_LENGTH_MIN=3 # Максимальная длина слова для индексации APP_INDEX_WORD_LENGTH_MAX=255
Все пользовательские данные расположены в директории приложения /var
/var/cache - кеш приложения /var/log - журналы /var/ftp - временное хранилище FTP API /var/posters - каталог с исходными файлами постеров (пост-обработанные файлы кешируются в /public/posters) /var/torrents - каталог torrent файлов, соответствующих torrent.ID /var/data.db - база данных SQLite
В официальной сборке, переводы осуществляются в рамках площадки Crowdin.
При использовании собственных сборок, для извлечения строк в директорию /translations, можно использовать команду
php bin/console translation:extract --clean --domain="messages" --prefix="" --force ru
Если используются внешние провайдеры Crowdin, Loco и другие, выгрузка осуществляется командой:
php bin/console translation:push --force --domains="messages"
Импорт
php bin/console translation:pull --force --intl-icu --domains="messages"
После внесения изменений в среде prod, не забываем обновить кеш
APP_ENV=prod APP_DEBUG=0 php bin/console cache:clear
Каталог проекта ( tracker.ygg ) - включает межверсионные обновления из репозитория ( RSS , JSON , FTP API )