Встановлення BitTorrent трекера Aquatic в Linux

Давно збирався підняти BitTorrent трекер відкритого типу для мережі Yggdrasil.

Детальніше про мережу Yggdrasil читайте тут:

Yggdrasil - мережа з децентралізованою маршрутизацією

Вже існує відомий сервер з 15-річною історією розробки OpenTracker:

Але останнім часом, я надаю перевагу більш сучасній мові Rust, тим паче що потім планую реалізувати цією мовою додатковий веб-агрегатор на базі кешованих трекером інфо-хешів у зв'язці з бібліотекою rqbit:

Трохи полиставши результати пошуку на GitHub, віднайшов сервер Aquatic:

Він також підтримує IPv4/IPv6, протоколи UDP, HTTP, WS і так само зберігає дані в оперативній пам'яті, не зношуючи своєю роботою носій SSD. Нижче опишу покрокову інструкцію збірки, встановлення та налаштування для мережі Yggdrasil, можливо даний матеріал буде цікавий початківцям, зокрема - для використання в класичній мережі Інтернет.

Підготовка системи

Створення системного користувача

Як і для інших програм Linux, що збираються з початкового коду і запускаються через systemd, я створюю окремого системного користувача з домашньою текою, для ізоляції прав доступу:

useradd -m aquatic

Встановлення системних залежностей

Програмне середовище Rust у мене розгорнуте в профілі root, куди я клоную репозиторії і засобами профілю якого проводжу збірку всіх бінарних файлів.

Якщо в системі не встановлена інфраструктура Rust (rustc, cargo та інше) тоді вам сюди:

Стандартна інсталяція залежностей Rust вимагає близько 2 Гб дискового простору. Якщо ви, як і я, користуєтесь VPS - встановіть лише необхідні для роботи компілятора пакунки.

Для цього при першому запуску команди:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Це пропустить встановлення зайвих на сервері пакунків, що зменшить розмір до ~600 Мб.

У випадку використання "minimal", для збірки також важливо до-встановити глобальні залежності:

apt install clang libclang-dev

Якщо rustup вже встановлено, також переконаймось, що використовуються актуальні версії:

rustup update
cargo update

Встановлення Aquatic

Виконуємо наступні кроки у послідовності:

su root && cd ~
git clone https://github.com/greatest-ape/aquatic.git && cd aquatic
cargo build --release -p aquatic_udp

Таким чином, бінарники будуть доступні у теці "/root/aquatic/target/release/*". Оскільки ми будемо використовувати сервіс systemd, де відсутні змінні середовища, важливо скопіювати (або залінкувати) необхідні пакети в системне розташування, де вони матимуть відповідні права на виконання:

install /root/aquatic/target/release/aquatic_udp /usr/local/bin/aquatic_udp

Файл конфігурації

Сервер Aquatic можна запускати зі стандартним набором опцій, без аргументів (отримати поточні налаштування для конфігурації сервера можна командою:

aquatic_udp -p

Оскільки мій сервер буде працювати в режимі Yggdrasil-only, як скопіюю цей вивід у спільний системний файл конфігурації командою:

aquatic_udp -p > /etc/aquatic.toml

Стандартна конфігурація передбачає запуск на всіх інтерфейсах і порті 3000, я ж змінюю на окрему адресу підмережі Yggdrasil і більш типовий для відкритих UDP трекерів порт 6969. Детальніше про те, як створити адресу підмережі Yggdrasil - читайте тут:

# вимикаю IPv4, так як цей інтерфейс в Yggdrasil не обслуговується
use_ipv4 = false
# "[xxx:xxxx:xxxx:xxxx::fdb]" - актуальна адреса IPv6,
# "fdb" - це імпровізований постфікс у діапазоні A-f0-9 типу "file database"
address_ipv6 = "[xxx:xxxx:xxxx:xxxx::fdb]:6969"

Якщо потрібен вивід публічної веб-статистики, вказуємо також:

write_html_to_file = true
# шлях може бути іншим
# * у цьому випадку створіть каталог командою `mkdir /var/www/aquatic`
# * надайте відповідні права `chown aquatic:aquatic /var/www/aquatic`
html_file_path = "/var/www/aquatic/index.html"

В конфігурації хосту nginx додаємо наступне (не забуваємо також відкрити 80 порт):

server {
    # актуальна адреса IPv6
    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;
    }
}

Не забуваємо застосувати зміни:

nginx -t
systemctl reload nginx

Інші налаштування лишаю стандартними.

Налаштування Firewall

В системах Debian, в режимі UDP / Yggdrasil-only (трекер прийматиме та віддаватиме виключно внутрішньомережеві адреси пірів) я використовую наступне перманентне правило ufw для iptables:

ufw allow from 0200::/7 to xxx:xxxx:xxxx:xxxx::fdb port 6969 proto udp

Якщо у вас звичайний Інтернет трекер, можна просто додати дозвіл на всі вхідні типи підключень:

ufw allow 6969

Не забуваємо по аналогії відкрити порт на веб-статистику, якщо така використовується у конфігурації вище!

Сервіс systemd

Від root створюємо новий файл конфігурації:

nano /etc/systemd/system/aquatic.service

У цьому файлі, на моєму прикладі, вказано тільки запуск сервера UDP, якщо буде потрібно, додам й інші протоколи в рамках спільного сервісу (послідовністю команд групи "exec" або додатковим скриптом). Ви можете створити для себе окремі юніти типу "aquatic_ws.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
systemctl enable aquatic
systemctl start aquatic

Тестування

Після запуску сервісу, перевіряємо наявність активного процесу:

netstat -tulpn | grep aquatic_udp

На прикладі моєї конфігурації Yggdrasil, має бути щось типу такого:

udp6 0 0 xxx:xxxx:xxxx:xxxx:6969 :::* 123456/aquatic_udp

Також дивимось журнали:

На стороні клієнта, створюємо новий торент (в qBittorrent це "Tools" -> "Torrent Creator")

і вказуємо адресу нашого нового трекеру, після чого перевіряємо оновлення веб-статистики;

так само, можна додати трекер до наявної роздачі.

В принципі, це все, якщо комусь цікаво - мій сервер розташований тут:

udp://[202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]:6969

Веб-статистика:

Також, на разі працюю над агрегатором Aquatic для підписок на оновлення трекеру в різних форматах:

aquatic-crawler (Rust)