YGGtracker v1

В материале рассмотрена устаревшая версия проекта.
Для получения актуальной информации, обратитесь в индексный раздел YGGtracker

Проект c открытым исходным кодом для организации децентрализованного веб-реестра BitTorrent для сети Yggdrasil.

Серверная часть реализована на базе MySQL, SphinxQL и PHP 8, интерфейс - средствами HTML/CSS, без использования JavaScript, поэтому функционально совместим с браузерами, где эта функция отключена.

Базовые функции

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

Также, движок поддерживает фиды RSS, Sitemap и JSON API.

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

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

Аутентификация

YGGtracker использует внутрисетевой адрес для идентификации пользователя без привычной регистрации с указанием логина, пароля или email. Также для входа не требуется наличие сторонних централизованных серверов аутентификации. Подлинность пользователя при авторизации гарантируется соответствием уникального адреса IPv6, подписанного локально приватным ключом Yggdrasil в диапазоне 0200::/7.

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

В перспективе, возможна разработка опции дополнительного ключа идентификации, позволяющего идентифицировать отдельного пользователя в рамках общеиспользуемого IP.

Виды учетных записей

YGGtracker является средой для работы с распределенным реестром данных, на момент написания статьи, поддерживаются два вида учетных записей - Distributed (распределенный) и Local (локальный).

При первом входе, пользователь указывает тип профиля и способ обработки его персональных данных.

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

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

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

Данные в интернете представляют собой общественное достояние, создание которого требует усилий и времени. Централизованные решения чувствительны к цензуре и зависимы от администрации, с ростом популярности нередко злоупотребляющей рекламой или вовсе передающей проекты в руки третьих лиц, в частности компаний, редко заинтересованных в первичной цели проекта.

Проект YGGtracker призван сделать BitTorrent раздачи доступными, а реестр каталога - устойчивым к отключениям и зависимости от определенной команды. В симбиозе с Yggdrasil, может быть легко организован любым желающим, как при наличии VPS, так и в рамках домашнего сервера, например сидбокса, не требуя при этом наличия выделенного IP или открытого 80/443 порта. База данных при этом, может быть мгновенно загружена с других узлов или создана с нуля для локальных потребностей.

Децентрализация данных YGGtracker совмещает использование следующих форматов взаимодействия:

Активный режим

Активный режим используется для мгновенной синхронизации активности пользователя между другими узлами. Для этого, при выполнении определенного действия, например создания пользователем (с уровнем Distributed) раздачи, комментария и т.д., сервер YGGtracker отправляет другим узлам мета-данные события.

Поскольку интерфейс не подразумевает работу с JavaScript, в частности асинхронными функциями, такие события сохраняются в оперативной памяти сервера посредством Memcached и рассылаются другим узлам в течении минуты по расписанию crontab.

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

Пассивный режим

Пассивный режим представляет собой обмен данными посредством фидов штатного API. Данный формат взаимодействия использует расписание crontab для создания локального и сбора удалённых фидов, оглашенных посредством манифеста отдельно взятого узла.

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

Для идентификации данных, используется пара IPv6 пользователя и географически независимая метка времени (unixtime) контента.

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

На данный момент, протокол поддерживает следующие фиды:

  • /api/manifest.json - в этом файле указаны основные настройки узла, такие как версия API, пути к фидам, сводки данных, настройки модерации, условия контента, а также перечень других узлов; принимающий узел использует этот файл для анализа и фильтрации данных.
  • /api/users.json - реестр пользователей*
  • /api/magnets.json - реестр раздач*
  • /api/downloads.json - реестр истории загрузок*
  • /api/comments.json - реестр комментариев*
  • /api/stars.json - реестр наборы избранных*
  • /api/views.json - реестр истории просмотров*

* от пользователей в группе Distributed

Фиды генерируются по расписанию в статичные дампы, поэтому обращение к ним не оказывает нагрузки на раздающий сервер. Интервал импорта и экспорта обновлений зависит от отдельно взятого узла, как правило, в зависимости от активности сети.

Время последнего обновления также указывается в поле updated файла manifest.json

Установка

Системные требования

Для организации узла YGGtracker потребуется наличие программных пакетов Sphinx, Memcached, Crontab, Nginx / Apache, MySQL и PHP. При наличии данного ПО, наличие root или VPS не обязательно.

Сервер YGGtracker не взаимодействует с сервисом Yggdrasil напрямую, но в оригинальной реализации, должен работать на узле, принимающем подключения с диапазона 0200::/7 локально или посредством прокси-шлюза.

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

MySQL

Устанавливаем сервер из репозитория:

apt install mysql-server

Выполняем предварительную настройку безопасности утилитой:

mysql_secure_installation

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

mysql -u root -p
mysql > CREATE DATABASE IF NOT EXISTS yggtracker;
mysql > CREATE USER 'yggtracker'@'localhost' IDENTIFIED BY 'YGGTRACKER_PASSWORD';
mysql > GRANT SELECT, INSERT, UPDATE, DELETE on *.* TO 'yggtracker'@'localhost' WITH GRANT OPTION;
mysql > FLUSH PRIVILEGES;
mysql > quit;

Теперь можно приступить к импорту структуры базы данных.

Проект и структура данных, расположены в файле /database/yggtracker.mwb.

Открыть данный формат можно официальным клиентом MySQL Workbench. Для импорта структуры, удобно использовать подключение по SSH, с помощью утилиты Database - Synchronize Model.

* при подключении посредством адреса IPv6, может быть ошибка на этапе верификации хоста, обойти её можно добавив вместо IP - виртуального хоста в файл /etc/hosts или использовать IPv4.

Sphinx

Sphinx - поисковый сервер с открытым исходным кодом, поддерживающий широкий спектр настроек, включая морфологию, словоформы, а также имеет встроенные алгоритмы релевантности, включая удобную выборку посредством языка SphinxQL.

Помимо прочего, Sphinx ориентирован на быстродействие, в виду хранения поисковых индексов в оперативной памяти.

Установка, как и в случае других пакетов, доступна из штатных репозиториев большинства дистрибутивов (включая ARM платформы):

apt install sphinxsearch

Далее, необходимо отредактировать файл конфигурации. Базовый пример также доступен /example/environment/sphinx.conf

nano /etc/sphinxsearch/sphinx.conf

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

Сохраняем файл и запускаем сервис:

searchd

* иногда, запуск сервиса завершается ошибкой «FATAL: failed to create pid file '/run/sphinxsearch/searchd.pid': No such file or directory». Чтобы это исправить, необходимо вручную создать директорию:

mkdir /run/sphinxsearch

Теперь можно проверить работу индексатора, выполнив команду:

indexer --all --rotate

Для штатной работы YGGtracker, также указываем обновление индексов по расписанию crontab:

@reboot searchd
@reboot indexer --all --rotate

* * * * * indexer magnet --rotate

* в перспективе, планируется использование дельта-индексов, но в виду текущего объема данных в сети, в качестве временной меры, индекс обновляется ежеминутно.

** если сервер Sphinx не запускается при перезагрузке системы, можно добавить в crontab перед командой searchd - конструкцию sleep или использовать

systemctl enable sphinxsearch.service

Веб-сервер

Nginx

Настройка веб-сервера может отличаться, в зависимости от потребностей.

В данном примере, Nginx используется для веб-сервисов в сети Yggdrasil, расположенных в поддиректориях. В частности, для YGGtracker будет использоваться адрес вида http://[IP]/yggtracker

Устанавливаем зависимости:

apt install nginx memcached php-fpm php-memcached php-mysql php-pdo php-curl

Поскольку работа с DNS не подразумевается, редактируем стандартный файл настроек, предварительно создав его резервную копию:

cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak

nano /etc/nginx/sites-available/default

Актуальный пример содержимого также доступен в файле /example/environment/nginx

Ниже приведен пример текущей версии, с комментариями:

server {
	# Слушаем подключения только с IPv6, на 80 порту
	listen [::]:80 default;

	# Разрешаем доступ к ресурсу только в сети Yggdrasil
	allow 0200::/7;
	deny  all;

	# Оставляем по-умолчанию
	root /var/www/html;

	# Добавим поддержку файлов PHP
	index index.html index.htm index.nginx-debian.html index.php;

	# Название хоста и DNS в примере не используется
	server_name _;

	# Обработка ошибок 404
	location / {
		try_files $uri $uri/ =404;
	}

	# Подключаем сокет PHP актуальной версии
	location ~ \.php$ {
		include snippets/fastcgi-php.conf;

		# Версию PHP можно узнать командой php -v
		fastcgi_pass unix:/run/php/php8.1-fpm.sock;
	}

	# Запрещаем доступ к случайно загруженным на хост скрытым файлам вроде .vscode, .git и тд, не смотря на то, что они находятся уровнем выше
	location ~ /\. {
		deny all;
	}
}

Сохраняем и тестируем конфигурацию:

nginx -t

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

service nginx restart

* на работающем сервере, перезапуск веб-сервера нежелателен, поэтому при внесении правок в конфигурацию, достаточно выполнить:

service nginx reload

Веб-сервер готов к работе.

При этом, в корне веб-сервера, будет отображено стандартное приветствие nginx. Этот путь можно использовать для основного приветствия, домашней странички или использовать 302 редирект на директорию /yggtracker.

YGGtracker

Установка из репозитория на GitHub включает межверсионные обновления и рекомендуется только для разработчиков.

Для установки стабильного релиза, используется пакетный менеджер Composer

apt install composer

Устанавливаем первую версию YGGtracker:

composer create-project yggverse/yggtracker=1.0.0

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

composer create-project yggverse/yggtracker /var/www/YGGverse/YGGtracker

Настраиваем доступы для веб-сервера:

chown -R www-data:www-data /var/www/YGGverse/YGGtracker
chmod -R 0770 /var/www/YGGverse/YGGtracker

При удаленной работе с файлами, удобно добавить пользователя в группу www-data

usermod -a -G www-data $USER

В целях безопасности, файлы приложения расположены уровнем выше публичной директории. На текущем примере конфигурации, для доступа из сети, создадим ссылки:

ln -s /var/www/YGGverse/YGGtracker/src/public /var/www/html/yggtracker

При первом обращении к сайту, автоматически будут созданы файлы среды окружения (src/config/.env и src/config/env.default.php).

Актуальная структура файла конфигурации, доступна в файле example/environment/env.example.php

Редактируем, указывая подключение к серверам MySQL, Sphinx, memcached а также локальные настройки узла, например лимиты и правила ресурса.

В частности, обращаем внимание на следующие константы:

// Подключение к серверу MySQL

define('DB_PORT', 3306);
define('DB_HOST', 'localhost');
define('DB_NAME', '');
define('DB_USERNAME', '');
define('DB_PASSWORD', '');

// Добавляем модераторов, используя IPv6 в диапазоне 0200::/7 

define('MODERATOR_IP_LIST', (array)
  [
    '127.0.0.1',
    // ...
  ]
);

// Если не хотим работать в децентрализованном формате - указываем false

define('API_ENABLED', true);

Остальные настройки можно оставить по-умолчанию или изменить под свои требования.

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

Для максимальной совместимости, лучше использовать стандартный набор правил или предложить настройки другим участникам сети, посредством отправки PR.

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

Завершая установку приложения, добавим расписание в crontab (актуальная версия расписаний и рекомендуемые интервалы, также указаны в файле /example/environment/crontab):

* * * * * /usr/bin/php /YGGtracker/src/crontab/scrape.php      > /dev/null 2>&1
* * * * * /usr/bin/php /YGGtracker/src/crontab/export/push.php > /dev/null 2>&1
0 5 * * * /usr/bin/php /YGGtracker/src/crontab/import/feed.php > /dev/null 2>&1
0 0 * * * /usr/bin/php /YGGtracker/src/crontab/export/feed.php > /dev/null 2>&1
0 0 * * * /usr/bin/php /YGGtracker/src/crontab/sitemap.php     > /dev/null 2>&1

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

php /YGGtracker/src/crontab/import/feed.php

Для эффективного обмена данными с другими участниками сети YGGtracker, также можно добавить свой узел в файл /src/config/nodes.json

Дополнительные сервисы

Чтобы сбалансировать нагрузку на экосистему Yggdrasil при активном обмене файлами, не лишним будет организовать и использовать ориентированный на это публичный пир, а также добавить его в файл /src/config/peers.json.

О том, как настроить собственный торрент-трекер, описано в статье Opentracker.

Ссылки

Обсуждение

newbie, 2023/09/11 17:31, 2023/09/11 17:37
Вопрос по поводу "подлинность идентификации гарантируется соответствием REMOTE_ADDRESS IPv6 в диапазоне 0200::/7"...
А если я подключаюсь через прокси, идентификация просиходит по адресу, передаваемому в заголовке x-forwarded-for? Или все, кто через тот же прокси заходят будут иметь общий аккаунт?
Если всё-таки используются заголовки, и если кто-то подделает этот заголовок, то он легко сможет попать в мой аккаунт?
Есть такие расширения для браузеров, которые позволяют легко менять x-forwarded-for, x-originating-ip, x-remote-ip, x-remote-addr...

Еще, это неудобно тем, что образуется ограничение на устройство, с которого я могу попасть в свой аккаунт. Т.е., дома с ноутбука "зарегистрировался", а с планшета уже не попасть в аккаунт...

d4708, 2023/09/11 17:42, 2023/09/11 18:11
На данный момент, работы с заголовками не предусмотрено, будет использоваться тот адрес, с которого происходит подключение.

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

Если честно, о подключении с общего прокси сервера, не подумал (тк сам не пользуюсь)

Возможно следует перейти на модель сид-фразы, и передавать ее метку другим узлам, вместо IP. Это и повысит конфиденциальность и решит проблему использования мультиаккаунтного прокси или различных анонимайзеров (которые генерируют уникальный IPv6, например таких в рамках публичной ноды я собрал около 50к за месяц) но тогда стоит вопрос хранения чувствительных данных, в то время как подлинность адреса гарантируется приватным ключем на стороне клиента.

Текущий адрес сеанса можно узнать на странице отдельно взятой ноды
http://[201:23b4:991a:634d:8359:4521:5576:15b7]/yggtracker/node.php

newbie, 2023/09/11 18:06
Ну, вот на мой згляд авторизация по IP не оч. удобна и в случае с прокси-серверами не гарантирует безопасность...
Что касается seed-фразы, то наверное, она должна быть на основе одного из пары ключей (не обязательно привязанных к Yggdrasil). Но вам решать, конечно...

Fyodor Ustinov, 2023/09/11 18:32
Идеальное решение - не ходить в сеть yggdrasil через публичные прокси сервера. :)

newbie, 2023/09/11 18:56

Ну, я, допустим, не пойду, кто-то другой пойдет, незнаючи. И удивится потом, как из под его аккаунта насрали невежливо и не конструктивно вели беседу в комментариях. :) Всё-таки, за некоторые вещи на стороне сервера ответственность должна быть.



d4708, 2023/09/17 08:11, 2023/09/17 08:21
Конечно, не аргумент, но процент тех, кто не знает как и куда подключился посредством Yggdrasil потенциально невысок. Тем более, что сейчас при входе большими буквами указан IP адрес пользователя (при выборе типа профиля)

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

Ну и по модерации, поскольку в сети Yggdrasil можно нагенерить столько адресов, сколько не позволит сделать никакой ботнет, то потенциально заблокировать юзера можно лишь усложнив жизнь остальным, например подтверждением намерений использовать ресурс, а не просто там нагадить

Также вопрос цензуры, а нужна ли модерация вовсе.. теоретически, можно её отключить скрыв контент за формой поиска, таким образом получить желаемое можно только введя соответствующий запрос.

newbie, 2023/09/19 01:42, 2023/09/19 01:42

Тут у пользователей возник вопрос о том, как создать торрент для YggTracker и как его там разместить…

Пример создания торрента с помощью transmission-cli разместил в статье Transmission.

Полученную magten-ссылку нужно скопировать в поле подписанное «search or submit magnet link», нажать «submit» и будете перенаправлены на страницу, где можно указать подробности об этой раздаче…

Возможно, имеет смысл дополнить статью более подробными инструкциями…



d4708, 2023/09/19 02:00, 2023/09/19 02:14
Вообще есть подозрение, что пользователи не видят текст "search or submit magnet link", нужно немного доработать интерфейс, добавить кнопку явно, добавить загрузку торрент-файлов.

Для многих привычнее использование .torrent файла, но по сути, магнет-ссылка включает все необходимые данные, при этом в исходном виде (в то время как .torrent нужно декодировать, чтобы узнать содержимое)

Чтобы получить magnet-ссылку, нужно сначала создать "раздачу", то есть, указать в клиенте путь к файлу и сгенерировать для него info hash. Если файл уже есть в реестре торрент-клиента, то на примере Transmission GUI, я просто копировал Torrent -> Copy magnet link to clipboard. YGGtracker автоматически уберет сторонние треккеры и заполнит поля формы редактирования

newbie, 2023/09/19 03:17
Торрент-файл может содержать больше информации, нежели в magnet-ссылке.
Закодировано там всё простым bencode (который можно даже вручную составлять), а ниже основной информации, той, что есть в magnet-ссылке могут идти хеши всех кусочков (в magnet-ссылке обычно этого нет). И по причине того, что в торрент-файле есть данные с хешами кусочков, анализ существующего файла (если он существует) начинается сразу после добавления торрента в клиент, без сетевых запросов...
https://habr.com/ru/articles/119753/

d4708, 2023/09/19 03:34, 2023/09/19 03:54
Нужно добавить, уже сейчас реализована функция выбора способов загрузки - магнет, прямая загрузка с сервера, как например здесь

http://[201:23b4:991a:634d:8359:4521:5576:15b7]/yggtracker/download.php?magnetId=3

нужно время, т.к. после добавления API, только библиотека валидации магнет ссылок состоит из 1к строк кода и нужно интегрировать / переписать форму редактирования.
сейчас форма открывается только после добавления ссылки (и больше представляет из себя устаревший прототип), в общем прежде чем добавить парсер .torrent нужно переписать форму, которая позволит создавать раздачу с нуля.

По части торрент библиотеки, все еще в поисках готового решения, желательно composer. Но то что есть, или устарело или заброшено вовсе, например
https://github.com/bhutanio/torrent-bencode
https://github.com/christeredvartsen/php-bittorrent/tree/develop
...

Может еще покопаться в компонентах Symfony..

Вообще мысли даже сделать загрузку (обмен) файлов с дальнейшей конвертацией в BitTorrent раздачу. Если пользователи интересуются, возможно есть смысл.

newbie, 2023/09/19 17:03
>Вообще мысли даже сделать загрузку (обмен) файлов с дальнейшей конвертацией в BitTorrent раздачу.

Грузить по weby через Ygg большие файлы - так себе. Да и нагрузка на сервер возрастет, складывать всё это куда-то надо будет…

В случае с другими трекерами/каталогами, пользователи создают файлы *.torrent, загружают их на сервер, а там они уже парсятся, вставляются нужные трекеры, формируются магнет-ссылки и т.д.

Желающие скачать потом либо скачивают обработанный сервером torrent-файл, либо по магнет-ссылке…

d4708, 2023/09/19 21:22
По части передачи файлов через Ygg в целом, меня больше интересует вопрос нагрузки на публичные ноды. Спасибо они врят ли скажут за активную нагрузку на канал, поэтому долго были сомнения в таком "паразитировании" сети.

Например, мой публичный узел за месяц-полтора уже принял+передал 562113 Гб:
http://[201:23b4:991a:634d:8359:4521:5576:15b7]/yggstate/

и это до запуска внутрисетевого трекера.

Также в матрикс канале неоднократно видел сообщения об интересе админов нод к пикам нагрузок.

Короче говоря, здесь важно прикреплять к трекеру еще и канал обмена данными (ноду без ограничений хотя бы трафика), чтобы не мешать рядовым узлам.

Fyodor Ustinov, 2023/09/19 21:47
Люди, которые делают публичные пиры - как правило понимают что они делают.
Хуже, если ты не публичный пир а просто прицепился к нескольким узлам и через тебя ВНЕЗАПНО пошёл трафик. Впрочем, это фича ygg и про это каждый должен думать до того как.

Вобщем - забей.

d4708, 2023/09/19 22:42, 2023/09/19 22:44
Таки добавил как в инструкции (раздел "Файлообменные пиры"), так и на страницы самих узлов.
Осталось самому переключиться, пока еще есть коннект к чужому пиру (подключился раде тестов раздач и забыл)

Только авторизованные участники могут оставлять комментарии.
archive/yggdrasil/bittorrent/yggtracker/v1.txt · Последнее изменение: 2023/11/27 23:18 — d4708
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki