Содержание

YGGtracker v2

Вторая версия каталога BitTorrent c открытым исходным кодом для сети Yggdrasil.

Функциональность

Обновления

Технические отличия

Децентрализация

С учетом полученной в первой версии аналитики, во второй версии принято решение отказаться от разделения групп пользователей на локальные и распределенные. Вместо этого, планируется создание инструментов экспорта личных данных в файл и последующего импорта на выбранный пользователем узел. При таком подходе также возможна автоматизация посредством веб-хуков, при подключении внешнего узла в настройках аккаунта.

Также рассматривается интеграция протокола ActivityPub для полноценной интеграции с Fediverse.

API

Для реализации распределенного индекса а также интеграции сторонних приложений, таких как 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

В зависимости от типа доступа, ниже приведены различные сценарии настроек Nginx:

DNS

При использовании доменного имени (на примере 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;
	}

Crontab

Обновление статистики пиров (scrape)

* * * * * wget -q -O /dev/null 'http://[address]/crontab/torrent/scrape/{key}' &> /dev/null

* где {key} - ключ ограничения доступа для запросов по http, указать можно в файле среды окружения .env / директива APP_KEY

FTP

В версии 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

vsftpd

Устанавливаем командой

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

Настроим монтирование на целевом сид-сервере, установив 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

qbittorrent-nox

Лучше всего подключать 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

yggtracker-wanted-torrents-receiver

Поскольку в работе 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 )

Ссылки

Исходный код на GitHub
Рецепты
Локализация
Новости проекта
Поисковый плагин для qBittorrent
Утилита для автозагрузки востребованных торрентов

Каналы KevaChat:

Индексная страница проекта