====== 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]] и других, доступны следующие интерфейсы: ==== Список торрентов ==== 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 хранилище нужно не столько для ручного доступа, сколько для того, чтобы позволить владельцам [[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 === Устанавливаем командой 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 * О том, как настроить [[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. Установка последней версии выполняется одной командой: git clone https://github.com/YGGverse/yggtracker-wanted-torrents-receiver.git crontab: * * * * * /usr/bin/php src/cli.php > /dev/null 2>&1 В [[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 # Название проекта 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 ==== Локализация ==== В официальной сборке, переводы осуществляются в рамках площадки [[https://crowdin.com/project/yggtracker|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 ===== Список узлов ===== [[ 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~~