gemlog/public/uk/pyseeder-i2p-ecosystem-support-with-yggdrasil.gmi
2025-10-09 06:12:13 +03:00

181 lines
No EOL
10 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Pyseeder: підтримка екосистеми I2P в мережі Yggdrasil
Так як при першій ініціалізації вузла i2pd засобами Yggdrasil виникли деякі затримки, вирішив слідом за конектом свого роутера - підняти й додатковий ресід для інших локальних юзерів.
## Pyseeder
pyseeder (https://github.com/PurpleI2P/pyseeder) - утиліта командного рядка, написана мовою Python. Вона використовується для різних задач, зокрема для генерації файлу i2pseeds.su3, необхідного для пошуку вузлів при першому запуску роутера I2P (в i2pd, він звичайно вказується в i2pd.conf). Це працює приблизно так, як DNS сід гаманців BitCoin.
Інструкції з користування pyseeder описані в README.md проєкту:
=> https://github.com/PurpleI2P/pyseeder/blob/master/README.md
Нижче опишу лише свою конфігурацію.
### Встановлення
Для Debian / Linux знадобились такі пакунки:
``` bash
apt install python3 python3-virtualenv build-essential libssl-dev libffi-dev
```
Від користувача, яким планується подальший запуск:
``` bash
git clone https://github.com/PurpleI2P/pyseeder.git
cd pyseeder
virtualenv --python=python3 venv
. venv/bin/activate
pip3 install .
```
### Nginx
В pyseeder, мене спочатку заплутала наявність сервера, адже для DNS сіда BitCoin - потрібен саме він. Тут же все простіше: потрібно просто згенерувати дамп "пірів" у статичний файл і розмістити його у теці яку слухає будь який Веб-сервер, зокрема Nginx.
Створімо публічну теку:
``` bash
mkdir /var/www/pyseeder
chown USER:GROUP /var/www/pyseeder
```
* `USER:GROUP` - ваше значення
Копіюємо туди файл seed.html з теки yggdrasil:
=> https://github.com/PurpleI2P/pyseeder/tree/master/yggdrasil
``` bash
cp yggdrasil/seed.html /var/www/pyseeder
```
Приклад налаштувань хосту Nginx можна знайти у файлі reseed_nginx.conf:
=> https://github.com/PurpleI2P/pyseeder/blob/master/yggdrasil/reseed_nginx.conf
Я організував свій хост наступним чином:
``` reseed_nginx.conf
limit_req_zone $binary_remote_addr zone=reseed:512k rate=10r/m;
server {
root /var/www/pyseeder;
listen [302:68d0:f0d5:b88d::9216]:80;
# на цьому сервері також прослуховується 0400::/7 (Mycelium)
# listen [505:6847:c778:61a1::9216]:80;
index seed.html;
location /i2pseeds.su3 {
limit_req zone=reseed burst=5;
if ($http_user_agent !~* "Wget/1.11.4" ) { return 403; }
}
location /user_at_mail.i2p.crt {
limit_req zone=reseed;
}
}
```
* не забудьте додати відповідні маски підмережі або використовуйте основну адресу на іншому порту, якщо 80 зайнятий
* також після змін треба оновити конфігурацію `systemctl reload nginx`
### Генерація ключа і сертифіката
``` bash
pyseeder keygen --cert /var/www/pyseeder/user_at_mail.i2p.crt --private-key /path/to/priv_key.pem --signer-id noreply@localhost
```
* `--cert` потрібен якщо на цільовому сервері увімкнена опція `reseed.verify = true`; якщо ви плануєте стати "офіційним" ресідом, його також потрібно додати до репозиторію i2pd через PR (інакше користувачу потрібно буде вказати цей сертифікат при імпорті пірів для верифікації постачальника i2pseeds.su3)
* `--private-key` - власне **приватний** ключ, яким підписуються дані для експорту
* `--signer-id` - поки не зрозумів, чому цей аргумент обов'язковий, доповню згодом, поки вказав `noreply@localhost`
* пароль на запит можна вказати пустим
### Генерація i2pseeds.su3
``` bash
YOUR_PASSWORD="Pa55w0rd"
echo $YOUR_PASSWORD | pyseeder reseed --netdb /path/to/netDb --private-key /path/to/priv_key.pem --outfile /var/www/pyseeder/i2pseeds.su3 --signer-id noreply@localhost
```
* `YOUR_PASSWORD` - пароль, який було вказано при `pyseeder keygen` (або кропаємо все до `|` та додаємо аргумент `--no-encryption` якщо пароль відсутній)
* `--netdb` - шлях до бази мережі I2P, це може бути відфільтрована скриптом або "жива" база вузла
* `--outfile` - публічна тека на Веб-сервері, звідки інші піри зможуть її забрати
* `--signer-id` - той само, що вказувався при генерації ключів
Для оновлення по розкладу crontab, створімо скрипт `crontab.sh`:
``` crontab.sh
#!/bin/bash
cd /path/to/pyseeder
. venv/bin/activate
#YOUR_PASSWORD="Pa55w0rd"
#echo $YOUR_PASSWORD | pyseeder reseed --netdb /path/to/netDb --private-key /path/to/priv_key.pem --outfile /var/www/pyseeder/i2pseeds.su3 --signer-id noreply@localhost
pyseeder reseed --no-encryption --netdb /path/to/netDb --private-key /path/to/priv_key.pem --outfile /var/www/pyseeder/i2pseeds.su3 --signer-id noreply@localhost
deactivate
```
* в прикладі вказані сценарії з використанням паролю і без (розкоментуйте потрібне)
* замініть значення `YOUR_PASSWORD`, `/path/to` і `noreply@localhost` на ваші
* додаємо права на виконання: `chmod +x crontab.sh`
І додамо завдання:
``` bash
crontab -e
```
* виконується від потрібного користувача
``` bash
@hourly /path/to/crontab.sh
```
## Фільтрація вузлів Yggdrasil
В принципі, можна користуватись утилітою з командного рядка (після активації `. venv/bin/activate`) але у випадку піра Yggdrasil, бажано не просто здампити накопичену базу NetDB, але й відфільтрувати вузли Yggdrasil для локальних користувачів, зокрема - віддавати їх в пріоритеті. Цю задачу виконує скрипт:
=> https://github.com/PurpleI2P/pyseeder/blob/master/yggdrasil/y2r.sh y2r.sh
Перед його запуском, важливо актуалізувати в ньому наступні шляхи:
* `netdb` - донор: ймовірно, база активного вузла `/var/lib/i2pd/netDb`
* `outdb` - не публічна копія з відфільтрованими результатами роботи `y2r.sh`
* `sed -i "s/>[0-9]\{1,1000\}</>$yggaddr</" /srv/pyseeder/output/seed.html`
* інші можна лишити як є (тимчасові файли стандартно зберігатимуться в `/tmp/*`)
Цей скрипт зручно виконувати через crontab з іншого скрипта, перед з командою `pyseeder reseed ...`
### Збереження тимчасових файлів в оперативній пам'яті
Оскільки pyseeder зберігає тимчасові дампи netDb в файл, щоб не зношувати SSD, я монтую локації y2r.sh в оперативну пам'ять. Для цього в `/etc/fstab` додаю на вибір:
1) tmpfs
Цей варіант дозволяє коректно розставити права на запис і вказати потрібні опції. Також він передбачає розширення пам'яті за рахунок swap у разі перевищення фізичного простору:
``` /etc/fstab
tmpfs /path/to/tmp-net-db tmpfs defaults 0 0
```
Зміни вступають в силу після перезапуску системи, якщо потрібно в рамках поточної сесії - монтуємо:
``` bash
mount -t tmpfs -o defaults tmpfs /path/to/tmp-net-db
```
* опції `defaults` можуть розширюватись, наприклад `..,noatime,nosuid,nofail,size=64M`
2) ramfs
У такому випадку, використовується лише фізична пам'ять, але для неї буде не доступний запис від користувача (crontab.sh). Змінити права після монтування (на прикладі вище) можна через `crontab -e` від root:
``` bash
@reboot chown USER:GROUP /path/to/tmp-net-db
```
але наскільки безпечним такий сценарій буде для динамічних даних ресіда - вирішуйте самостійно.
## Тестування
Для перевірки, на цільовому сервері (з попередньо встановленим pyseeder) виконуємо команду:
``` bash
pyseeder transport.pull --urls http://[302:68d0:f0d5:b88d::9216]/ --outfile /path/to/i2pseeds.su3
```
* для запобігання помилки парсера, важливо вказати слеш в кінці URL
## Посилання
=> https://devzone.org.ua/post/pyseeder-pidtrymka-ekosystemy-i2p-v-merezi-yggdrasil Веб-версія цього матеріалу з коментарями на DevZone
### Читайте також
=> setup-i2pd-with-i2p-network-connection-over-yggdrasil.gmi Встановлення роутера i2pd з підключенням до мережі I2P через Yggdrasil