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