399 lines
26 KiB
Plaintext
399 lines
26 KiB
Plaintext
====== YGGtracker v1 ======
|
||
|
||
<WRAP center round info 60%>
|
||
В материале рассмотрена устаревшая версия проекта. \\
|
||
Для получения актуальной информации, обратитесь в индексный раздел [[yggdrasil:bittorrent:yggtracker|YGGtracker]]
|
||
</WRAP>
|
||
|
||
Проект c [[https://github.com/YGGverse/YGGtracker|открытым исходным кодом]] для организации децентрализованного веб-реестра 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, так и в рамках домашнего сервера, например [[yggdrasil:bittorrent:seedbox|сидбокса]], не требуя при этом наличия выделенного 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 ====
|
||
|
||
Устанавливаем сервер из репозитория:
|
||
|
||
<code>
|
||
apt install mysql-server
|
||
</code>
|
||
|
||
Выполняем предварительную настройку безопасности утилитой:
|
||
|
||
<code>
|
||
mysql_secure_installation
|
||
</code>
|
||
|
||
Добавляем базу данных, пользователя, указываем пароль и уровень доступа:
|
||
|
||
<code>
|
||
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;
|
||
</code>
|
||
|
||
Теперь можно приступить к импорту структуры базы данных.
|
||
|
||
Проект и структура данных, расположены в файле /database/yggtracker.mwb.
|
||
|
||
Открыть данный формат можно официальным клиентом [[https://www.mysql.com/products/workbench/|MySQL Workbench]].
|
||
Для импорта структуры, удобно использовать подключение по SSH, с помощью утилиты Database - Synchronize Model.
|
||
|
||
* при подключении посредством адреса IPv6, может быть ошибка на этапе верификации хоста, обойти её можно добавив вместо IP - виртуального хоста в файл /etc/hosts или использовать IPv4.
|
||
|
||
==== Sphinx ====
|
||
|
||
[[https://sphinxsearch.com/|Sphinx]] - поисковый сервер с открытым исходным кодом, поддерживающий широкий спектр настроек, включая морфологию, словоформы,
|
||
а также имеет встроенные алгоритмы релевантности, включая удобную выборку посредством языка SphinxQL.
|
||
|
||
Помимо прочего, Sphinx ориентирован на быстродействие, в виду хранения поисковых индексов в оперативной памяти.
|
||
|
||
Установка, как и в случае других пакетов, доступна из штатных репозиториев большинства дистрибутивов (включая ARM платформы):
|
||
|
||
<code>
|
||
apt install sphinxsearch
|
||
</code>
|
||
|
||
Далее, необходимо отредактировать файл конфигурации.
|
||
Базовый пример также доступен /example/environment/sphinx.conf
|
||
|
||
<code>
|
||
nano /etc/sphinxsearch/sphinx.conf
|
||
</code>
|
||
|
||
Используя пример из официального репозитория, указываем только актуальные параметры подключения к БД, остальные настройки можно оставить по-умолчанию.
|
||
|
||
Сохраняем файл и запускаем сервис:
|
||
|
||
<code>
|
||
searchd
|
||
</code>
|
||
|
||
* иногда, запуск сервиса завершается ошибкой "FATAL: failed to create pid file '/run/sphinxsearch/searchd.pid': No such file or directory". Чтобы это исправить, необходимо вручную создать директорию:
|
||
|
||
<code>
|
||
mkdir /run/sphinxsearch
|
||
</code>
|
||
|
||
Теперь можно проверить работу индексатора, выполнив команду:
|
||
|
||
<code>
|
||
indexer --all --rotate
|
||
</code>
|
||
|
||
Для штатной работы YGGtracker, также указываем обновление индексов по расписанию crontab:
|
||
|
||
<code>
|
||
@reboot searchd
|
||
@reboot indexer --all --rotate
|
||
|
||
* * * * * indexer magnet --rotate
|
||
</code>
|
||
|
||
* в перспективе, планируется использование дельта-индексов, но в виду текущего объема данных в сети, в качестве временной меры, индекс обновляется ежеминутно.
|
||
|
||
** если сервер Sphinx не запускается при перезагрузке системы, можно добавить в crontab перед командой searchd - конструкцию sleep или использовать
|
||
|
||
<code>
|
||
systemctl enable sphinxsearch.service
|
||
</code>
|
||
|
||
==== Веб-сервер ====
|
||
|
||
=== Nginx ===
|
||
|
||
Настройка веб-сервера может отличаться, в зависимости от потребностей.
|
||
|
||
В данном примере, Nginx используется для веб-сервисов в сети Yggdrasil, расположенных в поддиректориях.
|
||
В частности, для YGGtracker будет использоваться адрес вида http://[IP]/yggtracker
|
||
|
||
Устанавливаем зависимости:
|
||
|
||
<code>
|
||
apt install nginx memcached php-fpm php-memcached php-mysql php-pdo php-curl
|
||
</code>
|
||
|
||
Поскольку работа с DNS не подразумевается, редактируем стандартный файл настроек, предварительно создав его резервную копию:
|
||
|
||
<code>
|
||
cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
|
||
|
||
nano /etc/nginx/sites-available/default
|
||
</code>
|
||
|
||
Актуальный пример содержимого также доступен в файле /example/environment/nginx
|
||
|
||
Ниже приведен пример текущей версии, с комментариями:
|
||
|
||
<code>
|
||
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;
|
||
}
|
||
}
|
||
</code>
|
||
|
||
Сохраняем и тестируем конфигурацию:
|
||
|
||
<code>
|
||
nginx -t
|
||
</code>
|
||
|
||
Перезапускаем сервер nginx:
|
||
|
||
<code>
|
||
service nginx restart
|
||
</code>
|
||
|
||
* на работающем сервере, перезапуск веб-сервера нежелателен, поэтому при внесении правок в конфигурацию, достаточно выполнить:
|
||
|
||
<code>
|
||
service nginx reload
|
||
</code>
|
||
|
||
Веб-сервер готов к работе.
|
||
|
||
При этом, в корне веб-сервера, будет отображено стандартное приветствие nginx.
|
||
Этот путь можно использовать для основного приветствия, домашней странички или использовать 302 редирект на директорию /yggtracker.
|
||
|
||
==== YGGtracker ====
|
||
|
||
Установка из репозитория на GitHub включает межверсионные обновления и рекомендуется только для разработчиков.
|
||
|
||
Для установки стабильного релиза, используется пакетный менеджер [[https://getcomposer.org/|Composer]]
|
||
|
||
<code>
|
||
apt install composer
|
||
</code>
|
||
|
||
Устанавливаем первую версию YGGtracker:
|
||
|
||
<code>
|
||
composer create-project yggverse/yggtracker=1.0.0
|
||
</code>
|
||
|
||
При использовании примера [[archive:yggdrasil:bittorrent:yggtracker:v1#nginx|конфигурации сервера Nginx]], установить проект в целевую директорию можно командой:
|
||
|
||
<code>
|
||
composer create-project yggverse/yggtracker /var/www/YGGverse/YGGtracker
|
||
</code>
|
||
|
||
Настраиваем доступы для веб-сервера:
|
||
|
||
<code>
|
||
chown -R www-data:www-data /var/www/YGGverse/YGGtracker
|
||
chmod -R 0770 /var/www/YGGverse/YGGtracker
|
||
</code>
|
||
|
||
При удаленной работе с файлами, удобно добавить пользователя в группу www-data
|
||
|
||
<code>
|
||
usermod -a -G www-data $USER
|
||
</code>
|
||
|
||
В целях безопасности, файлы приложения расположены уровнем выше публичной директории.
|
||
На текущем примере конфигурации, для доступа из сети, создадим ссылки:
|
||
|
||
<code>
|
||
ln -s /var/www/YGGverse/YGGtracker/src/public /var/www/html/yggtracker
|
||
</code>
|
||
|
||
При первом обращении к сайту, автоматически будут созданы файлы среды окружения (src/config/.env и src/config/env.default.php).
|
||
|
||
Актуальная структура файла конфигурации, доступна в файле example/environment/env.example.php
|
||
|
||
Редактируем, указывая подключение к серверам MySQL, Sphinx, memcached а также локальные настройки узла, например лимиты и правила ресурса.
|
||
|
||
В частности, обращаем внимание на следующие константы:
|
||
|
||
<code>
|
||
|
||
// Подключение к серверу 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);
|
||
</code>
|
||
|
||
Остальные настройки можно оставить по-умолчанию или изменить под свои требования.
|
||
|
||
В режиме распределённого узла, при обмене данными, производится сверка совместимости условий манифеста.
|
||
Поэтому при несоответствии настроек, контент частично или полностью может быть проигнорирован, например, если длина заголовков вне диапазона принимающей стороны.
|
||
|
||
Для максимальной совместимости, лучше использовать стандартный набор правил или предложить настройки другим участникам сети, посредством отправки PR.
|
||
|
||
Подробности взаимодействия узлов и тонкая настройка API, будет рассмотрена в отдельном разделе.
|
||
В ближайшее время планируется добавление поддержки мета-тегов, с помощью которых, можно интегрировать импорт и экспорт тематических данных, например для книжных, музыкальных или видео-каталогов.
|
||
|
||
Завершая установку приложения, добавим расписание в crontab (актуальная версия расписаний и рекомендуемые интервалы, также указаны в файле /example/environment/crontab):
|
||
|
||
<code>
|
||
* * * * * /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
|
||
</code>
|
||
|
||
После завершения конфигурации, можно вручную загрузить данные публичных профилей из других узлов:
|
||
|
||
<code>
|
||
php /YGGtracker/src/crontab/import/feed.php
|
||
</code>
|
||
|
||
Для эффективного обмена данными с другими участниками сети YGGtracker, также можно добавить свой узел в файл /src/config/nodes.json
|
||
|
||
==== Дополнительные сервисы ====
|
||
|
||
Чтобы сбалансировать нагрузку на экосистему Yggdrasil при активном обмене файлами, не лишним будет организовать и использовать ориентированный на это [[yggdrasil:public_peer|публичный пир]],
|
||
а также добавить его в файл /src/config/peers.json.
|
||
|
||
О том, как настроить собственный торрент-трекер, описано в статье [[yggdrasil:bittorrent:opentracker|Opentracker]].
|
||
|
||
|
||
|
||
===== Ссылки =====
|
||
|
||
[[ yggdrasil:bittorrent:yggtracker | Индексная страница проекта ]] \\
|
||
|
||
~~DISCUSSION~~
|