Elixir में लिखा गया नया BitTorrent ट्रैकर implementation
(github.com/Dahrkael)- ExTracker Elixir से बना BitTorrent tracker है, जिसके बारे में स्पष्ट किया गया है कि यह अभी work in progress है, लेकिन काम करता है और पूरे industrial use के लिए अभी तैयार नहीं है
- Performance लक्ष्य हैं उपलब्ध सभी cores का इस्तेमाल करने वाला high performance, in-memory storage आधारित operation, हर 10 लाख peer पर लगभग 200MB RAM उपयोग, और बिना अलग setup के चलने वाली संरचना
- BitTorrent से जुड़े BEP में BEP 0, BEP 15, BEP 23, BEP 7, BEP 21, BEP 24, BEP 41, BEP 48, BEP 52 लागू किए गए हैं, जबकि Private Torrents आदि कुछ features अभी implement नहीं हुए हैं या partial implementation की स्थिति में हैं
- HTTPS, disk database backup, Docker execution का support है; WebTorrent support नहीं है, और whitelist/blacklist, peer management, metrics, GeoIP partial implementation स्थिति में हैं
- चलाने के तीन तरीके हैं: source से सीधे run करना, खुद release build करना, और Docker image चलाना; container में
runtime.exsके बजाय environment variables से configuration किया जा सकता है
ExTracker की स्थिति और लक्ष्य
- ExTracker एक BitTorrent tracker implementation है, जिसे “The Bittorrent Tracker made in Elixir” के रूप में पेश किया गया है
- Project Work In Progress स्थिति में है
- स्पष्ट किया गया है कि यह पूरे industrial use के लिए अभी तैयार नहीं है
- फिलहाल इसे चलाया जा सकता है
- Test instance
extracker.dahrkael.net:6969पर चल रहा है, और वर्तमान features active हैं
मुख्य features
- Performance और operational convenience को core features के रूप में रखा गया है
- High performance: उपलब्ध सभी cores का इस्तेमाल करता है
- In-memory storage का इस्तेमाल करता है
- Memory usage हर 10 लाख peers पर लगभग 200MB RAM है
- Zero setup: लक्ष्य है कि run करते ही यह तुरंत काम करे
BitTorrent BEP support की स्थिति
- Implementation status को
✅ Done,🔰 Partially,🔲 Not Yet,❌ Won't doमें बांटा गया है -
पूरे हो चुके BEP
- 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
-
अभी implement न हुए या बाहर रखे गए BEP
- BEP 27: Private Torrents अभी implement नहीं हुआ है
- BEP 31: Tracker Failure Retry Extension अभी implement नहीं हुआ है
- BEP 8: Tracker Peer Obfuscation implement नहीं किया जाने वाला item है
अन्य features और सीमाएं
- पूरे हो चुके features
-
HTTPS support
- Disk database backup
- Supported नहीं features
- WebTorrent
- Partial implementation वाले features
-
Infohash whitelist/blacklist
- Peer management: interval enforcement, cleanup, banning आदि
-
Metrics
- GeoIP support: statistics और peer restriction के लिए
- Feature suggestions Issues में लिए जा सकते हैं
-
चलाने का तरीका
-
Source code से सीधे run करना
- इस तरीके के लिए system में Erlang और Elixir install होना चाहिए
- Repository clone करें
git clone https://github.com/Dahrkael/ExTracker.git && cd ExTracker- जरूरत हो तो config/runtime.exs को modify करें
- Run command
MIX_ENV=prod iex -S mixहै
-
Release build
- अभी कोई official release build नहीं है, और आप खुद release बनाकर deploy कर सकते हैं
- Repository clone करने के बाद operating system के अनुसार build करें
- Linux:
MIX_ENV=prod mix release extracker - Windows:
MIX_ENV=prod mix release extrackerw - Release files
_build/prod/rel/extrackerfolder में बनती हैं - दूसरी machine पर ले जाने पर OS और architecture समान होने चाहिए
- जरूरत हो तो
releases/{VERSION}/runtime.exsconfiguration modify करें - Run command
bin/extracker startहै
-
Docker execution
- उपलब्ध Docker image को सीधे run किया जा सकता है
docker run ghcr.io/dahrkael/extracker:latest- इसे docker-compose के साथ भी इस्तेमाल किया जा सकता है और example compose file उपलब्ध है
- Container के अंदर
runtime.exsmodify करके settings adjust करना मुश्किल होता है, इसलिए environment variables से भी configure किया जा सकता है - Environment variables की पूरी list example compose file में देखी जा सकती है
License
- ExTracker Apache License 2.0 की शर्तों के तहत distributed है
- अधिक जानकारी के लिए repository की LICENSE file देखें
1 टिप्पणियां
Hacker News की राय
मुझे OTP-first design की उम्मीद थी, लेकिन कोड लगभग हर काम में सीधे ETS या ETS-आधारित Application को छूता है, इसलिए यह procedure-oriented जैसा लगा—थोड़ा अफसोस हुआ
Elixir या दूसरी BEAM भाषाओं में OTP के साथ services design करना सीखना हो तो James Edward Gray और Bruce Tate की "Designing Elixir Systems with OTP", और Lance Halvorsen की "Functional Web Development with Elixir, OTP, and Phoenix" देखना अच्छा रहेगा
आखिरकार torrent tracker एक specialized database जैसा ही है, और data को जितनी जल्दी हो सके process करना ही सबसे बड़ा लक्ष्य है
फिर भी किताबें एक बार पढ़कर देखूंगा
अब यह telecom itself से ज़्यादा ऐसे software जैसा है जिसकी प्रकृति communication applications जैसी होती है; और अगर Erlang की महानता का आधा हिस्सा concurrency और distribution है, और बाकी आधा error handling क्षमता है, तो OTP framework को उसका “तीसरा आधा” कहा जा सकता है
https://learnyousomeerlang.com/what-is-otp
single-server setup हो तो ETS 100% सही choice है, और horizontal scaling नहीं होगी, लेकिन vertical scaling बहुत अच्छी होगी
वैसे भी इनमें से ज़्यादातर शायद YAGNI होगा
कुछ मामलों में extra GenServer या
gen_statemशानदार fit हो सकते हैं, लेकिन Elixir और Phoenix के कई उपयोगों में fancy architecture choices तक जाने की जरूरत नहीं होतीक्योंकि runtime पहले से ही आपके लिए काफी fancy काम कर देता है
ETS तो OTP में built-in है, तो ETS इस्तेमाल करना OTP-first क्यों नहीं है, यह समझ नहीं आ रहा
ETS इस्तेमाल करने में समस्या क्या है, यह भी ठीक से समझ नहीं आता; यह तो बस in-memory storage है
मैंने code सरसरी तौर पर देखा, लेकिन यह procedure-oriented style के करीब लगा नहीं
अच्छा बनाया है।
IO.putsके बजाय Logger पर shift करना, और OTel जोड़ने पर भी विचार करना अच्छा रहेगा[0] https://hexdocs.pm/logger/1.18.4/Logger.html
[1] https://hexdocs.pm/telemetry/readme.html
Elixir वाकई बहुत अच्छा है। अभी Elixir में एक बढ़िया notification engine बना रहा हूं, और यह सच में शानदार है
Elixir को सच में बेहतर notification engine की जरूरत है
launch के लिए बधाई। opentracker की तुलना में यह कैसे काम करता है, अगर detail में बता सकें तो अच्छा होगा
performance जैसी चीज़ों में मेरी काफी रुचि है
ExTracker तब चमकता है जब core count दो अंकों में पहुंचने लगता है
हालांकि proper benchmark अभी करना बाकी है
अच्छा लग रहा है। बाद में देखूंगा
कुछ साल पहले मैंने Elixir में एक basic tracker बनाया था, code यहां है: https://github.com/aalin/mr_torrent
दिलचस्प। BitTorrent को और सीखने के लिए मैंने TypeScript में कुछ ऐसा ही बनाया था, और Rust सीखने के लिए उसे Rust में फिर से बनाया: https://github.com/ckcr4lyf/kiryuu
हालांकि मैंने database के लिए बस Redis इस्तेमाल किया था। इस project में लगता है पूरा database memory में है; ऐसा करते समय कोई interesting design decision लिया या कोई problem आई, यह जानना चाहूंगा
मेरा Redis solution शायद subsequent announce में peers को randomize नहीं करता, इसलिए इतना अच्छा नहीं है
हर peer का data अपने-अपने process में concurrent तरीके से read/write किया जा सकता है, जिससे contention और latency न्यूनतम रहती है
sequentially process होने वाला इकलौता हिस्सा तब है जब नया swarm पहली बार बनता है, और वह अक्सर नहीं होता, इसलिए ठीक है
अफसोस कि table से सीधे random rows लाने का native support नहीं है, इसलिए अभी पूरा swarm लाकर फिर random subset चुनता हूं: https://github.com/Dahrkael/ExTracker/blob/master/lib/ex_tra...
अच्छा होगा अगर कोई समझा सके कि DHT और PEX क्या हैं। "tracker PEX" search करना मुश्किल है
इसलिए अब central location या public tracker की जरूरत नहीं रहती
बढ़िया। क्या आप Elixir को main job में इस्तेमाल करना चाहेंगे, जानना चाहूंगा
Rust और Go भी जानता हूं। hiring कर रहे हैं?
जानना चाहूंगा कि आपने कैसे शुरू किया, क्या दूसरे projects को reference किया, कितना समय लगा, और qBittorrent जैसी चीज़ों की तुलना में कितनी functionality काम करती है
दूसरे trackers का code भी देखा, लेकिन वे आम तौर पर या तो जरूरत से ज़्यादा complex थे या बहुत simple, इसलिए ज्यादा मदद नहीं मिली
अब तक यह 3 महीनों की revenge bedtime procrastination का नतीजा है
यह qBittorrent जैसा client नहीं है, लेकिन future में seedbox-oriented client project का idea है
इस्तेमाल करके देखा, लेकिन HTTPS चलवा नहीं पाया
console में
04:43:20.160 [warning] invalid 'event' parameter: size: 6 value: "paused"लगातार दिखता है, लेकिन लगता है काम कर रहा हैHTTP stats भी देखना चाहता था, लेकिन UDP भी ठीक है। हालांकि मैंने UDP बंद रखा है
"paused"event BEP 21 का हिस्सा हैclient इसे tracker को बताने के लिए भेजता है कि वह अभी completed state में नहीं है, लेकिन अब download नहीं करेगा
जैसे जब user torrent की सिर्फ कुछ files चाहता हो
project README देखें तो BEP 21 support implement नहीं है
webserver के लिए third-party library इस्तेमाल कर रहा हूं, इसलिए सही तरीका अभी समझना होगा
HTTPS इस्तेमाल करने के लिए
:https_keyfileमें valid certificate path देना होगा, लेकिन फिलहाल अगर HTTPS चाहिए तो tracker के आगे Caddy या Nginx रखने की सलाह देता हूंcertbot integration का भी plan है, लेकिन ज्यादातर torrent peers UDP इस्तेमाल करते हैं, इसलिए priority high नहीं है