How to Wiki Database (change log) http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

398 lines
26 KiB

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