2 điểm bởi GN⁺ 2025-06-20 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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

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

  • 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.exs trong 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

 
GN⁺ 2025-06-20
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

    • Lúc thử ban đầu tôi đã viết theo cách đậm chất OTP hơn, nhưng trong luồng cụ thể này thì khả năng mở rộng không tương đương
      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 đó
    • Nếu trong ngữ cảnh này bạn chưa biết OTP là gì, OTP là viết tắt của Open Telecom Platform
      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
    • Làm BitTorrent tracker bằng các GenServer hoàn toàn không hợp lý
      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
    • Một phần lớn điểm mạnh của Elixir và Erlang là có thể viết code rất trực quan mà vẫn đạt hiệu năng tốt
      Có những trường hợp thêm GenServer hoặc gen_statem sẽ 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áng
      Vì runtime đã làm thay đủ nhiều thứ hào nhoáng rồi
    • Tôi tò mò, thiết kế ưu tiên OTP thì nên trông như thế nào?
      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.puts sang Logger, và cân nhắc thêm OTel nữa

  • 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

    • Trông có vẻ ổn. Không biết nó là private hay open source
      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

    • Với tracker nhỏ thì opentracker có lẽ nhanh hơn và dùng ít bộ nhớ hơn một chút
      Đ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ị. Tôi tò mò vì sao bạn quyết định làm riêng thành private tracker
  • 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

    • Với tôi, dùng ETS trong bộ nhớ là quyết định tốt nhất
      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 DHTPEX là gì. Tìm kiếm "tracker PEX" khá khó

  • 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 không phải tác giả bài gốc, nhưng đã làm việc với Elixir được 9 năm 2 tháng
      Tôi cũng biết Rust và Go. Bên bạn đang tuyển à?
    • Đó đúng là một trong các lựa chọn. Tôi nghĩ mình sẽ thích nó hơn C++ rất nhiều
  • 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 bắt đầu vì cần một tracker cho dự án khác, nhưng rồi việc làm tracker trở nên thú vị hơn
      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
    • Đây là tracker, không phải torrent client
  • 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ạy
    Tôi cũng muốn xem thống kê HTTP, nhưng UDP cũng ổn. Chỉ là tôi đang tắt UDP

    • Sự kiện "paused" là một phần của BEP 21
      Client 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
    • Telemetry phía HTTP nằm trong danh sách việc cần làm
      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 tracker
      Tí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