Một triển khai BitTorrent tracker mới viết bằng Elixir
(github.com/Dahrkael)- ExTracker là một BitTorrent tracker được tạo bằng Elixir; dự án nêu rõ hiện vẫn đang trong quá trình phát triển nhưng đã hoạt động, và chưa sẵn sàng cho toàn bộ nhu cầu sử dụng công nghiệp
- Mục tiêu hiệu năng là hiệu năng cao bằng cách tận dụng tất cả core khả dụng, hoạt động dựa trên kho lưu trữ in-memory, dùng khoảng 200MB RAM cho mỗi 1 triệu peer, và có cấu trúc có thể chạy mà không cần cấu hình riêng
- Các BEP liên quan đến BitTorrent đã được triển khai gồm BEP 0, BEP 15, BEP 23, BEP 7, BEP 21, BEP 24, BEP 41, BEP 48, BEP 52; một số mục như Private Torrents chưa được triển khai hoặc mới triển khai một phần
- Hỗ trợ HTTPS, sao lưu cơ sở dữ liệu ra đĩa, chạy bằng Docker; không hỗ trợ WebTorrent, còn whitelist/blacklist, quản lý peer, metrics, GeoIP đang ở trạng thái triển khai một phần
- Có ba cách chạy: chạy trực tiếp từ mã nguồn, tự build release, và chạy Docker image; trong container có thể cấu hình bằng biến môi trường thay vì
runtime.exs
Trạng thái và mục tiêu của ExTracker
- ExTracker là một triển khai BitTorrent tracker được giới thiệu là “The Bittorrent Tracker made in Elixir”
- Dự án đang ở trạng thái Work In Progress
- Nêu rõ rằng dự án chưa sẵn sàng cho toàn bộ nhu cầu sử dụng công nghiệp
- Hiện tại đã có thể hoạt động
- Một instance thử nghiệm đang chạy tại
extracker.dahrkael.net:6969, với các tính năng hiện đang được bật
Tính năng chính
- Dự án đưa hiệu năng và sự thuận tiện trong vận hành làm các tính năng cốt lõi
- Hiệu năng cao: tận dụng tất cả core khả dụng
- Sử dụng kho lưu trữ in-memory
- Mức sử dụng bộ nhớ khoảng 200MB RAM cho mỗi 1 triệu peer
- Zero setup: hướng tới việc chạy là hoạt động ngay
Trạng thái hỗ trợ BitTorrent BEP
- Trạng thái triển khai được chia thành
✅ Done,🔰 Partially,🔲 Not Yet,❌ Won't do -
Các BEP đã hoàn tất
- 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
-
Các BEP chưa triển khai hoặc bị loại trừ
- BEP 27: Private Torrents chưa được triển khai
- BEP 31: Tracker Failure Retry Extension chưa được triển khai
- BEP 8: Tracker Peer Obfuscation là mục sẽ không triển khai
Các tính năng và giới hạn khác
- Tính năng đã hoàn tất
-
Hỗ trợ HTTPS
- Sao lưu cơ sở dữ liệu ra đĩa
- Tính năng không hỗ trợ
- WebTorrent
- Tính năng đã triển khai một phần
-
Infohash whitelist/blacklist
- Quản lý peer: interval enforcement, cleanup, banning, v.v.
-
Metrics
- Hỗ trợ GeoIP: dùng cho thống kê và giới hạn peer
- Có thể gửi đề xuất tính năng tại Issues
-
Cách chạy
-
Chạy trực tiếp từ mã nguồn
- Cách này yêu cầu hệ thống đã cài Erlang và Elixir
- Clone repository
git clone https://github.com/Dahrkael/ExTracker.git && cd ExTracker- Nếu cần, chỉnh sửa config/runtime.exs
- Lệnh chạy là
MIX_ENV=prod iex -S mix
-
Build release
- Hiện chưa có bản release build chính thức; bạn có thể tự tạo release và triển khai
- Sau khi clone repository, build phù hợp với hệ điều hành
- Linux:
MIX_ENV=prod mix release extracker - Windows:
MIX_ENV=prod mix release extrackerw - File release được tạo trong thư mục
_build/prod/rel/extracker - Nếu chuyển sang máy khác, OS và kiến trúc phải giống nhau
- Nếu cần, chỉnh sửa cấu hình
releases/{VERSION}/runtime.exs - Lệnh chạy là
bin/extracker start
-
Chạy bằng Docker
- Có thể chạy trực tiếp Docker image được cung cấp
docker run ghcr.io/dahrkael/extracker:latest- Cũng có thể dùng với docker-compose, và có cung cấp file compose ví dụ
- Vì khó chỉnh
runtime.exstrong container để điều chỉnh cấu hình, cũng có thể cấu hình bằng biến môi trường - Có thể xem danh sách đầy đủ các biến môi trường trong file compose ví dụ
Giấy phép
- ExTracker được phân phối theo điều khoản Apache License 2.0
- Xem thêm chi tiết trong LICENSE file của repository
1 bình luận
Các ý kiến trên Hacker News
Tôi đã kỳ vọng một thiết kế ưu tiên OTP, nhưng hơi tiếc vì code dường như trực tiếp đụng tới ETS hoặc Application dựa trên ETS trong gần như mọi việc, trông khá giống kiểu thủ tục
Nếu muốn học cách thiết kế dịch vụ bằng OTP trong Elixir hoặc các ngôn ngữ BEAM khác, nên xem "Designing Elixir Systems with OTP" của James Edward Gray và Bruce Tate, và "Functional Web Development with Elixir, OTP, and Phoenix" của Lance Halvorsen
Rốt cuộc tracker torrent gần như là một cơ sở dữ liệu chuyên biệt, và mục tiêu ưu tiên hàng đầu là xử lý dữ liệu nhanh nhất có thể
Dù vậy tôi sẽ đọc thử các sách đó
Giờ đây nó gần với phần mềm có tính chất như ứng dụng truyền thông hơn là bản thân viễn thông; nếu một nửa sự vĩ đại của Erlang nằm ở tính đồng thời và phân tán, nửa còn lại ở khả năng xử lý lỗi, thì framework OTP có thể được xem là “nửa thứ ba” đó
https://learnyousomeerlang.com/what-is-otp
Nếu là cấu hình một server thì ETS là lựa chọn đúng 100%, và tuy sẽ không scale ngang được, nhưng scale dọc sẽ cực kỳ tốt
Dù sao phần lớn khả năng là YAGNI
Có những trường hợp thêm GenServer hoặc
gen_statemsẽ rất hợp, nhưng trong nhiều cách dùng Elixir và Phoenix, không cần đến các lựa chọn kiến trúc hào nhoángVì runtime đã làm thay đủ nhiều thứ hào nhoáng rồi
ETS được tích hợp sẵn trong OTP, nên tôi không hiểu vì sao dùng ETS lại không phải là ưu tiên OTP
Tôi cũng không rõ dùng ETS có vấn đề gì; nó chỉ là kho lưu trữ trong bộ nhớ thôi
Tôi đã lướt qua code nhưng không thấy nó gần với phong cách thủ tục
Làm tốt đấy. Nên chuyển từ
IO.putssang Logger, và cân nhắc thêm OTel nữa[0] https://hexdocs.pm/logger/1.18.4/Logger.html
[1] https://hexdocs.pm/telemetry/readme.html
Tôi thật sự thích Elixir. Hiện tôi đang xây một notification engine rất hay bằng Elixir, và nó thật sự tuyệt vời
Elixir thật sự cần một notification engine tốt hơn
Chúc mừng ra mắt. Tôi tò mò liệu bạn có thể nói chi tiết nó hoạt động ra sao so với opentracker không
Tôi rất quan tâm đến các khía cạnh như hiệu năng
Điểm ExTracker tỏa sáng là khi số core bắt đầu lên hai chữ số
Tuy nhiên vẫn cần benchmark đúng nghĩa
Trông có vẻ hay. Tôi sẽ xem sau
Vài năm trước tôi từng làm một tracker cơ bản bằng Elixir, code ở đây: https://github.com/aalin/mr_torrent
Thú vị. Để học thêm về BitTorrent, tôi đã làm một thứ tương tự bằng TypeScript, rồi làm lại bằng Rust để học Rust: https://github.com/ckcr4lyf/kiryuu
Tuy nhiên tôi chỉ dùng Redis làm cơ sở dữ liệu. Dự án này có vẻ đặt toàn bộ cơ sở dữ liệu trong bộ nhớ; tôi tò mò liệu khi làm vậy có quyết định thiết kế thú vị nào hoặc vấn đề nào bạn gặp phải không
Giải pháp Redis của tôi có vẻ không hay lắm vì nó không random hóa peer trong các announce tiếp theo
Dữ liệu của từng peer có thể được đọc và ghi đồng thời trong các process riêng, nên contention và độ trễ được giảm tối thiểu
Phần duy nhất được xử lý tuần tự là khi một swarm mới được tạo lần đầu, nhưng việc đó không xảy ra thường xuyên nên không sao
Tiếc là không có hỗ trợ native để lấy trực tiếp một hàng ngẫu nhiên từ bảng, nên hiện tại tôi lấy toàn bộ swarm rồi chọn một tập con ngẫu nhiên: https://github.com/Dahrkael/ExTracker/blob/master/lib/ex_tra...
Sẽ tốt nếu có thể giải thích DHT và PEX là gì. Tìm kiếm "tracker PEX" khá khó
Vì vậy không còn cần một vị trí trung tâm hoặc tracker công khai nữa
Tuyệt. Không biết bạn có muốn dùng Elixir làm công việc chính không
Tôi cũng biết Rust và Go. Bên bạn đang tuyển à?
Tôi tò mò bạn đã bắt đầu như thế nào, có tham khảo dự án khác không, mất bao lâu, và theo bạn thì về mặt tính năng nó hoạt động đến mức nào so với những thứ như qBittorrent
Tôi cũng lướt qua code của các tracker khác, nhưng nhìn chung chúng hoặc quá phức tạp hoặc quá đơn giản nên không giúp được nhiều
Cho đến giờ đây là kết quả của 3 tháng trì hoãn giờ ngủ để trả thù
Đây không phải client như qBittorrent, nhưng tôi có ý tưởng về một dự án client hướng tới seedbox trong tương lai
Tôi đã thử dùng nhưng không làm cho HTTPS hoạt động được
Console liên tục in
04:43:20.160 [warning] invalid 'event' parameter: size: 6 value: "paused", nhưng có vẻ vẫn chạyTôi cũng muốn xem thống kê HTTP, nhưng UDP cũng ổn. Chỉ là tôi đang tắt UDP
"paused"là một phần của BEP 21Client gửi nó để báo cho tracker biết rằng nó chưa ở trạng thái hoàn tất, nhưng sẽ không tải xuống nữa
Ví dụ như khi người dùng chỉ muốn một số file trong torrent
Nhìn README của dự án thì hỗ trợ BEP 21 chưa được triển khai
Vì tôi dùng thư viện bên thứ ba cho webserver nên vẫn cần tìm cách đúng
Để dùng HTTPS, bạn cần cung cấp đường dẫn chứng chỉ hợp lệ cho
:https_keyfile, nhưng hiện tại nếu cần HTTPS thì tôi khuyến nghị đặt Caddy hoặc Nginx phía trước trackerTích hợp certbot cũng có kế hoạch, nhưng vì đa số peer torrent dùng UDP nên ưu tiên không cao