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

6 хв. читання
2 тижні тому

Давно збирався підняти 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

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

  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

Таким чином, бінарники будуть доступні у теці /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 - оновлюємо конфігурацію systemd
  • systemctl 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

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

  1. /home/aquatic/debug.log - робочі звіти
  2. /home/aquatic/error.log - помилки

На стороні клієнта, створюємо новий торент (в qBittorrent це Tools -> Torrent Creator), вказуємо адресу нашого нового трекеру та перевіряємо оновлення веб-статистики. Так само, можна додати трекер до існуючої роздачі.

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

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
p.s. 767
Приєднався: 1 рік тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід