initial commit

This commit is contained in:
postscriptum 2025-11-01 14:28:20 +02:00
commit d4994cde4c
61 changed files with 7044 additions and 0 deletions

View file

@ -0,0 +1,149 @@
# Встановлення BitTorrent трекера Aquatic в Linux
Давно збирався підняти [BitTorrent трекер](https://uk.wikipedia.org/wiki/BitTorrent-трекер) відкритого типу (обмін файлами без реєстрації) для мережі [Yggdrasil](https://devzone.org.ua/post/yggdrasil-mereza-z-detsentralizovanym-routynhom). Для цієї мети існує відомий сервер з 15-річною історією розробки [OpenTracker](https://erdgeist.org/arts/software/opentracker/), реалізований мовою C, але останнім часом, я надаю перевагу більш сучасній мові Rust, тим паче що потім планую реалізувати цією мовою додатковий веб-агрегатор на базі кешованих трекером інфо-хешів у зв'язці з бібліотекою [rqbit](https://github.com/ikatson/rqbit).
Трохи полиставши результати пошуку на GitHub, віднайшов сервер [Aquatic](https://github.com/greatest-ape/aquatic), який також підтримує IPv4/IPv6, протоколи UDP, HTTP, WS і так само зберігає дані в оперативній пам'яті, не зношуючи своєю роботою носій SSD. Нижче опишу покрокову інструкцію збірки, встановлення та налаштування для мережі Yggdrasil, можливо даний матеріал буде цікавий початківцям, зокрема - для використання в класичній мережі Інтернет.
## Підготовка системи
### Створення системного користувача
Як і для інших програм Linux, що збираються з початкового коду і запускаються через `systemd`, я створюю окремого системного користувача з домашньою текою, для ізоляції прав доступу:
``` bash
useradd -m aquatic
```
### Встановлення системних залежностей
Програмне середовище Rust у мене розгорнуте в профілі `root`, куди я клоную репозиторії і засобами профілю якого проводжу збірку всіх бінарних файлів.
Якщо в системі не встановлена інфраструктура Rust (`rustc`, `cargo` та інше) тоді вам [сюди](https://rustup.rs/).
Стандартна інсталяція залежностей Rust вимагає близько 2 Гб дискового простору. Якщо ви, як і я, користуєтесь VPS - встановіть лише необхідні для роботи компілятора пакунки. Для цього при першому запуску команди `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`, оберіть пункт `2) Customize installation` і замість стандартного `Profile (which tools and data to install)? (minimal/default/complete) [default]` вкажіть `minimal`. Це пропустить встановлення зайвих на сервері пакунків, що зменшить розмір до ~600 Мб. У випадку використання `minimal`, для збірки Aquatic важливо до-встановити деякі глобальні залежності:
``` bash
apt install clang libclang-dev
```
* при інсталяції в `rustup` в режимі `default` цей крок можна пропустити
Якщо `rustup` вже встановлено, також переконаймось, що використовуються актуальні версії:
* `rustup update`
* `cargo update`
### Встановлення Aquatic
Виконуємо наступні кроки у послідовності:
1. `su root && cd ~` - логінимось (якщо досі не `root`) і переходимо в домашню теку
2. `git clone https://github.com/greatest-ape/aquatic.git && cd aquatic` - клонуємо вихідний код і переходимо до теки проєкту
3. `cargo build --release -p aquatic_udp` - збираємо оптимізовані бінарні пакети [aquatic_udp](https://github.com/greatest-ape/aquatic/tree/master/crates/udp)
Таким чином, бінарники будуть доступні у теці `/root/aquatic/target/release/*`. Оскільки ми будемо використовувати сервіс `systemd`, де відсутні змінні середовища, важливо скопіювати (або залінкувати) необхідні пакети в системне розташування, де вони матимуть відповідні права на виконання:
``` bash
install target/release/aquatic_udp /usr/local/bin/aquatic_udp
```
* мені потрібен тільки сервер UDP, якщо ви хочете підняти HTTP та WS, виконайте аналогічні кроки для крейтів `aquatic_*` відповідно
* тут ми використовуємо команду `install` замість `cp`, оскільки вона встановлює правильні права доступу замість `chmod`/`chown`
* якщо не плануєте оновлення, на даному етапі можна видалити не потрібні вихідні коди командою `rm -rf /root/aquatic`
### Файл конфігурації
Сервер Aquatic можна запускати зі стандартним набором опцій, без аргументів (отримати поточні налаштування для конфігурації сервера можна командою `aquatic_udp -p`)
Оскільки мій сервер буде працювати в режимі Yggdrasil-only, як скопіюю цей вивід у спільний системний файл конфігурації командою:
``` bash
aquatic_udp -p > /etc/aquatic.toml
```
* приклад `systemd` нижче буде використовувати цей модифікований файл
Стандартна конфігурація передбачає запуск на всіх інтерфейсах і порті `3000`, я ж змінюю на окрему адресу підмережі Yggdrasil і більш типовий для відкритих UDP трекерів порт `6969` (детальніше про те, як створити адресу підмережі Yggdrasil - читайте [тут](http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]/yggdrasil:subnet_setting)):
* `use_ipv4 = false` - вимикаю IPv4, так як цей інтерфейс в Yggdrasil не обслуговується
* `address_ipv6 = "[xxx:xxxx:xxxx:xxxx::fdb]:6969"` - де `xxx:xxxx:xxxx:xxxx::fdb` - актуальна адреса IPv6, `fdb` - це імпровізований постфікс у діапазоні `A-f0-9` типу "file database"
Якщо потрібен вивід публічної веб-статистики, вказуємо також:
* `write_html_to_file = true`
* `html_file_path = "/var/www/aquatic/index.html"` - шлях може бути іншим
* у цьому випадку створіть каталог командою `mkdir /var/www/aquatic`
* надайте відповідні права `chown aquatic:aquatic /var/www/aquatic`
* в конфігурації хосту `nginx` додаємо наступне (не забуваємо також відкрити `80` порт):
``` /etc/nginx/default.conf
# /etc/nginx/default
server {
listen [xxx:xxxx:xxxx:xxxx::fdb]:80;
server_name xxx:xxxx:xxxx:xxxx::fdb;
root /var/www/aquatic;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
```
* де `xxx:xxxx:xxxx:xxxx::fdb` - актуальна адреса IPv6 (або домен для `server_name`)
* не забуваємо застосувати зміни `nginx -t` / `systemctl reload nginx`
Інші налаштування лишаю стандартними.
### Налаштування Firewall
В системах Debian, в режимі UDP / Yggdrasil-only (трекер прийматиме та віддаватиме виключно внутрішньомережеві адреси пірів) я використовую наступне перманентне правило `ufw` для таблиці `iptables`:
``` bash
ufw allow from 0200::/7 to xxx:xxxx:xxxx:xxxx::fdb port 6969 proto udp
```
* якщо в конфігурації вказано інший порт, використовуйте його замість `6969`
Якщо у вас звичайний Інтернет трекер, можна просто додати дозвіл на всі вхідні типи підключень:
``` bash
ufw allow 6969
```
Не забуваємо по аналогії відкрити порт на веб-статистику, якщо така використовується у конфігурації вище!
### Сервіс systemd
Від `root` створюємо новий файл конфігурації `/etc/systemd/system/aquatic.service`. В ньому, на моєму прикладі, вказано тільки запуск сервера UDP, якщо буде потрібно, додам й інші протоколи в рамках спільного сервісу (послідовністю команд групи `exec` або додатковим скриптом `sh`). Ви можете створити для себе окремі юніти типу `aquatic_ws.service`, але на мою думку це не зручно і краще адмініструвати спільною короткою командою.
``` /etc/systemd/system/aquatic.service
# /etc/systemd/system/aquatic.service
[Unit]
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=aquatic
Group=aquatic
ExecStart=/usr/local/bin/aquatic_udp -c /etc/aquatic.toml
StandardOutput=file:/home/aquatic/debug.log
StandardError=file:/home/aquatic/error.log
[Install]
WantedBy=multi-user.target
```
* `systemctl daemon-reload` - оновлюємо конфігурацію systemd
* `systemctl enable aquatic` - автостарт при запуску системи
* `systemctl start aquatic` - запуск
* `systemctl status aquatic` - перевіряємо статус
## Тестування
Після запуску сервісу, перевіряємо наявність активного процесу командою:
``` bash
netstat -tulpn | grep aquatic_udp
```
* на прикладі моєї конфігурації Yggdrasil, має бути щось типу такого: `udp6 0 0 xxx:xxxx:xxxx:xxxx:6969 :::* 123456/aquatic_udp`
Також дивимось журнали:
1. `/home/aquatic/debug.log` - робочі звіти
2. `/home/aquatic/error.log` - помилки
На стороні клієнта, створюємо новий торент (в [qBittorrent](https://www.qbittorrent.org/) це `Tools` -> `Torrent Creator`), вказуємо адресу нашого нового трекеру та перевіряємо оновлення веб-статистики. Так само, можна додати трекер до існуючої роздачі.
В принципі, це все, якщо комусь цікаво - мій сервер розташований тут:
* `udp://[302:68d0:f0d5:b88d::fdb]:6969` - анонси
* http://[302:68d0:f0d5:b88d::fdb] - статистика