2 คะแนน โดย GN⁺ 2025-06-20 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ExTracker คือ BitTorrent tracker ที่สร้างด้วย Elixir โดยระบุว่ายังอยู่ระหว่างพัฒนา แต่ใช้งานได้แล้ว และยังไม่พร้อมสำหรับการใช้งานระดับอุตสาหกรรมเต็มรูปแบบ
  • เป้าหมายด้านประสิทธิภาพคือ ประสิทธิภาพสูง โดยใช้ทุกคอร์ที่มี ทำงานบนพื้นที่จัดเก็บแบบ in-memory ใช้ RAM ประมาณ 200MB ต่อ peer 1 ล้านราย และมีโครงสร้างที่รันได้โดยไม่ต้องตั้งค่าเพิ่มเติม
  • BEP ที่เกี่ยวข้องกับ BitTorrent ที่นำมาใช้แล้ว ได้แก่ BEP 0, BEP 15, BEP 23, BEP 7, BEP 21, BEP 24, BEP 41, BEP 48, BEP 52 ส่วนบางรายการอย่าง Private Torrents ยังไม่ได้ทำหรือทำไว้บางส่วน
  • รองรับ HTTPS, การสำรองฐานข้อมูลลงดิสก์, การรันด้วย Docker ไม่รองรับ WebTorrent และฟีเจอร์ whitelist/blacklist, การจัดการ peer, metrics, GeoIP อยู่ในสถานะ ทำไว้บางส่วน
  • วิธีรันมี 3 แบบ ได้แก่ รันจากซอร์สโดยตรง, บิลด์ release เอง, และรัน Docker image โดยในคอนเทนเนอร์สามารถตั้งค่าผ่าน environment variables แทน runtime.exs ได้

สถานะและเป้าหมายของ ExTracker

  • ExTracker เป็น implementation ของ BitTorrent tracker ที่แนะนำตัวว่า “The Bittorrent Tracker made in Elixir”
  • โปรเจกต์อยู่ในสถานะ Work In Progress
    • ระบุว่ายังไม่พร้อมสำหรับการใช้งานระดับอุตสาหกรรมเต็มรูปแบบ
    • ปัจจุบันสามารถทำงานได้แล้ว
  • มี test instance รันอยู่ที่ extracker.dahrkael.net:6969 และเปิดใช้งานฟังก์ชันปัจจุบันอยู่

ฟีเจอร์หลัก

  • นำเสนอประสิทธิภาพและความสะดวกในการปฏิบัติการเป็นฟีเจอร์หลัก
    • ประสิทธิภาพสูง: ใช้ทุกคอร์ที่มี
    • ใช้ พื้นที่จัดเก็บแบบ in-memory
    • การใช้หน่วยความจำอยู่ที่ RAM ประมาณ 200MB ต่อ peer 1 ล้านราย
    • Zero setup: ตั้งเป้าให้รันแล้วทำงานได้ทันที

สถานะการรองรับ BitTorrent BEP

ฟีเจอร์อื่นและข้อจำกัด

  • ฟีเจอร์ที่ทำเสร็จแล้ว
    • รองรับ HTTPS

      • การสำรองฐานข้อมูลลงดิสก์
      • ฟีเจอร์ที่ไม่รองรับ
      • WebTorrent
      • ฟีเจอร์ที่ทำไว้บางส่วน
    • Infohash whitelist/blacklist

      • การจัดการ peer: interval enforcement, cleanup, banning ฯลฯ
    • Metrics

      • รองรับ GeoIP: ใช้สำหรับสถิติและการจำกัด peer
      • สามารถส่งข้อเสนอฟีเจอร์ได้ที่ Issues

วิธีรัน

  • รันจากซอร์สโค้ดโดยตรง

    • วิธีนี้ต้องติดตั้ง Erlang และ Elixir ไว้ในระบบ
    • clone repository
    • git clone https://github.com/Dahrkael/ExTracker.git && cd ExTracker
    • หากจำเป็น ให้แก้ไข config/runtime.exs
    • คำสั่งรันคือ MIX_ENV=prod iex -S mix
  • บิลด์ release

    • ปัจจุบันยังไม่มี official release build และสามารถสร้าง release เองเพื่อ deploy ได้
    • หลังจาก clone repository แล้ว ให้บิลด์ให้ตรงกับระบบปฏิบัติการ
    • Linux: MIX_ENV=prod mix release extracker
    • Windows: MIX_ENV=prod mix release extrackerw
    • ไฟล์ release จะถูกสร้างในโฟลเดอร์ _build/prod/rel/extracker
    • หากย้ายไปเครื่องอื่น OS และ architecture ต้องเหมือนกัน
    • หากจำเป็น ให้แก้ไขการตั้งค่า releases/{VERSION}/runtime.exs
    • คำสั่งรันคือ bin/extracker start
  • รันด้วย Docker

    • สามารถรัน Docker image ที่ให้มาได้ทันที
    • docker run ghcr.io/dahrkael/extracker:latest
    • ใช้งานผ่าน docker-compose ได้เช่นกัน และมี ไฟล์ compose ตัวอย่าง ให้
    • เนื่องจากปรับการตั้งค่าด้วยการแก้ runtime.exs ภายในคอนเทนเนอร์ได้ยาก จึงสามารถตั้งค่าผ่าน environment variables ได้ด้วย
    • รายการ environment variables ทั้งหมดดูได้จากไฟล์ compose ตัวอย่าง

ไลเซนส์

  • ExTracker เผยแพร่ภายใต้เงื่อนไข Apache License 2.0
  • ดูรายละเอียดเพิ่มเติมได้ใน LICENSE file ของ repository

1 ความคิดเห็น

 
GN⁺ 2025-06-20
ความคิดเห็นบน Hacker News
  • ผมคาดหวังว่าจะเป็น การออกแบบที่ให้ OTP มาก่อน แต่เสียดายที่โค้ดดูใกล้เคียงกับแนว procedural เพราะแทบทุกงานไปแตะ ETS หรือ Application ที่อิง ETS โดยตรง
    ถ้าอยากเรียนรู้วิธีออกแบบบริการด้วย OTP ใน Elixir หรือภาษาอื่นบน BEAM แนะนำให้อ่าน "Designing Elixir Systems with OTP" ของ James Edward Gray และ Bruce Tate กับ "Functional Web Development with Elixir, OTP, and Phoenix" ของ Lance Halvorsen

    • ตอนลองครั้งแรก ผมเขียนให้เป็น แนว OTP มากกว่า นี้ แต่สำหรับ flow เฉพาะนี้มันไม่ได้สเกลได้เท่ากัน
      สุดท้ายแล้ว torrent tracker ก็ใกล้เคียงกับฐานข้อมูลเฉพาะทาง และเป้าหมายสำคัญที่สุดคือประมวลผลข้อมูลให้เร็วที่สุด
      ถึงอย่างนั้น ผมจะลองอ่านหนังสือพวกนั้นดู
    • ถ้าในบริบทนี้ไม่รู้ว่า OTP คืออะไร OTP ย่อมาจาก Open Telecom Platform
      ตอนนี้มันใกล้เคียงกับซอฟต์แวร์ที่มีลักษณะเหมือนแอปพลิเคชันด้านการสื่อสาร มากกว่าตัวการสื่อสารเอง และถ้าครึ่งหนึ่งของความยอดเยี่ยมของ Erlang คือ concurrency กับ distributed nature อีกครึ่งหนึ่งคือความสามารถในการจัดการ error เฟรมเวิร์ก OTP ก็อาจนับเป็น “ครึ่งที่สาม” ได้
      https://learnyousomeerlang.com/what-is-otp
    • การทำ BitTorrent tracker ด้วย GenServer หลายตัวนั้นไม่สมเหตุสมผลเลย
      ถ้าเป็นคอนฟิกแบบเซิร์ฟเวอร์เดียว ETS คือทางเลือกที่ถูก 100% และแม้จะขยายแนวนอนไม่ได้ แต่จะขยายแนวตั้งได้ดีมาก
      ยังไงส่วนใหญ่ก็น่าจะเป็น YAGNI อยู่แล้ว
    • จุดแข็งสำคัญอย่างหนึ่งของ Elixir และ Erlang คือสามารถเขียน โค้ดที่ตรงไปตรงมามาก แต่ยังได้ performance ดี
      อาจมีบางกรณีที่ GenServer เพิ่มเติมหรือ gen_statem เข้ากันได้สวย แต่การใช้งาน Elixir และ Phoenix จำนวนมากไม่จำเป็นต้องเลือกสถาปัตยกรรมหวือหวาขนาดนั้น
      เพราะ runtime ทำงานหวือหวาให้แทนมากพออยู่แล้ว
    • สงสัยว่า การออกแบบที่ให้ OTP มาก่อน ควรหน้าตาเป็นอย่างไร?
      ETS อยู่ใน OTP อยู่แล้ว ผมเลยไม่เข้าใจว่าการใช้ ETS ทำไมถึงไม่ใช่ OTP-first
      และก็ไม่ค่อยเข้าใจด้วยว่าการใช้ ETS มีปัญหาอะไร มันก็แค่ in-memory store เท่านั้น
      ผมไล่ดูโค้ดแล้ว แต่ไม่ได้รู้สึกว่าใกล้เคียงกับสไตล์ procedural
  • ทำได้ดีมาก น่าจะย้ายจาก IO.puts ไปใช้ Logger และลองพิจารณาเพิ่ม OTel ด้วย

    • เห็นด้วย แค่ใช้แอป Logger [0] และ Telemetry [1] ที่มีมาในตัวก็น่าจะพอแล้ว และถ้าภายหลังอยาก export metrics ก็สามารถผูก opentelemetry หรืออย่างอื่นเข้ากับ telemetry hook ได้ง่าย
      [0] https://hexdocs.pm/logger/1.18.4/Logger.html
      [1] https://hexdocs.pm/telemetry/readme.html
    • อยากรู้ว่าชอบ otel sink ตัวไหน
  • ผมชอบ Elixir มาก ตอนนี้กำลังทำ notification engine เจ๋ง ๆ ด้วย Elixir อยู่ และมันยอดเยี่ยมจริง ๆ

    • ดูน่าสนใจ อยากรู้ว่าเป็น private หรือ open source
      Elixir ต้องการ notification engine ที่ดีกว่านี้จริง ๆ
  • ยินดีด้วยกับการเปิดตัว อยากทราบรายละเอียดว่ามันทำงานอย่างไรเมื่อเทียบกับ opentracker
    สนใจเรื่อง performance มาก

    • ถ้าเป็น tracker ขนาดเล็ก opentracker น่าจะเร็วกว่าและใช้ memory น้อยกว่านิดหน่อย
      จุดที่ ExTracker ฉายแววคือเมื่อจำนวน core เริ่มขึ้นไปเป็นเลขสองหลัก
      แต่ยังต้องทำ benchmark ที่เหมาะสมก่อน
  • ดูดี เดี๋ยวไว้จะลองดู
    เมื่อหลายปีก่อนผมเคยทำ tracker พื้นฐานด้วย Elixir โค้ดอยู่ที่นี่: https://github.com/aalin/mr_torrent

    • น่าสนใจ อยากรู้ว่าทำไมถึงตัดสินใจทำเป็น private tracker โดยเฉพาะ
  • น่าสนใจ ผมเคยทำของคล้ายกันด้วย TypeScript เพื่อเรียนรู้ BitTorrent เพิ่มขึ้น และทำใหม่ด้วย Rust เพื่อเรียน Rust: https://github.com/ckcr4lyf/kiryuu
    แต่ผมใช้ Redis เป็นฐานข้อมูลเฉย ๆ โปรเจกต์นี้ดูเหมือนว่าฐานข้อมูลทั้งหมดอยู่ในหน่วยความจำ อยากรู้ว่าระหว่างทำแบบนั้นมี decision ด้าน design ที่น่าสนใจหรือปัญหาอะไรไหม
    วิธีแก้ของผมด้วย Redis ดูไม่ค่อยดีนัก เพราะเหมือนจะไม่ randomize peers ใน announce ถัด ๆ ไป

    • สำหรับผม การใช้ ETS แบบ in-memory เป็นการตัดสินใจที่ดีที่สุด
      สามารถอ่านและเขียนข้อมูลของ peer แต่ละตัวพร้อมกันจาก process ของตัวเองได้ ทำให้ contention และ latency ต่ำที่สุด
      ส่วนเดียวที่ประมวลผลแบบ sequential คือเมื่อต้องสร้าง swarm ใหม่ครั้งแรก ซึ่งไม่ได้เกิดบ่อยจึงไม่เป็นไร
      น่าเสียดายที่ไม่มี native support สำหรับดึงแถวแบบสุ่มจาก table โดยตรง ตอนนี้เลยดึงทั้ง swarm มาแล้วเลือก subset แบบสุ่ม: https://github.com/Dahrkael/ExTracker/blob/master/lib/ex_tra...
  • ถ้าอธิบายได้ว่า DHT กับ PEX คืออะไรจะดีมาก การค้นคำว่า "tracker PEX" ค่อนข้างยาก

    • ลิงก์อ้างอิงคือ https://en.m.wikipedia.org/wiki/Mainline_DHT และ https://en.m.wikipedia.org/wiki/Peer_exchange
    • DHT หรือ ตารางแฮชแบบกระจาย และ PEX หรือ การแลกเปลี่ยนเพียร์ ช่วยให้ torrent client หา peer ได้โดยไม่ต้องมี tracker กลาง
      ดังนั้นจึงไม่จำเป็นต้องมีตำแหน่งศูนย์กลางหรือ public tracker อีกต่อไป
  • เจ๋งดี อยากรู้ว่าอยากใช้ Elixir เป็นงานหลักไหม

    • ผมไม่ใช่คนเขียนโพสต์ต้นทาง แต่ทำงานกับ Elixir มา 9 ปี 2 เดือนแล้ว
      รู้ Rust กับ Go ด้วย กำลังรับคนอยู่หรือเปล่า?
    • ก็เป็นหนึ่งในตัวเลือกนะ คิดว่าน่าจะสนุกกว่า C++ มาก
  • อยากรู้ว่าเริ่มต้นอย่างไร อ้างอิงโปรเจกต์อื่นไหม ใช้เวลานานแค่ไหน และคิดว่าฟีเจอร์ที่ทำงานได้เทียบกับพวก qBittorrent ประมาณไหน

    • เริ่มเพราะอีกโปรเจกต์หนึ่งต้องการ tracker แต่ฝั่งทำ tracker กลับสนุกกว่า
      ผมก็ไล่ดูโค้ด tracker ตัวอื่น ๆ แต่ส่วนใหญ่ซับซ้อนเกินไปหรือเรียบง่ายเกินไป เลยไม่ได้ช่วยมากนัก
      จนถึงตอนนี้เป็นผลลัพธ์จาก การผัดวันนอนแบบล้างแค้น ตลอด 3 เดือน
      นี่ไม่ใช่ client แบบ qBittorrent แต่มีไอเดียโปรเจกต์ client ที่เน้น seedbox ในอนาคตอยู่
    • นี่คือ tracker ไม่ใช่ torrent client
  • ลองใช้แล้ว แต่ทำให้ HTTPS ทำงานไม่ได้
    ใน console มีข้อความ 04:43:20.160 [warning] invalid 'event' parameter: size: 6 value: "paused" ขึ้นเรื่อย ๆ แต่ดูเหมือนว่ายังทำงานได้
    อยากดู HTTP stats ด้วย แต่ UDP ก็โอเค เพียงแต่ผมปิด UDP ไว้

    • event "paused" เป็นส่วนหนึ่งของ BEP 21
      client ส่งให้ tracker เพื่อแจ้งว่ายังไม่อยู่ในสถานะ completed แต่จะไม่ดาวน์โหลดต่อแล้ว
      เช่น เมื่อผู้ใช้ต้องการแค่บางไฟล์ใน torrent
      ดูจาก README ของโปรเจกต์แล้ว การรองรับ BEP 21 ยังไม่ได้ implement
    • Telemetry ฝั่ง HTTP อยู่ในรายการที่ต้องทำ
      เนื่องจากใช้ไลบรารี third-party สำหรับ web server จึงยังต้องหาวิธีที่ถูกต้องก่อน
      ถ้าจะใช้ HTTPS ต้องระบุ path ของ certificate ที่ถูกต้องให้ :https_keyfile แต่ตอนนี้ถ้าต้องการ HTTPS แนะนำให้วาง Caddy หรือ Nginx ไว้หน้า tracker
      มีแผน integrate certbot ด้วย แต่เพราะ peer ของ torrent ส่วนใหญ่ใช้ UDP จึงยังไม่ใช่ priority สูง