Elixir ile yazılmış yeni bir BitTorrent tracker uygulaması
(github.com/Dahrkael)- ExTracker, Elixir ile yapılmış bir BitTorrent tracker’dır; şu anda geliştirme aşamasında olsa da çalıştığı ve henüz tam endüstriyel kullanım için hazır olmadığı belirtiliyor
- Performans hedefleri: kullanılabilir tüm çekirdekleri kullanan yüksek performans, bellek içi depolama tabanlı çalışma, 1 milyon peer başına yaklaşık 200 MB RAM kullanımı ve ek kurulum gerektirmeden çalışabilen bir yapı
- BitTorrent ile ilgili BEP’lerden BEP 0, BEP 15, BEP 23, BEP 7, BEP 21, BEP 24, BEP 41, BEP 48 ve BEP 52 uygulanmış; Private Torrents gibi bazıları ise uygulanmamış ya da kısmen uygulanmış durumda
- HTTPS, disk veritabanı yedeklemesi ve Docker ile çalıştırmayı destekliyor; WebTorrent’i desteklemiyor, whitelist/blacklist, peer yönetimi, metrics ve GeoIP ise kısmen uygulanmış durumda
- Çalıştırma yöntemi olarak kaynak koddan doğrudan çalıştırma, release’i doğrudan derleme ve Docker imajı çalıştırma olmak üzere üç seçenek var; container’da
runtime.exsyerine ortam değişkenleri ile yapılandırma yapılabiliyor
ExTracker’ın durumu ve hedefleri
- ExTracker, “Elixir ile yapılmış BitTorrent Tracker” olarak tanıtılan bir BitTorrent tracker uygulamasıdır
- Proje Work In Progress durumundadır
- Henüz tam endüstriyel kullanım için hazır olmadığı belirtiliyor
- Şu anda çalışabilir durumda
extracker.dahrkael.net:6969üzerinde bir test instance’ı çalışıyor ve mevcut işlevler etkin durumda
Başlıca özellikler
- Performans ve operasyon kolaylığı temel özellikler olarak sunuluyor
- Yüksek performans: Kullanılabilir tüm çekirdekleri kullanır
- Bellek içi depolama kullanır
- Bellek kullanımı 1 milyon peer başına yaklaşık 200 MB RAM’dir
- Zero setup: Çalıştırıldığında hemen çalışır hâle gelmesi hedeflenir
BitTorrent BEP destek durumu
- Uygulama durumu gösterimi
✅ Done,🔰 Partially,🔲 Not Yet,❌ Won't doolarak ayrılır -
Tamamlanan BEP’ler
- 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
-
Uygulanmamış veya kapsam dışı bırakılan BEP’ler
- BEP 27: Private Torrents henüz uygulanmamış
- BEP 31: Tracker Failure Retry Extension henüz uygulanmamış
- BEP 8: Tracker Peer Obfuscation uygulanmayacak bir madde
Diğer özellikler ve sınırlamalar
- Tamamlanan özellikler
-
HTTPS desteği
- Disk veritabanı yedeklemesi
- Desteklenmeyen özellikler
- WebTorrent
- Kısmen uygulanmış özellikler
-
Infohash whitelist/blacklist
- Peer yönetimi: interval enforcement, cleanup, banning vb.
-
Metrics
- GeoIP desteği: istatistikler ve peer sınırlaması amacıyla
- Özellik önerileri Issues üzerinden alınabilir
-
Çalıştırma yöntemi
-
Kaynak koddan doğrudan çalıştırma
- Bu yöntem için sistemde Erlang ve Elixir kurulu olmalıdır
- Depoyu klonlayın
git clone https://github.com/Dahrkael/ExTracker.git && cd ExTracker- Gerekirse config/runtime.exs dosyasını değiştirin
- Çalıştırma komutu
MIX_ENV=prod iex -S mixşeklindedir
-
Release derleme
- Şu anda resmi release derlemesi yoktur; release’i kendiniz oluşturup dağıtabilirsiniz
- Depoyu klonladıktan sonra işletim sisteminize uygun şekilde derleyin
- Linux:
MIX_ENV=prod mix release extracker - Windows:
MIX_ENV=prod mix release extrackerw - Release dosyaları
_build/prod/rel/extrackerklasöründe oluşturulur - Başka bir makineye taşınacaksa işletim sistemi ve mimari aynı olmalıdır
- Gerekirse
releases/{VERSION}/runtime.exsyapılandırmasını değiştirin - Çalıştırma komutu
bin/extracker startşeklindedir
-
Docker ile çalıştırma
- Sağlanan Docker imajı doğrudan çalıştırılabilir
docker run ghcr.io/dahrkael/extracker:latest- docker-compose ile de kullanılabilir ve örnek compose dosyası sağlanır
- Container içinde
runtime.exsdosyasını değiştirerek yapılandırmayı ayarlamak zor olduğundan ortam değişkenleri ile de yapılandırma yapılabilir - Tüm ortam değişkenleri listesi örnek compose dosyasında görülebilir
Lisans
- ExTracker, Apache License 2.0 koşullarıyla dağıtılır
- Ayrıntılar için depodaki LICENSE file dosyasına bakın
1 yorum
Hacker News yorumları
OTP öncelikli bir tasarım bekliyordum; ama kodun neredeyse her işte ETS'ye ya da ETS tabanlı Application'a doğrudan dokunması nedeniyle prosedürel tarafa daha yakın görünmesi biraz hayal kırıklığı yarattı
Elixir veya diğer BEAM dillerinde OTP ile servis tasarlamayı öğrenmek için James Edward Gray ve Bruce Tate'in "Designing Elixir Systems with OTP" ve Lance Halvorsen'in "Functional Web Development with Elixir, OTP, and Phoenix" kitaplarına bakmak iyi olur
Sonuçta torrent tracker, özel amaçlı bir veritabanına oldukça benziyor ve veriyi olabildiğince hızlı işlemek en önemli hedef
Yine de kitaplara bir göz atacağım
Artık doğrudan telekomünikasyondan çok, telekom uygulamalarına benzer nitelikte yazılımlara daha yakın; Erlang'ın büyüklüğünün yarısı eşzamanlılık ve dağıtıklık, diğer yarısı hata işleme yeteneğiyse, OTP framework'ü bunun “üçüncü yarısı” sayılabilir
https://learnyousomeerlang.com/what-is-otp
Tek sunuculu bir kurulumsa ETS %100 doğru seçim; yatay ölçeklenmez ama dikeyde müthiş iyi ölçeklenir
Zaten büyük olasılıkla çoğu için YAGNI geçerli
Ek GenServer'ların veya
gen_statemin çok iyi oturduğu durumlar olabilir, ama Elixir ve Phoenix'in birçok kullanımında gösterişli mimari tercihlere gerek yokÇünkü runtime zaten yeterince gösterişli işleri sizin yerinize yapıyor
ETS zaten OTP'nin içinde yerleşik; ETS kullanmanın neden OTP öncelikli olmadığını anlamıyorum
ETS kullanmanın nesi sorun, onu da pek anlamıyorum; sonuçta sadece in-memory bir depolama
Koda göz gezdirdim ama prosedürel stile yakın olduğunu hissetmedim
İyi yapılmış.
IO.putsyerine Logger'a geçmek ve OTel eklemeyi de düşünmek iyi olur[0] https://hexdocs.pm/logger/1.18.4/Logger.html
[1] https://hexdocs.pm/telemetry/readme.html
Elixir gerçekten harika. Şu anda Elixir ile güzel bir bildirim motoru geliştiriyorum ve gerçekten mükemmel
Elixir'in gerçekten daha iyi bir bildirim motoruna ihtiyacı var
Yayın için tebrikler. opentracker ile karşılaştırıldığında nasıl çalıştığını daha ayrıntılı anlatabilir misin merak ediyorum
Performans gibi konular özellikle ilgimi çekiyor
ExTracker'ın parladığı nokta, çekirdek sayısı çift hanelere çıkmaya başladığında
Yine de düzgün benchmark'ları henüz yapmak gerekiyor
Güzel görünüyor. Daha sonra kontrol edeceğim
Birkaç yıl önce Elixir ile temel bir tracker yapmıştım; kodu burada: https://github.com/aalin/mr_torrent
İlginç. BitTorrent'i daha iyi öğrenmek için TypeScript ile benzer bir şey yapmıştım, sonra Rust öğrenmek için Rust ile yeniden yazdım: https://github.com/ckcr4lyf/kiryuu
Ben veritabanı olarak sadece Redis kullanmıştım. Bu projede tüm veritabanı bellekteymiş gibi görünüyor; bunu yaparken aldığınız ilginç tasarım kararları ya da yaşadığınız sorunlar oldu mu merak ediyorum
Benim Redis çözümüm sonraki announce'larda peer'leri rastgeleleştirmiyor gibi, o yüzden pek iyi değil
Her peer'in verisi kendi process'inde eşzamanlı olarak okunup yazılabildiği için çekişme ve gecikme minimuma iniyor
Sıralı işlenen tek kısım, yeni bir swarm'ın ilk kez oluşturulması; bu da sık olmadığı için sorun değil
Ne yazık ki tablodan rastgele bir satırı doğrudan almaya yönelik native destek yok; bu yüzden şu anda tüm swarm'ı alıp sonra rastgele bir alt küme seçiyorum: https://github.com/Dahrkael/ExTracker/blob/master/lib/ex_tra...
DHT ve PEX'in ne olduğunu açıklayabilirsen iyi olur. "tracker PEX" diye aramak zor
Böylece artık merkezi bir konuma ya da genel tracker'a ihtiyaç kalmaz
Harika. Elixir'i ana işinde kullanmak isteyip istemediğini merak ediyorum
Rust ve Go da biliyorum. İşe alım yapıyor musunuz?
Nasıl başladığını, başka projeleri referans alıp almadığını, ne kadar sürdüğünü ve qBittorrent gibi şeylerle karşılaştırıldığında özelliklerin ne kadarının çalıştığını düşündüğünü merak ediyorum
Başka tracker kodlarına da göz gezdirdim, ama çoğu ya aşırı karmaşık ya da fazla basitti; pek yardımcı olmadılar
Şu ana kadar 3 ay boyunca intikam amaçlı uyku ertelemesi ile ortaya çıkan sonuç bu
Bu qBittorrent gibi bir istemci değil, ama gelecekte seedbox odaklı bir istemci projesi fikrim var
Denedim ama HTTPS'i çalışır hale getiremedim
Konsola sürekli
04:43:20.160 [warning] invalid 'event' parameter: size: 6 value: "paused"yazılıyor, ama çalışıyor gibi görünüyorHTTP istatistiklerini de görmek isterdim ama UDP de olur. Yalnız ben UDP'yi kapalı tutuyorum
"paused"olayı BEP 21'in bir parçasıİstemci henüz tamamlanmış durumda olmadığını, ama artık indirme yapmayacağını tracker'a bildirmek için bunu gönderir
Örneğin kullanıcı torrent'teki dosyaların yalnızca bir kısmını istediğinde
Proje README'sine bakılırsa BEP 21 desteği uygulanmamış durumda
Web sunucusu için üçüncü taraf bir kütüphane kullandığım için doğru yöntemi henüz netleştirmem gerekiyor
HTTPS kullanmak için
:https_keyfileiçine geçerli bir sertifika yolu vermen gerekir; ama şu anda HTTPS gerekiyorsa tracker'ın önüne Caddy veya Nginx koymanı öneriyorumcertbot entegrasyonu da planlarda var, fakat torrent peer'lerinin çoğu UDP kullandığı için önceliği yüksek değil