devzone.org.ua/post/vstanovlennia-bittorrent-trekera-aquatic-v-linux.md
2025-11-01 14:28:20 +02:00

149 lines
No EOL
12 KiB
Markdown
Raw 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.

# Встановлення 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] - статистика