Implementasi tracker BitTorrent baru yang ditulis dengan Elixir
(github.com/Dahrkael)- ExTracker adalah proyek tracker BitTorrent baru berbasis Elixir
- Dirancang dengan landasan performa tinggi dan penggunaan memori rendah, serta pada praktiknya bisa langsung digunakan dengan setup nyaris nol
- Menyediakan keberagaman dan kompatibilitas melalui dukungan untuk berbagai proposal ekstensi protokol BitTorrent (BEP)
- Mencakup fitur-fitur utama yang dibutuhkan di lingkungan produksi seperti dukungan HTTPS, backup disk, dan fitur operasional/manajemen
- Saat ini masih berada pada tahap belum matang untuk penggunaan industri, tetapi instance uji sudah berjalan dalam operasi nyata
Gambaran umum dan pentingnya proyek
ExTracker adalah proyek open source tracker BitTorrent baru yang diimplementasikan dengan Elixir, dan dibandingkan tracker yang sudah ada menawarkan keuntungan berikut
- Berbasis runtime Erlang/Elixir modern, dengan arsitektur berperforma tinggi yang memanfaatkan semua inti multicore
- Menjamin penggunaan memori rendah pada lingkungan peer berskala besar (sekitar 200MB RAM per 1 juta peer)
- Menyediakan lingkungan zero-setup yang langsung berjalan tanpa konfigurasi awal yang rumit
- Menjaga kompatibilitas dengan standar tracker terbaru melalui dukungan untuk berbagai BitTorrent Enhancement Proposal (BEP)
Dibandingkan tracker yang ada, proyek ini ringan dan efisien, serta memaksimalkan dukungan konkurensi dan lingkungan terdistribusi khas Elixir sehingga berbeda dari proyek open source sekelasnya
Fitur utama (Features)
- Performa tinggi: memanfaatkan semua inti CPU, menggunakan penyimpanan in-memory
- Optimisasi memori: menggunakan sekitar 200MB RAM per 1 juta peer
- Zero setup: dapat langsung dijalankan tanpa konfigurasi tambahan apa pun
BitTorrent Enhancement Proposals (BEP) yang didukung
- BEP 0: mematuhi spesifikasi protokol BitTorrent
- BEP 15: dukungan protokol tracker UDP
- BEP 23: mengembalikan daftar peer terkompresi
- BEP 7: ekstensi tracker IPv6
- BEP 24: mengembalikan IP eksternal
- BEP 41: ekstensi protokol tracker UDP
- BEP 48: ekstensi tracker Scrape (dukungan parsial)
- BEP 52: protokol BitTorrent v2
- Beberapa fitur (BEP 27, 21, 31, dll.) belum diimplementasikan atau masih direncanakan
- Tidak mendukung BEP 8 (obfuscation peer tracker)
Fitur lainnya
- Dukungan koneksi HTTPS
- Backup disk (meningkatkan keamanan data)
- (Direncanakan) pengelolaan whitelist/blacklist infohash
- (Direncanakan) manajemen peer: izin, pembersihan berkala, eject, dll.
- (Direncanakan) manajemen metrik/indikator serta pemanfaatan GeoIP
- Tidak ada rencana mendukung WebTorrent
Saran dari pengguna/pengembang diterima melalui Issue
Cara menjalankan
- Menjalankan langsung dari source code
- Membutuhkan Erlang dan Elixir
- Clone repositori, lalu lakukan konfigurasi lingkungan dan jalankan
- Metode rilis
- Belum ada rilis resmi, tetapi mendukung alur build dan deployment mandiri
- Salin file rilis, lakukan konfigurasi lingkungan, lalu jalankan
- Docker
- Dapat menggunakan image container resmi
- Menyediakan file contoh
docker-compose - Konfigurasi di dalam container disarankan menggunakan environment variable
Hak cipta dan lisensi
- Copyright (c) Dahrkael <dahrkael at outlook dot com>
- Didistribusikan di bawah Apache License 2.0
- Untuk detail lisensi, lihat file LICENSE di repositori
1 komentar
Komentar Hacker News
Ada yang berharap desainnya lebih berpusat pada OTP, tetapi merasa kode aslinya hampir sepenuhnya prosedural, dengan ETS atau sistem berbasis ETS seperti Application ditangani langsung berulang kali
Jika penulis ingin mempelajari cara merancang layanan di Elixir atau bahasa BEAM, mereka merekomendasikan "Designing Elixir Systems with OTP" karya James Edward Gray dan Bruce Tate serta "Functional Web Development with Elixir, OTP, and Phoenix" karya Lance Halvorsen sebagai referensi
Tracker torrent pada akhirnya adalah basis data yang sangat terspesialisasi, jadi tujuan terpenting adalah memproses data secepat mungkin
Tetap saja, ia menyatakan berniat membaca buku-buku yang direkomendasikan
Ada kesan bahwa pengembang C++ punya sesuatu yang membuat mereka menyukai Go dan Elixir
Saya sendiri juga termasuk
Orang-orang yang menyukai C++ karena performanya pada akhirnya jatuh cinta pada performa multithread Go atau Elixir
Komentar positif bahwa ini proyek yang keren
Pattern matching mengurangi sebagian besar percabangan dan kompleksitas kode, sehingga kode jadi jauh lebih rapi
Berkat filosofi 'Let it crash', sebagian besar kasus pengecualian bisa diabaikan, dan kalau pun masalah benar-benar terjadi, dampaknya diyakini hanya terbatas pada satu klien
Selama lebih dari 10 tahun memakai Elixir pada aplikasi yang sudah di-deploy, ia belum pernah mengalami downtime tak terduga
Selain pemeliharaan dan pembaruan, layanan selalu punya uptime 100%
Kepada klien, ia bahkan menjualnya dengan mengatakan, “Layanan yang dibuat dengan Elixir alih-alih Python atau Go bukan cuma tidak pernah mati, tetapi juga memberi dashboard yang keren,” dan banyak orang langsung diyakinkan
Ada harapan semoga ada bahasa sistem yang, seperti Elixir, mendukung struct dan enum, serta pattern matching pada signature fungsi
Saya juga pernah mengerjakan hal serupa dalam Typescript untuk tujuan belajar BT (BitTorrent)
Setelah itu saya mengimplementasikannya lagi di Rust sambil belajar Rust juga
Link proyek saya
Saya hanya memakai redis sebagai basis data, tetapi menarik bahwa pihak sana memuat semuanya ke memori
Penasaran apakah ada pertimbangan, keputusan menarik, atau masalah yang muncul dari desain seperti itu
Sebagai catatan, solusi berbasis redis saya punya masalah bahwa saat announce dilakukan berkali-kali, peer tidak selalu diacak ulang
Data tiap peer bisa dibaca dan ditulis secara bersamaan dari proses yang berbeda, sehingga contention dan latency menjadi minimal
Satu-satunya bagian yang benar-benar berurutan hanyalah saat swarm baru pertama kali dibuat, dan itu tidak sering terjadi jadi tidak masalah
Sayangnya tidak ada dukungan native untuk mengambil baris acak dari tabel, jadi untuk sekarang seluruh swarm diambil lalu dipilih sendiri subset acaknya
Contoh kode terkait
Menurut saya ini proyek yang keren
Dulu saya juga pernah membuat tracker dasar dengan Elixir
Link kode saya
Secara khusus penasaran kenapa ini dibuat sebagai private tracker
Selamat atas peluncuran proyeknya
Penasaran bagaimana cara kerjanya dibanding opentracker, termasuk detail performanya
Namun extracker mulai menunjukkan keunggulannya saat jumlah core CPU mencapai dua digit
Saat ini benchmark yang benar-benar layak belum dilakukan
Pujian bahwa ini proyek yang sangat rapi dibuat
Saran singkatnya: sebaiknya pindahkan dari
IO.putske Logger, dan pertimbangkan juga menambahkan OTelSetuju
Menurutnya cukup memakai aplikasi Logger dan Telemetry bawaan saja
Nanti opentelemetry atau yang lain juga bisa dengan mudah ditambahkan lewat hook Telemetry
Logger documentation
Telemetry documentation
Pertanyaan tentang sink otel yang disukai, yaitu metriknya ingin dikirim ke mana
Benar-benar suka Elixir
Sedang mengembangkan notification engine yang keren dengan Elixir
Elixir memang luar biasa
Penasaran apakah itu proyek private atau OSS (open source)
Ekosistem Elixir memang membutuhkan notification engine yang lebih baik
Apakah ada proyek yang dijadikan referensi
Berapa lama waktu pengembangannya
Penasaran kalau dibandingkan dengan qbittorrent, kira-kira fitur apa saja yang sudah berjalan
Awalnya dimulai karena butuh tracker untuk proyek lain, tetapi mengembangkan tracker itu sendiri ternyata lebih menyenangkan sehingga terus dikerjakan
Ia memang melihat kode tracker lain, tetapi kebanyakan terlalu rumit atau terlalu sederhana sehingga tidak terlalu membantu sebagai referensi
Sejauh ini sudah 3 bulan pengembangan dengan beberapa sesi begadang semalaman
Memang ini bukan klien seperti qbittorrent, tetapi ke depan ada ide proyek klien berorientasi seedbox
Penjelasan bahwa tracker bukan klien torrent
Sudah sempat mencoba langsung, tetapi mengalami masalah bahwa HTTPS tidak berfungsi dengan benar
Selain itu, di konsol terus muncul pesan peringatan
04:43:20.160 [warning] invalid 'event' parameter: size: 6 value: "paused"
yang terus tercetak
Meski begitu, sepertinya tetap berjalan
Ingin juga melihat statistik HTTP, tetapi yang terlihat hanya statistik UDP
(padahal UDP saya nonaktifkan)
Event
"paused"adalah bagian dari BEP 21, dipakai agar klien memberi tahu tracker bahwa ia masih belum selesai tetapi tidak lagi mengunduhMisalnya saat pengguna hanya menginginkan sebagian file dalam torrent
Di readme proyek itu memang tertulis bahwa BEP 21 belum didukung
Telemetry terkait HTTP masih ada di daftar ToDo
Karena web server-nya memakai library pihak ketiga, ia masih memikirkan cara integrasi yang tepat
Untuk memakai HTTPS,
:https_keyfileharus diarahkan ke path sertifikat yang validUntuk saat ini, jika ingin HTTPS disarankan menaruh Caddy atau Nginx di depan tracker
Integrasi certbot juga direncanakan, tetapi karena sebagian besar peer torrent memakai UDP, prioritasnya rendah
Pujian bahwa ini benar-benar proyek yang keren
Ditanya apakah ada niat memakai Elixir sebagai bahasa utama
Jawabannya, Elixir adalah salah satu opsi utama
Secara pribadi ia yakin bekerja dengannya pasti jauh lebih menyenangkan daripada C++
Ia sendiri tidak sedang merekrut, tetapi memperkenalkan diri bahwa sudah hampir 9 tahun 2 bulan bekerja dengan Elixir dan juga bisa Rust serta Golang
Ia penasaran apakah saat ini ada yang sedang merekrut