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.
399 lines
26 KiB
399 lines
26 KiB
9 months ago
|
====== 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~~
|