Une nouvelle implémentation de tracker BitTorrent écrite en Elixir
(github.com/Dahrkael)- ExTracker est un tracker BitTorrent développé en Elixir ; il est encore en cours de développement, mais fonctionne déjà, tout en étant explicitement présenté comme n’étant pas encore prêt pour un usage industriel complet
- Ses objectifs de performance sont les suivants : hautes performances en exploitant tous les cœurs disponibles, fonctionnement basé sur un stockage en mémoire, environ 200 MB de RAM par million de peers, et une architecture exécutable sans configuration séparée
- Côté BEP liés à BitTorrent, il implémente BEP 0, BEP 15, BEP 23, BEP 7, BEP 21, BEP 24, BEP 41, BEP 48 et BEP 52 ; certains éléments comme les Private Torrents ne sont pas encore implémentés ou ne le sont que partiellement
- Il prend en charge HTTPS, la sauvegarde de la base de données sur disque et l’exécution via Docker ; WebTorrent n’est pas pris en charge, tandis que la whitelist/blacklist, la gestion des peers, les metrics et GeoIP sont en implémentation partielle
- Il existe trois modes d’exécution : directement depuis les sources, via un build de release manuel, ou via une image Docker ; dans un conteneur, la configuration peut se faire par variables d’environnement au lieu de
runtime.exs
État et objectifs d’ExTracker
- ExTracker est une implémentation de tracker BitTorrent présentée comme « The Bittorrent Tracker made in Elixir »
- Le projet est en état de Work In Progress
- Il est explicitement indiqué qu’il n’est pas encore prêt pour un usage industriel complet
- Il est néanmoins déjà fonctionnel
- Une instance de test est en cours d’exécution sur
extracker.dahrkael.net:6969, avec les fonctionnalités actuelles activées
Fonctionnalités principales
- Les performances et la simplicité d’exploitation sont mises en avant comme fonctionnalités clés
- Hautes performances : exploite tous les cœurs disponibles
- Utilise un stockage en mémoire
- La consommation mémoire est d’environ 200 MB de RAM pour 1 million de peers
- Zero setup : l’objectif est de fonctionner immédiatement au lancement
État du support des BEP BitTorrent
- Les statuts d’implémentation sont indiqués par
✅ Done,🔰 Partially,🔲 Not Yet,❌ Won't do -
BEP terminés
- BEP 0: The BitTorrent Protocol Specification
- BEP 15: UDP Tracker Protocol
- BEP 23: Tracker Returns Compact Peer Lists
- BEP 7: IPv6 Tracker Extension
- BEP 21: Extension for partial seeds
- BEP 24: Tracker Returns External IP
- BEP 41: UDP Tracker Protocol Extensions
- BEP 48: Tracker Protocol Extension: Scrape
- BEP 52: The BitTorrent Protocol Specification v2
-
BEP non implémentés ou exclus
- BEP 27: Private Torrents n’est pas encore implémenté
- BEP 31: Tracker Failure Retry Extension n’est pas encore implémenté
- BEP 8: Tracker Peer Obfuscation fait partie des éléments qui ne seront pas implémentés
Autres fonctionnalités et limitations
- Fonctionnalités terminées
-
Prise en charge de HTTPS
- Sauvegarde de la base de données sur disque
- Fonctionnalités non prises en charge
- WebTorrent
- Fonctionnalités partiellement implémentées
-
Whitelist/blacklist d’infohash
- gestion des peers : interval enforcement, cleanup, banning, etc.
-
Metrics
- Prise en charge de GeoIP : pour les statistiques et les restrictions sur les peers
- Les propositions de fonctionnalités peuvent être soumises via les Issues
-
Méthodes d’exécution
-
Exécution directe depuis le code source
- Cette méthode nécessite que Erlang et Elixir soient installés sur le système
- Cloner le dépôt
git clone https://github.com/Dahrkael/ExTracker.git && cd ExTracker- Modifier config/runtime.exs si nécessaire
- La commande d’exécution est
MIX_ENV=prod iex -S mix
-
Build de release
- Il n’existe actuellement pas de build de release officiel, mais il est possible de créer et distribuer soi-même une release
- Cloner le dépôt puis compiler selon le système d’exploitation visé
- Linux :
MIX_ENV=prod mix release extracker - Windows :
MIX_ENV=prod mix release extrackerw - Les fichiers de release sont générés dans le dossier
_build/prod/rel/extracker - En cas de transfert vers une autre machine, l’OS et l’architecture doivent être identiques
- Modifier la configuration
releases/{VERSION}/runtime.exssi nécessaire - La commande d’exécution est
bin/extracker start
-
Exécution avec Docker
- L’image Docker fournie peut être exécutée directement
docker run ghcr.io/dahrkael/extracker:latest- Une utilisation avec docker-compose est également possible, avec un fichier compose d’exemple
- Comme il est difficile d’ajuster la configuration en modifiant
runtime.exsà l’intérieur du conteneur, la configuration peut aussi se faire via des variables d’environnement - La liste complète des variables d’environnement est disponible dans le fichier compose d’exemple
Licence
- ExTracker est distribué sous les termes de la Apache License 2.0
- Pour plus de détails, voir le fichier LICENSE du dépôt
1 commentaires
Avis sur Hacker News
Je m’attendais à une conception pensée d’abord pour OTP, mais le code touche directement ETS, ou une Application basée sur ETS, pour presque toutes les opérations, ce qui le fait plutôt ressembler à du procédural ; c’est dommage.
Pour apprendre à concevoir des services avec OTP en Elixir ou dans un autre langage BEAM, les livres "Designing Elixir Systems with OTP" de James Edward Gray et Bruce Tate, et "Functional Web Development with Elixir, OTP, and Phoenix" de Lance Halvorsen sont de bonnes références.
Au final, un tracker torrent ressemble davantage à une base de données spécialisée, et l’objectif prioritaire est de traiter les données le plus vite possible.
Je lirai quand même ces livres.
Aujourd’hui, cela s’applique moins aux télécommunications elles-mêmes qu’aux logiciels ayant les caractéristiques d’applications de communication ; si la moitié de la grandeur d’Erlang vient de sa concurrence et de sa distribution, et l’autre moitié de sa capacité à gérer les erreurs, alors le framework OTP peut être vu comme cette « troisième moitié ».
https://learnyousomeerlang.com/what-is-otp
Pour une configuration à serveur unique, ETS est à 100 % le bon choix, et même si ça ne permettra pas de scale horizontalement, le scale vertical devrait être excellent.
De toute façon, la plupart du temps, c’est probablement du YAGNI.
Il y a sûrement des cas où des GenServer supplémentaires ou
gen_statems’intègrent élégamment, mais pour beaucoup d’usages d’Elixir et de Phoenix, il n’est pas nécessaire de faire des choix d’architecture sophistiqués.Le runtime fait déjà suffisamment de choses sophistiquées à votre place.
ETS est intégré à OTP, donc je ne vois pas pourquoi utiliser ETS ne serait pas « OTP-first ».
Je ne vois pas non plus vraiment le problème avec ETS : ce n’est qu’un stockage en mémoire.
J’ai parcouru le code, et je n’ai pas eu l’impression qu’il soit particulièrement procédural.
Beau travail. Ce serait bien de passer de
IO.putsà Logger, et d’envisager aussi l’ajout d’OTel.[0] https://hexdocs.pm/logger/1.18.4/Logger.html
[1] https://hexdocs.pm/telemetry/readme.html
J’adore vraiment Elixir. Je construis en ce moment un superbe moteur de notifications en Elixir, et c’est vraiment excellent.
Elixir a vraiment besoin d’un meilleur moteur de notifications.
Félicitations pour le lancement. Je serais curieux d’avoir plus de détails sur son comportement par rapport à opentracker.
Les aspects comme les performances m’intéressent beaucoup.
Là où ExTracker brille, c’est quand le nombre de cœurs commence à atteindre deux chiffres.
Cela dit, il reste encore à faire de vrais benchmarks.
Ça a l’air bien. J’irai voir ça plus tard.
Il y a quelques années, j’avais créé un tracker basique en Elixir ; le code est ici : https://github.com/aalin/mr_torrent
Intéressant. Pour en apprendre davantage sur BitTorrent, j’ai construit quelque chose de similaire en TypeScript, puis je l’ai refait en Rust pour apprendre Rust : https://github.com/ckcr4lyf/kiryuu
De mon côté, j’ai simplement utilisé Redis comme base de données. Ce projet semble avoir toute la base de données en mémoire ; je serais curieux de savoir s’il y a eu des décisions de conception intéressantes ou des problèmes rencontrés avec cette approche.
Ma solution avec Redis n’est pas très bonne, je crois, car elle ne randomise pas les pairs lors des announce suivants.
Les données de chaque pair peuvent être lues et écrites simultanément par leurs propres processus, ce qui minimise la contention et la latence.
La seule partie traitée séquentiellement est la création initiale d’un nouveau swarm, mais cela n’arrive pas souvent, donc ce n’est pas gênant.
Malheureusement, il n’y a pas de prise en charge native pour récupérer directement une ligne aléatoire dans une table ; pour l’instant, je récupère donc tout le swarm puis je choisis un sous-ensemble aléatoire : https://github.com/Dahrkael/ExTracker/blob/master/lib/ex_tra...
Ce serait bien d’expliquer ce que sont DHT et PEX. Il est difficile de chercher "tracker PEX".
Il n’y a donc plus besoin d’un emplacement central ni d’un tracker public.
Super. Je me demande si tu aimerais utiliser Elixir comme activité principale.
Je connais aussi Rust et Go. Vous recrutez ?
Je serais curieux de savoir comment ça a commencé, si tu t’es inspiré d’autres projets, combien de temps ça a pris, et dans quelle mesure tu estimes que les fonctionnalités marchent par rapport à quelque chose comme qBittorrent.
J’ai aussi parcouru le code d’autres trackers, mais ils étaient pour la plupart soit excessivement complexes, soit trop simples, donc ils ne m’ont pas vraiment aidé.
Jusqu’ici, c’est le résultat de 3 mois de retardement du coucher par procrastination de vengeance.
Ce n’est pas un client comme qBittorrent, mais j’ai des idées pour un futur projet de client orienté seedbox.
Je l’ai essayé, mais je n’ai pas réussi à faire fonctionner HTTPS.
Dans la console,
04:43:20.160 [warning] invalid 'event' parameter: size: 6 value: "paused"s’affiche en boucle, mais ça semble fonctionner.J’aurais aussi aimé voir les statistiques HTTP, même si UDP me va aussi. Cela dit, j’ai désactivé UDP de mon côté.
"paused"fait partie de BEP 21.Il est envoyé quand le client informe le tracker qu’il n’est pas encore en état terminé, mais qu’il ne téléchargera plus.
Par exemple, lorsque l’utilisateur ne veut qu’une partie des fichiers du torrent.
D’après le README du projet, la prise en charge de BEP 21 n’est pas implémentée.
Comme j’utilise une bibliothèque tierce pour le serveur web, je dois encore trouver la bonne façon de procéder.
Pour utiliser HTTPS, il faut fournir à
:https_keyfileun chemin vers un certificat valide, mais pour l’instant, si HTTPS est nécessaire, je recommande de mettre Caddy ou Nginx devant le tracker.L’intégration de certbot est également prévue, mais comme la plupart des pairs torrent utilisent UDP, ce n’est pas une priorité élevée.