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