2 điểm bởi GN⁺ 2025-06-20 | 1 bình luận | Chia sẻ qua WhatsApp
  • ExTracker là một dự án BitTorrent tracker mới dựa trên Elixir
  • Được thiết kế dựa trên hiệu năng caomức sử dụng bộ nhớ thấp, đồng thời có thể dùng ngay gần như không cần thiết lập
  • Cung cấp tính đa dạng và khả năng tương thích nhờ hỗ trợ nhiều đề xuất mở rộng của giao thức BitTorrent (BEP)
  • Bao gồm các tính năng quan trọng cho vận hành thực tế như hỗ trợ HTTPS, sao lưu lên đĩa, tính năng quản trị vận hành
  • Hiện vẫn chưa hoàn thiện để dùng trong môi trường công nghiệp, nhưng một instance thử nghiệm đang chạy thực tế

Tổng quan và tầm quan trọng của dự án

ExTracker là một dự án mã nguồn mở BitTorrent tracker mới được triển khai bằng Elixir, mang lại các lợi thế sau so với những tracker hiện có

  • Dựa trên runtime Erlang/Elixir hiện đại, có kiến trúc hiệu năng cao tận dụng toàn bộ đa lõi
  • Bảo đảm mức sử dụng bộ nhớ thấp trong môi trường peer quy mô lớn (khoảng 200MB RAM cho mỗi 1 triệu peer)
  • Cung cấp môi trường zero-setup có thể chạy ngay lập tức mà không cần cấu hình phức tạp từ trước
  • Duy trì khả năng tương thích với các tiêu chuẩn tracker mới nhất nhờ hỗ trợ nhiều BitTorrent Enhancement Proposal (BEP)

So với các tracker hiện có, dự án này nhẹ hơn và hiệu quả hơn, đồng thời tận dụng tối đa khả năng hỗ trợ đồng thời và môi trường phân tán đặc trưng của Elixir để tạo khác biệt với các dự án mã nguồn mở cùng hạng

Tính năng chính (Features)

  • Hiệu năng cao: tận dụng mọi lõi CPU, sử dụng lưu trữ in-memory
  • Tối ưu bộ nhớ: dùng khoảng 200MB RAM cho mỗi 1 triệu peer
  • Zero-setup: có thể chạy ngay mà không cần thêm bất kỳ cấu hình nào

Các BitTorrent Enhancement Proposals (BEP) được hỗ trợ

  • BEP 0: tuân thủ đặc tả giao thức BitTorrent
  • BEP 15: hỗ trợ giao thức UDP tracker
  • BEP 23: trả về danh sách peer dạng nén
  • BEP 7: mở rộng tracker IPv6
  • BEP 24: trả về IP bên ngoài
  • BEP 41: mở rộng giao thức UDP tracker
  • BEP 48: mở rộng Scrape tracker (hỗ trợ một phần)
  • BEP 52: giao thức BitTorrent v2
  • Một số tính năng (BEP 27, 21, 31, v.v.) vẫn chưa được triển khai hoặc đang được lên kế hoạch
  • Không hỗ trợ BEP 8 (obfuscation peer của tracker)

Các tính năng khác

  • Hỗ trợ kết nối HTTPS
  • Sao lưu lên đĩa (tăng cường an toàn dữ liệu)
  • (Dự kiến) quản lý whitelist/blacklist Infohash
  • (Dự kiến) quản lý peer: quyền hạn, dọn dẹp định kỳ, trục xuất, v.v.
  • (Dự kiến) quản lý metrics/chỉ số và tận dụng GeoIP
  • Không có kế hoạch hỗ trợ WebTorrent

Nhận các đề xuất từ người dùng/nhà phát triển qua Issue

Cách chạy

  • Chạy trực tiếp từ mã nguồn
    • Cần Erlang và Elixir
    • Clone kho lưu trữ, sau đó cấu hình môi trường và chạy
  • Theo cách release
    • Chưa có bản phát hành chính thức, nhưng hỗ trợ tự build và triển khai
    • Sao chép tệp release, cấu hình môi trường rồi chạy
  • Docker
    • Có thể dùng image container chính thức
    • Cung cấp tệp ví dụ docker-compose
    • Khuyến nghị dùng biến môi trường để cấu hình bên trong container

Bản quyền và giấy phép

  • Copyright (c) Dahrkael <dahrkael at outlook dot com>
  • Phân phối theo Apache License 2.0
  • Xem chi tiết giấy phép trong tệp LICENSE của kho lưu trữ

1 bình luận

 
GN⁺ 2025-06-20
Ý kiến Hacker News
  • Thấy hơi tiếc vì đã kỳ vọng vào một thiết kế xoay quanh OTP, nhưng mã thực tế lại gần như mang tính thủ tục, phải tự xử lý trực tiếp ETS hay các hệ thống dựa trên ETS như Application mỗi lần
    Nếu tác giả muốn học cách thiết kế dịch vụ trong Elixir hoặc các ngôn ngữ BEAM thì xin gợi ý hai cuốn tham khảo là "Designing Elixir Systems with OTP" của James Edward Gray và Bruce Tate, cùng "Functional Web Development with Elixir, OTP, and Phoenix" của Lance Halvorsen

    • Ở lần thử đầu tiên tôi đã viết theo phong cách OTP, nhưng rồi nhận ra rằng trong luồng cụ thể này khả năng mở rộng không nhất thiết sẽ tốt như nhau
      Torrent tracker rốt cuộc là một cơ sở dữ liệu chuyên biệt, nên mục tiêu quan trọng nhất là xử lý dữ liệu nhanh nhất có thể
      Dù vậy tôi chắc chắn sẽ đọc những cuốn sách bạn gợi ý
  • Tôi nghĩ có một điều gì đó khiến các lập trình viên C++ rất thích Go và Elixir
    Bản thân tôi cũng như vậy
    Ý là những người yêu C++ vì hiệu năng rồi cũng sẽ mê hiệu năng đa luồng của Go hay Elixir
    Một ý kiến tích cực rằng đây là dự án rất hay

    • Tôi không rõ lắm về các lập trình viên C++, nhưng tôi cảm thấy Erlang/Elixir cực kỳ mạnh trong việc phân tích giao thức nhờ cách triển khai pattern matching
      Pattern matching làm giảm phần lớn các nhánh xử lý và độ phức tạp của mã, nên code trở nên sạch hơn rất nhiều
      Nhờ triết lý 'Let it crash', bạn có thể bỏ qua phần lớn các trường hợp ngoại lệ mà vẫn tin rằng nếu có vấn đề thật sự xảy ra thì ảnh hưởng cũng chỉ giới hạn ở một client
      Trong hơn 10 năm triển khai ứng dụng bằng Elixir, tôi chưa từng gặp downtime ngoài ý muốn
      Ngoài bảo trì và cập nhật ra thì nó luôn đạt 100% uptime
      Với khách hàng, tôi thường nói rằng “dịch vụ làm bằng Elixir thay vì Python hay Go không chỉ gần như không bao giờ chết mà còn có dashboard rất đẹp”, và thực tế nhiều người bị thuyết phục ngay lập tức
      Tôi ước gì có một ngôn ngữ hệ thống hỗ trợ struct, enum và pattern matching ngay trong chữ ký hàm giống như Elixir
  • Tôi cũng từng làm việc tương tự bằng Typescript để học BT (BitTorrent)
    Sau đó tôi viết lại bằng Rust và cũng nhờ đó học thêm Rust
    Link dự án của tôi
    Tôi chỉ dùng redis làm cơ sở dữ liệu, nhưng việc bên bạn đưa toàn bộ vào bộ nhớ để chạy khá thú vị
    Tò mò không biết trong kiểu thiết kế này có những băn khoăn, quyết định thú vị hay vấn đề gì đáng kể không
    Nhân tiện, giải pháp dựa trên redis của tôi có vấn đề là khi announce nhiều lần thì peer không phải lúc nào cũng được xáo trộn ngẫu nhiên

    • Theo kinh nghiệm của tôi thì dùng ETS in-memory là lựa chọn tốt nhất
      Dữ liệu của từng peer có thể được đọc và ghi đồng thời từ các process riêng biệt, nên mức tranh chấp và độ trễ là tối thiểu
      Phần duy nhất mang tính 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 ổn
      Tiếc là không có hỗ trợ gốc để lấy ngẫu nhiên các hàng trong bảng, nên hiện tại tôi phải nạp toàn bộ swarm rồi tự chọn một tập con ngẫu nhiên
      Ví dụ mã liên quan
  • Tôi nghĩ đây là một dự án rất hay
    Trước đây tôi cũng từng làm một tracker cơ bản bằng Elixir
    Link code của tôi

    • Thú vị đấy
      Đặc biệt tôi tò mò vì sao lại triển khai nó như một private tracker
  • Chúc mừng ra mắt dự án
    Tôi muốn biết thêm chi tiết như cách nó hoạt động và hiệu năng so với opentracker

    • Với tracker nhỏ thì opentracker có lẽ sẽ nhanh hơn và dùng ít bộ nhớ hơn
      Tuy nhiên, extracker thực sự phát huy khi số lõi CPU lên tới hai chữ số
      Hiện tại tôi vẫn chưa chạy benchmark tử tế
  • Một lời khen rằng đây là dự án được làm rất tốt
    Nếu góp ý ngắn gọn thì nên chuyển từ IO.puts sang Logger, và cũng nên cân nhắc thêm OTel

    • Đồng ý với ý này
      Chỉ dùng Logger tích hợp sẵn và ứng dụng Telemetry thôi cũng đã đủ
      Sau này có thể dễ dàng gắn thêm opentelemetry hoặc thứ khác thông qua các hook của Telemetry
      Logger documentation
      Telemetry documentation

    • Bạn thích otel sink nào hơn, tức là gửi metric đi đâu?

  • Tôi thực sự rất thích Elixir
    Hiện tôi đang phát triển một notification engine rất ngầu bằng Elixir
    Elixir thật sự quá xuất sắc

    • Hay quá
      Đó là dự án private hay OSS (mã nguồn mở)?
      Hệ sinh thái Elixir đang rất cần một notification engine tốt hơn
    • Bạn đã bắt đầu như thế nào?
  • Có dự án nào để tham khảo không?

  • Mất bao lâu để phát triển?

  • So với qbittorrent thì hiện có khoảng bao nhiêu tính năng hoạt động?

    • Tôi bắt đầu vì cần một tracker để dùng trong dự án khác, nhưng rồi việc phát triển tracker lại thú vị hơn nên cứ tiếp tục làm
      Tôi có tham khảo code của các tracker khác, nhưng phần lớn либо quá phức tạp либо quá đơn giản nên không tham khảo được nhiều
      Tính đến giờ thì tôi đã phát triển được 3 tháng, qua nhiều đêm thức trắng code
      Nó không phải client như qbittorrent, nhưng về sau tôi cũng có ý tưởng cho một dự án client thiên về seedbox

    • Giải thích rằng tracker không phải là torrent client

  • Tôi đã thử dùng trực tiếp nhưng gặp vấn đề HTTPS không hoạt động đúng
    Ngoài ra trên console liên tục hiện cảnh báo
    04:43:20.160 [warning] invalid 'event' parameter: size: 6 value: "paused"
    Tuy vậy có vẻ nó vẫn hoạt động
    Tôi cũng muốn xem thống kê HTTP, nhưng chỉ thấy thống kê UDP
    (Tôi đang tắt UDP)

    • Sự kiện "paused" là một phần của BEP 21, dùng để báo cho tracker rằng client vẫn chưa hoàn tất nhưng cũng không còn tải xuống nữa
      Ví dụ nó hữu ích khi người dùng chỉ muốn một phần file trong torrent
      README của dự án đó có ghi rõ là chưa hỗ trợ BEP 21

    • Telemetry liên quan tới HTTP vẫn còn nằm trong danh sách ToDo
      Tôi đang dùng thư viện bên thứ ba làm web server nên vẫn phải suy nghĩ thêm về cách tích hợp phù hợp
      Muốn dùng HTTPS thì cần chỉ định đường dẫn chứng chỉ hợp lệ trong :https_keyfile
      Hiện tại nếu muốn HTTPS thì tôi khuyên nên đặt Caddy hoặc Nginx phía trước tracker
      Tôi cũng có kế hoạch tích hợp certbot, nhưng vì phần lớn torrent peer dùng UDP nên mức ưu tiên hiện chưa cao

  • Một lời khen rằng đây là dự án thật sự rất hay
    Hỏi liệu bạn có định dùng Elixir làm ngôn ngữ chính không

    • Elixir là một trong những lựa chọn chủ lực của tôi
      Cá nhân tôi tin rằng làm việc với nó chắc chắn thú vị hơn C++ rất nhiều

    • Tôi thì không, nhưng đã làm việc với Elixir gần 9 năm 2 tháng, đồng thời cũng biết Rust và Golang
      Không biết hiện tại có ai đang tuyển dụng không?