mirror of
https://codeberg.org/postscriptum/devzone.org.ua.git
synced 2026-02-19 06:12:39 +00:00
149 lines
No EOL
12 KiB
Markdown
149 lines
No EOL
12 KiB
Markdown
# Встановлення 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://[202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]:6969` - анонси
|
||
* http://[202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]:6969 - статистика |