Neue BitTorrent-Tracker-Implementierung in Elixir geschrieben
(github.com/Dahrkael)- ExTracker ist ein in Elixir entwickelter BitTorrent-Tracker, der sich derzeit noch in Arbeit befindet, aber bereits funktioniert; ausdrücklich wird darauf hingewiesen, dass er für den vollständigen industriellen Einsatz noch nicht bereit ist
- Die Leistungsziele sind hohe Performance durch Nutzung aller verfügbaren Kerne, Betrieb auf Basis eines In-Memory-Speichers, etwa 200 MB RAM pro 1 Million Peers und eine ohne zusätzliche Konfiguration sofort lauffähige Architektur
- Bei den BitTorrent-bezogenen BEPs wurden BEP 0, BEP 15, BEP 23, BEP 7, BEP 21, BEP 24, BEP 41, BEP 48 und BEP 52 implementiert; einige Punkte wie Private Torrents sind noch nicht oder nur teilweise umgesetzt
- Unterstützt werden HTTPS, Backup der Festplatten-Datenbank und der Betrieb mit Docker; WebTorrent wird nicht unterstützt, und Whitelist/Blacklist, Peer-Verwaltung, Metrics sowie GeoIP sind teilweise implementiert
- Es gibt drei Ausführungswege: direkt aus dem Quellcode, als selbst gebautes Release oder über ein Docker-Image; im Container kann statt
runtime.exsauch über Umgebungsvariablen konfiguriert werden
Status und Ziele von ExTracker
- ExTracker wird als „The Bittorrent Tracker made in Elixir“ vorgestellt und ist eine BitTorrent-Tracker-Implementierung
- Das Projekt befindet sich im Status Work In Progress
- Es wird ausdrücklich darauf hingewiesen, dass es für den vollständigen industriellen Einsatz noch nicht bereit ist
- Der Betrieb ist derzeit jedoch möglich
- Unter
extracker.dahrkael.net:6969läuft eine Testinstanz, bei der die aktuellen Funktionen aktiviert sind
Hauptfunktionen
- Performance und einfache Bedienung werden als Kernfunktionen hervorgehoben
- Hohe Performance: nutzt alle verfügbaren Kerne
- Verwendet In-Memory-Speicher
- Der Speicherverbrauch liegt bei etwa 200 MB RAM pro 1 Million Peers
- Zero setup: Ziel ist ein sofort lauffähiger Betrieb ohne weitere Einrichtung
Unterstützungsstatus der BitTorrent-BEPs
- Die Kennzeichnung des Implementierungsstatus ist in
✅ Done,🔰 Partially,🔲 Not Yet,❌ Won't dounterteilt -
Abgeschlossene BEPs
- 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
-
Nicht implementierte oder ausgeschlossene BEPs
- BEP 27: Private Torrents ist noch nicht implementiert
- BEP 31: Tracker Failure Retry Extension ist noch nicht implementiert
- BEP 8: Tracker Peer Obfuscation ist als nicht vorgesehene Funktion markiert
Weitere Funktionen und Einschränkungen
- Abgeschlossene Funktionen
-
HTTPS-Unterstützung
- Backup der Festplatten-Datenbank
- Nicht unterstützte Funktion
- WebTorrent
- Teilweise implementierte Funktionen
-
Infohash-Whitelist/Blacklist
- Peer-Verwaltung: interval enforcement, cleanup, banning usw.
-
Metrics
- GeoIP-Unterstützung: für Statistiken und Peer-Beschränkungen
- Funktionsvorschläge können über Issues eingereicht werden
-
Ausführung
-
Direkt aus dem Quellcode ausführen
- Für diese Methode müssen Erlang und Elixir auf dem System installiert sein
- Das Repository klonen
git clone https://github.com/Dahrkael/ExTracker.git && cd ExTracker- Bei Bedarf config/runtime.exs anpassen
- Der Startbefehl lautet
MIX_ENV=prod iex -S mix
-
Release-Build
- Derzeit gibt es kein offizielles Release-Build; stattdessen kann man selbst ein Release erstellen und verteilen
- Nach dem Klonen des Repositorys passend zum Betriebssystem bauen
- Linux:
MIX_ENV=prod mix release extracker - Windows:
MIX_ENV=prod mix release extrackerw - Die Release-Dateien werden im Ordner
_build/prod/rel/extrackererzeugt - Beim Verschieben auf einen anderen Rechner müssen Betriebssystem und Architektur identisch sein
- Bei Bedarf die Konfiguration in
releases/{VERSION}/runtime.exsanpassen - Der Startbefehl lautet
bin/extracker start
-
Ausführung mit Docker
- Das bereitgestellte Docker-Image kann direkt ausgeführt werden
docker run ghcr.io/dahrkael/extracker:latest- Auch mit docker-compose nutzbar; eine Beispiel-Compose-Datei wird bereitgestellt
- Da sich
runtime.exsinnerhalb des Containers nur schwer zur Konfiguration anpassen lässt, kann auch über Umgebungsvariablen konfiguriert werden - Die vollständige Liste der Umgebungsvariablen ist in der Beispiel-Compose-Datei zu finden
Lizenz
- ExTracker wird unter den Bedingungen der Apache License 2.0 veröffentlicht
- Weitere Details finden sich in der LICENSE-Datei des Repositorys
1 Kommentare
Meinungen auf Hacker News
Ich hatte ein OTP-first-Design erwartet, aber der Code greift bei fast allem direkt auf ETS oder eine ETS-basierte Application zu und wirkt dadurch eher prozedural, was ich schade finde.
Wenn man lernen möchte, wie man Services in Elixir oder anderen BEAM-Sprachen mit OTP entwirft, sind „Designing Elixir Systems with OTP“ von James Edward Gray und Bruce Tate sowie „Functional Web Development with Elixir, OTP, and Phoenix“ von Lance Halvorsen empfehlenswert.
Letztlich ist ein Torrent-Tracker eher eine spezialisierte Datenbank, und das oberste Ziel ist, Daten so schnell wie möglich zu verarbeiten.
Die Bücher werde ich mir trotzdem einmal ansehen.
Heute geht es weniger um Telekommunikation selbst, sondern eher um Software mit Eigenschaften von Kommunikationsanwendungen. Wenn die eine Hälfte der Großartigkeit von Erlang in Nebenläufigkeit und Verteilung liegt und die andere Hälfte in der Fehlerbehandlung, dann ist das OTP-Framework gewissermaßen diese „dritte Hälfte“.
https://learnyousomeerlang.com/what-is-otp
Für eine Einzelserver-Konfiguration ist ETS zu 100 % die richtige Wahl; horizontal wird es zwar nicht skalieren, vertikal aber enorm gut.
Wahrscheinlich ist das meiste davon ohnehin YAGNI.
Es gibt sicher Fälle, in denen zusätzliche GenServer oder
gen_statemelegant passen, aber für viele Einsatzbereiche von Elixir und Phoenix braucht man keine spektakulären Architekturentscheidungen.Die Runtime übernimmt bereits genug spektakuläre Dinge.
ETS ist in OTP eingebaut, daher verstehe ich nicht, warum die Verwendung von ETS nicht OTP-first sein soll.
Ich sehe auch nicht wirklich, was an ETS problematisch sein soll; es ist einfach ein In-Memory-Speicher.
Ich habe den Code überflogen, aber er kam mir nicht besonders prozedural vor.
Gut gemacht. Es wäre gut, von
IO.putsauf Logger umzusteigen und auch OTel in Betracht zu ziehen.[0] https://hexdocs.pm/logger/1.18.4/Logger.html
[1] https://hexdocs.pm/telemetry/readme.html
Elixir ist wirklich großartig. Ich baue gerade eine coole Benachrichtigungs-Engine in Elixir, und es ist wirklich hervorragend.
Elixir braucht wirklich eine bessere Benachrichtigungs-Engine.
Glückwunsch zum Launch. Mich würde interessieren, ob du genauer sagen kannst, wie es im Vergleich zu opentracker funktioniert.
Besonders Performance-Aspekte interessieren mich.
Der Punkt, an dem ExTracker glänzt, ist, wenn die Zahl der Kerne in den zweistelligen Bereich steigt.
Richtige Benchmarks muss ich allerdings noch machen.
Sieht gut aus. Werde ich mir später ansehen.
Vor ein paar Jahren habe ich einmal einen einfachen Tracker in Elixir gebaut; der Code ist hier: https://github.com/aalin/mr_torrent
Interessant. Um mehr über BitTorrent zu lernen, habe ich etwas Ähnliches in TypeScript gebaut und es dann, um Rust zu lernen, noch einmal in Rust geschrieben: https://github.com/ckcr4lyf/kiryuu
Allerdings habe ich als Datenbank einfach Redis verwendet. Bei diesem Projekt scheint die gesamte Datenbank im Speicher zu liegen; mich würde interessieren, ob es dabei interessante Designentscheidungen oder Probleme gab.
Meine Redis-Lösung ist nicht besonders gut, weil sie bei späteren Announces die Peers offenbar nicht zufällig durchmischt.
Die Daten jedes Peers können gleichzeitig in ihren jeweiligen Prozessen gelesen und geschrieben werden, wodurch Contention und Latenz minimiert werden.
Der einzige sequenziell verarbeitete Teil ist die erstmalige Erstellung eines neuen Swarms, was aber nicht häufig passiert und daher in Ordnung ist.
Leider gibt es keine native Unterstützung, um direkt eine zufällige Zeile aus der Tabelle zu holen; derzeit hole ich daher den gesamten Swarm und wähle daraus eine zufällige Teilmenge: https://github.com/Dahrkael/ExTracker/blob/master/lib/ex_tra...
Es wäre gut, wenn jemand erklären könnte, was DHT und PEX sind. Nach „tracker PEX“ zu suchen ist schwierig.
Dadurch braucht man keine zentrale Stelle und keinen öffentlichen Tracker mehr.
Cool. Mich würde interessieren, ob du Elixir hauptberuflich nutzen möchtest.
Rust und Go kenne ich auch. Stellt ihr ein?
Mich würde interessieren, wie du angefangen hast, ob du andere Projekte als Referenz genutzt hast, wie lange es gedauert hat und wie viel der Funktionalität im Vergleich zu etwas wie qBittorrent deiner Einschätzung nach funktioniert.
Ich habe mir auch Code anderer Tracker angesehen, aber der war meist entweder übermäßig komplex oder zu simpel und daher nicht sehr hilfreich.
Bisher ist das Ergebnis von 3 Monaten Rache-Schlafaufschub.
Das hier ist kein Client wie qBittorrent, aber ich habe eine Idee für ein künftiges seedbox-orientiertes Client-Projekt.
Ich habe es ausprobiert, konnte HTTPS aber nicht zum Laufen bringen.
In der Konsole erscheint ständig
04:43:20.160 [warning] invalid 'event' parameter: size: 6 value: "paused", aber es scheint zu funktionieren.Ich hätte auch gern HTTP-Statistiken gesehen, aber UDP ist auch in Ordnung. Allerdings habe ich UDP deaktiviert.
"paused"ist Teil von BEP 21.Es wird gesendet, wenn ein Client dem Tracker mitteilt, dass er noch nicht fertig ist, aber nicht weiter herunterladen wird.
Zum Beispiel, wenn ein Nutzer nur einige Dateien eines Torrents haben möchte.
Laut README des Projekts ist Unterstützung für BEP 21 noch nicht implementiert.
Da ich für den Webserver eine Third-Party-Library verwende, muss ich noch herausfinden, wie es richtig geht.
Für HTTPS muss bei
:https_keyfileein gültiger Zertifikatspfad angegeben werden; aktuell empfehle ich aber, Caddy oder Nginx vor den Tracker zu setzen, wenn HTTPS benötigt wird.Eine certbot-Integration ist ebenfalls geplant, hat aber keine hohe Priorität, da die meisten Torrent-Peers UDP verwenden.