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

522 lines
28 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.

====== 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~~