====== YGGtracker v2  ======

Вторая версия каталога BitTorrent c [[https://github.com/YGGverse/YGGtracker|открытым исходным кодом]] для сети Yggdrasil.

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

  * Добавлена поддержка мультиязычности интерфейса и контента
  * Вместо импорта magnet-ссылок, добавлена поддержка загрузки torrent файлов с возможностью экспорта в magnet или torrent форматах
  * Максимально упрощено добавление контента: описание и теги генерируются автоматически из содержимого torrent файла
  * Подробные информационные страницы о содержимом каждого torrent файла, возможность фильтрации приватных и non-yggdrasil подключений
  * Добавлена лента активности пользователей
  * Расширены способы подписки по RSS - последние торренты, активность по отдельному торренту, активность пользователей, подписки на поисковые результаты
  * Гибкие настройки профиля - фильтры контента по локали, типам активности, фильтрация адресов трекеров и т.д.
  * Организация доступа к редактированию контента основана на принципе википедии, где каждый участник может редактировать материалы, с сохранением истории правок
  * Доступны уровни доступа - пользователь, автор, модератор. Первый пользователь может создавать новых модераторов, в то время как они - добавлять остальных, формируя ресурс коллективного типа
  * Еще не реализованной но одной из основных функций будут мульти-язычные информационные страницы, которые будут автоматически объединять все контекстные файлы для скачивания
  * В рамках информационных страниц возможно будет реализовано стриминговое вещание посредством webtorrent, для удобного просмотра видео без загрузки торрент файла.

==== Обновления ====

  * 2.1.0 - добавлена поддержка API для интеграции сторонних приложений и плагинов для торрент клиентов - [[yggdrasil:bittorrent:qbittorrent|qBittorrent]] ([[https://github.com/YGGverse/qbittorrent-yggtracker-search-plugin|плагин]]), [[yggdrasil:bittorrent:jackett|Jackett]] и других
  * 2.2.0 - добавлена возможность запроса раздач с обычных торрентов в сеть Yggdrasil а также инструменты автоматизации
  * 2.3.0 - расширены уровни доступа - авторам и модераторам доступен весь контент вне зависимости от настроек в аккаунте, автором добавлена функция отключения публикаций
  * 2.4.0 - добавлена поддержка постеров с возможностью редактирования сообществом; добавлена поддержка транслитерации для поиска по названиям файлов, добавлена поисковая индексация комментариев
  * 2.5.0 - добавлены категории торрентов; новый релиз поискового плагина для qBittorrent, с поддержкой фильтра по категориям и следованием сессии настройкам аккаунта
  * 2.6.0 - добавлены поисковые фильтры, для настройки выборки по категорям, локали, и другим полям, игнорируя настройки аккаунта по-умолчанию (функция также применима к подпискам RSS и API)
===== Технические отличия =====

  * Серверная часть переписана с использованием фреймворка Symfony
  * Выход обновлений согласно [[https://semver.org/#semantic-versioning-200|Semantic Versioning 2.0.0]]
  * Для более простого развертывания и обновления проекта, во второй версии, вместо MySQL и SphinxQL используется база данных SQLite посредством ORM Doctrine 

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

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

Также рассматривается интеграция протокола [[https://ru.wikipedia.org/wiki/ActivityPub|ActivityPub]] для полноценной интеграции с Fediverse.

===== API =====

Для реализации распределенного индекса а также интеграции сторонних приложений, таких как [[yggdrasil:bittorrent:qbittorrent|qBittorrent]] ([[https://github.com/YGGverse/qbittorrent-yggtracker-search-plugin|поисковый плагин]]), [[yggdrasil:bittorrent:jackett|Jackett]] и других, доступны следующие интерфейсы:

==== Список торрентов ====

<code>
GET /api/torrents?search=value&sensitive=0&locales=en|uk&yggdrasil=1&page=1
</code>

* **search** - опционально, отображаются последние торренты, если параметр не указан\\
* **sensitive** - опционально, 0/1 отображать чувствительный контент или отображать любой если параметр не указан\\
* **locales** - опционально, список локалей разделенных | или отображать все, если параметр не указан\\
* **yggdrasil** - опционально, 0/1 фильтр yggdrasil-only или не применять фильтр, если параметр не указан\\
* **page** - опционально, страница результатов, 1 по-умолчанию

===== Установка =====

Для установки актуальной версии, достаточно выполнить несколько команд:

<code>
composer create-project yggverse/yggtracker
</code>

Инициализация базы данных:

<code>
php bin/console doctrine:schema:update --force
</code>

===== Обновление =====

Установка последних обновлений пакетов:

<code>
composer update
</code>

Обновление базы данных:

<code>
php bin/console doctrine:migrations:migrate
</code>

Очистить кеш в режиме production можно командой:

<code>
APP_ENV=prod APP_DEBUG=0 php bin/console cache:clear
</code>

===== Настройка =====

==== Nginx ====

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

=== DNS ===

При использовании доменного имени (на примере tracker.ygg):

<code>
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;
	}
}
</code>

=== Поддиректория ===

Если каталог расположен по IP адресу Yggdrasil в поддиректории, можно использовать следующую инструкцию на стандартной конфигурации Nginx:

<code>
ln -s /var/www/YGGverse/YGGtracker/public /var/www/html/yggtracker
</code>

<code>
# /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;
	}
</code>

==== Crontab ====

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

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

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

==== FTP ====

В версии 2.2.0 расширена функция "Wanted", которая теперь позволяет автоматизировать запросы на раздачу, а также осуществлять "конвертацию" любой раздачи в сеть Yggdrasil.

Работает эта функция следующим образом:

После того, как скрипт crontab обнаруживает торрент с активными личерами, но без сидеров, он автоматически копирует исходный торрент-файл в общедоступную директорию /app/var/ftp\\
при этом, к торрент файлу добавляются все возможные трекеры как с исходного файла, так и настроек приложения.\\

//* К такому файлу также добавляется префикс wanted#torrentId вместо стандартного yggtracker#torrentId, 
чтобы отличать файлы и открывать их особым образом, во избежание утечки данных в интернет, например (в отличии от обычной загрузки, которая фильтрует внешние адреса по-умолчанию)//

Как только файл был загружен и ретранслирован в сеть Yggdrasil, он автоматически удаляется из FTP каталога.

В прочем, FTP хранилище нужно не столько для ручного доступа, сколько для того, чтобы позволить владельцам [[yggdrasil:bittorrent:seedbox|сид-узлов]] автоматизировать процесс обработки запросов, 
например, с помощью функции автосканирования директории, доступной в большинстве современных bittorrent клиентов. 

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

На данный момент, доступны следующие варианты для прослушивания запросов:

  * /yggtracker/torrents/wanted/all - все торренты с маркером "востребован"
  * /yggtracker/torrents/wanted/locale/en|... - торренты с фильтром по локали контента
  * /yggtracker/torrents/wanted/sensitive/no|yes - фильтр по чувствительному признаку / NSFW

Поскольку bittorrent клиенты не умеют сканировать директории по протоколу FTP, в системах Linux можно примонтировать удалённый раздел в локальную директорию сервера с помощью различных утилит
(частично эта тема раскрыта в материале [[http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/yggdrasil:bittorrent:seedbox#сетевой_накопитель|Сидбокс - Сетевой накопитель]]) 
или использовать [[https://github.com/YGGverse/yggtracker-wanted-torrents-receiver | официальную утилиту ]] для автозагрузки востребованных торрентов со всех узлов YGGtracker.

Ниже будет рассмотрен пример рабочей конфигурации FTP/API на базе vsftpd, qbittorrent-nox и rclone; корень проекта расположен в директории /var/www/YGGverse/YGGtracker

=== vsftpd ===

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

<code>
apt install vsftpd
</code>

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

<code>
mkdir /var/www/YGGverse/YGGtracker/var/ftp
chown www-data:www-data /var/www/YGGverse/YGGtracker/var/ftp
</code>

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

<code>
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
</code>

Разрешаем входящие подключения (Yggdrasil)

<code>
ufw allow proto tcp from 0200::/7 to any port 21
ufw allow proto tcp from 0200::/7 to any port 40000:50000
</code>

Перезапускаем сервер

<code>
service vsftpd restart
</code>

=== rclone ===

Настроим монтирование на целевом сид-сервере, установив rclone

<code>
apt install rclone
</code>

Запускаем команду rclone config и отвечаем на вопросы:

<code>
n) New remote

name>     yggtracker                               // название подключения
Storage>  ftp                                      // указываем FTP
host>     [201:23b4:991a:634d:8359:4521:5576:15b7] // официальный узел, если нужен свой, меняем
port>     21                                       // можно оставить по-умолчанию
user>     anonymous                                // для анонимного подключения - anonymous
password> anonymous
...
// остальные пункты по-умолчанию
</code>

Создадим точку монтирования и актуализируем права

<code>
mkdir /home/qbittorrent-nox/yggtracker
chown qbittorrent-nox:qbittorrent-nox /home/qbittorrent-nox/yggtracker
</code>

Монтирование осуществляется командой

<code>
rclone mount yggtracker:/yggtracker/torrents/wanted/all /home/qbittorrent-nox/yggtracker &
</code>

Демонтировать

<code>
umount /home/qbittorrent-nox/yggtracker
</code>

=== qbittorrent-nox ===

Лучше всего подключать FTP при запуске клиента, поэтому добавим следующие настройки сервиса в файл
/etc/systemd/system/qbittorrent-nox.service

<code>
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
</code>

Затем

<code>
systemctl daemon-reload
service qbittorrent-nox restart
</code>

* О том, как настроить [[http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/yggdrasil:bittorrent:seedbox#сервер_на_базе_qbittorrent|сервер на базе 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 и создать специальную [[https://github.com/YGGverse/yggtracker-wanted-torrents-receiver|утилиту]], позволяющую также загружать торренты от всех провайдеров YGGtracker, без необходимости вручную добавлять настройки подключения для каждого из них.

Скрипт написан на языке PHP 8 (возможно будет добавлена альтернатива на Python или Bash) и подразумевает загрузку торрент-файлов **локально**, посредством crontab.

Установка последней версии выполняется одной командой:

<code>
git clone https://github.com/YGGverse/yggtracker-wanted-torrents-receiver.git
</code>

crontab:

<code>
* * * * * /usr/bin/php src/cli.php > /dev/null 2>&1
</code>

В [[https://github.com/YGGverse/yggtracker-wanted-torrents-receiver#yggtracker-wanted-torrents-receiver|README.md]] указаны подробные комментарии по тонкой настройке, хотя сам скрипт достаточно установить как есть - торренты будут загружены в директорию storage.

Из полезных функций - можно указать собственные условия получения торрентов, возможность обновления реестра провайдеров из репозитория, и т.д.

При активной опции import.storage.common загруженные торренты будут скопированы в общую директорию storage/_common, что позволяет работать с торрент клиентами, не поддерживающими рекурсивное сканирование или прослушивание нескольких директорий,
а также вручную мониторить и настраивать клиент для каждого провайдера - эта задача теперь делегирована провайдерам в рамках в PR на GitHub.

Торренты в директории storage/_common защищены от дублирования хешированием содержимого по MD5.
В остальных случаях, торрент файлы копируются в директории провайдеров, например storage/yggtracker/original_name, после чего можно указать нужную директорию в клиенте qBittorrent или другом, без необходимости что либо менять в systemd.
==== Приложение ====

Базовые настройки приложения указываются в файлах группы .env

<code>
# Название проекта
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
</code>

===== Обслуживание =====

==== Резервное копирование ====

Все пользовательские данные расположены в директории приложения /var

<code>
/var/cache - кеш приложения
/var/log - журналы
/var/ftp - временное хранилище FTP API
/var/posters - каталог с исходными файлами постеров (пост-обработанные файлы кешируются в /public/posters)
/var/torrents - каталог torrent файлов, соответствующих torrent.ID
/var/data.db - база данных SQLite
</code>

==== Локализация ====

В официальной сборке, переводы осуществляются в рамках площадки [[https://crowdin.com/project/yggtracker|Crowdin]].

При использовании собственных сборок, для извлечения строк в директорию /translations, можно использовать команду

<code>
php bin/console translation:extract --clean --domain="messages" --prefix="" --force ru
</code>

Если используются внешние провайдеры Crowdin, Loco и другие, выгрузка осуществляется командой:

<code>
php bin/console translation:push --force --domains="messages"
</code>

Импорт

<code>
php bin/console translation:pull --force --intl-icu --domains="messages"
</code>

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

<code>
APP_ENV=prod APP_DEBUG=0 php bin/console cache:clear
</code>

===== Список узлов =====

[[ http://[201:23b4:991a:634d:8359:4521:5576:15b7]/yggtracker/ru | Каталог проекта ]] ([[ http://tracker.ygg/ru | tracker.ygg ]]) - включает межверсионные обновления из репозитория 
(
[[ http://[201:23b4:991a:634d:8359:4521:5576:15b7]/yggtracker/ru/rss/torrents | RSS ]],
[[ http://[201:23b4:991a:634d:8359:4521:5576:15b7]/yggtracker/api/torrents | JSON ]], 
[[ ftp://[201:23b4:991a:634d:8359:4521:5576:15b7]/yggtracker/ | FTP ]] API
)

===== Ссылки =====

[[ https://github.com/YGGverse/YGGtracker | Исходный код на GitHub ]] \\
[[ https://github.com/YGGverse/YGGtracker/wiki | Рецепты ]] \\
[[ https://crowdin.com/project/yggtracker | Локализация ]] \\
[[ https://mastodon.social/@YGGverse | Новости проекта ]] \\
[[ https://github.com/YGGverse/qbittorrent-yggtracker-search-plugin|Поисковый плагин для qBittorrent ]]\\
[[ https://github.com/YGGverse/yggtracker-wanted-torrents-receiver | Утилита для автозагрузки востребованных торрентов]]\\

Каналы KevaChat: 

  * [[ http://[201:23b4:991a:634d:8359:4521:5576:15b7]/kevachat/room/NWVP1GPp59qEWYGVWWVxGR2JScHHbicWTy#latest | 0200::/7 ]]
  * [[ http://kevachat.ygg/room/NWVP1GPp59qEWYGVWWVxGR2JScHHbicWTy#latest | алиас ]]

[[ yggdrasil:bittorrent:yggtracker | Индексная страница проекта ]] \\

~~DISCUSSION~~