Давно збирався підняти BitTorrent трекер відкритого типу (обмін файлами без реєстрації) для мережі Yggdrasil. Для цієї мети існує відомий сервер з 15-річною історією розробки OpenTracker, реалізований мовою C, але останнім часом, я надаю перевагу більш сучасній мові 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
, оберіть пункт 2) Customize installation
і замість стандартного Profile (which tools and data to install)? (minimal/default/complete) [default]
вкажіть minimal
. Це пропустить встановлення зайвих на сервері пакунків, що зменшить розмір до ~600 Мб. У випадку використання minimal
, для збірки Aquatic важливо до-встановити деякі глобальні залежності:
apt install clang libclang-dev
- при інсталяції в
rustup
в режиміdefault
цей крок можна пропустити
Якщо rustup
вже встановлено, також переконаймось, що використовуються актуальні версії:
rustup update
cargo update
Встановлення Aquatic
Виконуємо наступні кроки у послідовності:
su root && cd ~
- логінимось (якщо досі неroot
) і переходимо в домашню текуgit clone https://github.com/greatest-ape/aquatic.git && cd aquatic
- клонуємо вихідний код і переходимо до теки проектуcargo build --release -p aquatic_udp
- збираємо оптимізовані бінарні пакети aquatic_udp
Таким чином, бінарники будуть доступні у теці /root/aquatic/target/release/*
. Оскільки ми будемо використовувати сервіс systemd
, де відсутні змінні середовища, важливо скопіювати (або залінкувати) необхідні пакети в системне розташування, де вони матимуть відповідні права на виконання:
install /root/aquatic/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, як скопіюю цей вивід у спільний системний файл конфігурації командою:
aquatic_udp -p > /etc/aquatic.toml
- приклад
systemd
нижче буде використовувати цей модифікований файл
Стандартна конфігурація передбачає запуск на всіх інтерфейсах і порті 3000
, я ж змінюю на окрему адресу підмережі Yggdrasil і більш типовий для відкритих UDP трекерів порт 6969
(детальніше про те, як створити адресу підмережі Yggdrasil - читайте тут):
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
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
:
ufw allow from 0200::/7 to 0200::/7 port 6969 proto udp
- якщо в конфігурації вказано інший порт, використовуйте його замість
6969
Якщо у вас звичайний Інтернет трекер, можна просто додати дозвіл на всі вхідні типи підключень:
ufw allow 6969
Не забуваємо по аналогії відкрити порт на веб-статистику, якщо така використовується у конфігурації вище!
Сервіс systemd
Від root
створюємо новий файл конфігурації /etc/systemd/system/aquatic.service
. В ньому, на моєму прикладі, вказано тільки запуск сервера UDP, якщо буде потрібно, додам й інші протоколи в рамках спільного сервісу (послідовністю команд групи exec
або додатковим скриптом sh
). Ви можете створити для себе окремі юніти типу aquatic_ws.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
- оновлюємо конфігурацію systemdsystemctl enable aquatic
- автостарт при запуску системиsystemctl start aquatic
- запускsystemctl status aquatic
- перевіряємо статус
Тестування
Після запуску сервісу, перевіряємо наявність активного процесу командою:
netstat -tulpn | grep aquatic_udp
- на прикладі моєї конфігурації Yggdrasil, має бути щось типу такого:
udp6 0 0 xxx:xxxx:xxxx:xxxx:6969 :::* 123456/aquatic_udp
Також дивимось журнали:
/home/aquatic/debug.log
- робочі звіти/home/aquatic/error.log
- помилки
На стороні клієнта, створюємо новий торент (в qBittorrent це Tools
-> Torrent Creator
), вказуємо адресу нашого нового трекеру та перевіряємо оновлення веб-статистики. Так само, можна додати трекер до існуючої роздачі.
В принципі, це все, якщо комусь цікаво - мій сервер розташований тут:
udp://[302:68d0:f0d5:b88d::fdb]:6969
- анонси- http://[302:68d0:f0d5:b88d::fdb] - статистика
Ще немає коментарів