Nueva implementación de un tracker BitTorrent escrita en Elixir
(github.com/Dahrkael)- ExTracker es un tracker BitTorrent creado con Elixir; actualmente está en desarrollo, pero funciona, y se aclara que todavía no está listo para uso industrial completo
- Sus objetivos de rendimiento son alto rendimiento aprovechando todos los núcleos disponibles, funcionamiento basado en almacenamiento en memoria, uso de alrededor de 200 MB de RAM por cada millón de peers y una estructura que pueda ejecutarse sin configuración adicional
- En cuanto a los BEP relacionados con BitTorrent, implementa BEP 0, BEP 15, BEP 23, BEP 7, BEP 21, BEP 24, BEP 41, BEP 48 y BEP 52; algunos, como Private Torrents, aún no están implementados o están parcialmente implementados
- Soporta HTTPS, respaldo de base de datos en disco y ejecución con Docker; no soporta WebTorrent, y whitelist/blacklist, gestión de peers, métricas y GeoIP están parcialmente implementados
- Hay tres formas de ejecución: correrlo directamente desde el código fuente, compilar una release propia y ejecutar una imagen Docker; en contenedores se puede configurar mediante variables de entorno en lugar de
runtime.exs
Estado y objetivos de ExTracker
- ExTracker es una implementación de tracker BitTorrent presentada como “The Bittorrent Tracker made in Elixir”
- El proyecto está en estado Work In Progress
- Se aclara que todavía no está listo para uso industrial completo
- Actualmente puede funcionar
- Hay una instancia de prueba ejecutándose en
extracker.dahrkael.net:6969, con las funciones actuales activadas
Funciones principales
- Presenta el rendimiento y la facilidad operativa como funciones clave
- Alto rendimiento: aprovecha todos los núcleos disponibles
- Usa almacenamiento en memoria
- El uso de memoria es de alrededor de 200 MB de RAM por cada millón de peers
- Zero setup: apunta a funcionar de inmediato al ejecutarse
Estado de soporte para BEP de BitTorrent
- La notación de estado se divide en
✅ Done,🔰 Partially,🔲 Not Yety❌ Won't do -
BEP completados
- 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
-
BEP no implementados o excluidos
- BEP 27: Private Torrents aún no está implementado
- BEP 31: Tracker Failure Retry Extension aún no está implementado
- BEP 8: Tracker Peer Obfuscation es un elemento que no se implementará
Otras funciones y limitaciones
- Funciones completadas
-
Soporte HTTPS
- Respaldo de base de datos en disco
- Funciones no soportadas
- WebTorrent
- Funciones parcialmente implementadas
-
Whitelist/blacklist de infohash
- Gestión de peers: interval enforcement, cleanup, banning, etc.
-
Métricas
- Soporte GeoIP: para estadísticas y restricciones de peers
- Se aceptan propuestas de funciones en Issues
-
Cómo ejecutarlo
-
Ejecutar directamente desde el código fuente
- Este método requiere que Erlang y Elixir estén instalados en el sistema
- Clonar el repositorio
git clone https://github.com/Dahrkael/ExTracker.git && cd ExTracker- Si es necesario, modificar config/runtime.exs
- El comando de ejecución es
MIX_ENV=prod iex -S mix
-
Compilar una release
- Actualmente no hay builds oficiales de release, pero se puede crear y desplegar una release propia
- Después de clonar el repositorio, compilar según el sistema operativo
- Linux:
MIX_ENV=prod mix release extracker - Windows:
MIX_ENV=prod mix release extrackerw - Los archivos de la release se generan en la carpeta
_build/prod/rel/extracker - Si se trasladan a otra máquina, el sistema operativo y la arquitectura deben ser iguales
- Si es necesario, modificar la configuración en
releases/{VERSION}/runtime.exs - El comando de ejecución es
bin/extracker start
-
Ejecutar con Docker
- Se puede ejecutar directamente la imagen Docker provista
docker run ghcr.io/dahrkael/extracker:latest- También puede usarse con docker-compose, y se ofrece un archivo compose de ejemplo
- Como es difícil modificar
runtime.exsdentro del contenedor para ajustar la configuración, también se puede configurar mediante variables de entorno - La lista completa de variables de entorno se puede consultar en el archivo compose de ejemplo
Licencia
- ExTracker se distribuye bajo los términos de la Apache License 2.0
- Para más detalles, consultar el archivo LICENSE del repositorio
1 comentarios
Opiniones en Hacker News
Esperaba un diseño priorizando OTP, pero me decepcionó que el código toque directamente ETS o una Application basada en ETS en casi todas las tareas, por lo que se ve más cercano a lo procedural.
Para aprender a diseñar servicios con OTP en Elixir u otros lenguajes de BEAM, conviene ver "Designing Elixir Systems with OTP", de James Edward Gray y Bruce Tate, y "Functional Web Development with Elixir, OTP, and Phoenix", de Lance Halvorsen.
Al final, un tracker de torrents se parece más a una base de datos especializada, y el objetivo principal es procesar los datos lo más rápido posible.
De todos modos, voy a echarles un ojo a esos libros.
Hoy se parece más a software con características de aplicaciones de telecomunicaciones que a telecomunicaciones en sí; si la mitad de la grandeza de Erlang es su concurrencia y distribución, y la otra mitad es su capacidad de manejo de errores, el framework OTP puede verse como esa “tercera mitad”.
https://learnyousomeerlang.com/what-is-otp
Para una configuración de un solo servidor, ETS es 100% la elección correcta; no va a escalar horizontalmente, pero va a escalar verticalmente de maravilla.
De todos modos, lo más probable es que en la mayoría de los casos sea YAGNI.
Puede haber casos en los que GenServer adicionales o
gen_statemencajen de forma elegante, pero en muchos usos de Elixir y Phoenix no hacen falta decisiones de arquitectura tan llamativas.El runtime ya hace suficientes cosas llamativas por ti.
ETS viene integrado en OTP, así que no entiendo por qué usar ETS no sería priorizar OTP.
Tampoco veo bien cuál sería el problema de usar ETS; es simplemente almacenamiento en memoria.
Revisé el código por encima y no me pareció cercano a un estilo procedural.
Está bien hecho. Sería bueno pasar de
IO.putsa Logger y considerar agregar OTel.[0] https://hexdocs.pm/logger/1.18.4/Logger.html
[1] https://hexdocs.pm/telemetry/readme.html
Elixir es realmente genial. Ahora estoy construyendo un motor de notificaciones muy interesante con Elixir, y es excelente.
Elixir realmente necesita un mejor motor de notificaciones.
Felicitaciones por el lanzamiento. Me gustaría saber si puedes dar más detalles sobre cómo funciona en comparación con opentracker.
Me interesan mucho aspectos como el rendimiento.
Donde ExTracker brilla es cuando la cantidad de núcleos empieza a llegar a dos dígitos.
De todos modos, todavía hace falta hacer benchmarks adecuados.
Se ve bien. Lo revisaré más adelante.
Hace unos años hice un tracker básico en Elixir; el código está aquí: https://github.com/aalin/mr_torrent
Interesante. Para aprender más sobre BitTorrent hice algo parecido en TypeScript, y luego lo rehice en Rust para aprender Rust: https://github.com/ckcr4lyf/kiryuu
Aunque yo simplemente usé Redis como base de datos. Este proyecto parece tener toda la base de datos en memoria; me da curiosidad si hubo decisiones de diseño interesantes o problemas que hayas encontrado al hacerlo así.
Mi solución con Redis no parece ser muy buena, porque en los announce posteriores no aleatoriza los peers.
Los datos de cada peer pueden leerse y escribirse simultáneamente desde sus propios procesos, lo que minimiza la contención y la latencia.
La única parte que se procesa de forma secuencial es cuando se crea por primera vez un swarm nuevo, pero eso no ocurre con frecuencia, así que está bien.
Lamentablemente no hay soporte nativo para obtener directamente filas aleatorias de una tabla, así que por ahora se obtiene todo el swarm y luego se elige un subconjunto aleatorio: https://github.com/Dahrkael/ExTracker/blob/master/lib/ex_tra...
Sería bueno que pudieran explicar qué son DHT y PEX. Es difícil buscar "tracker PEX".
Por eso ya no se necesita una ubicación central ni un tracker público.
Genial. Me pregunto si te gustaría usar Elixir como trabajo principal.
También conozco Rust y Go. ¿Están contratando?
Me da curiosidad cómo empezaste, si tomaste como referencia otros proyectos, cuánto tiempo te llevó y qué tan funcional lo consideras en comparación con algo como qBittorrent.
También revisé el código de otros trackers, pero en general eran demasiado complejos o demasiado simples, así que no ayudaron mucho.
Hasta ahora es el resultado de 3 meses de postergación vengativa de la hora de dormir.
Esto no es un cliente como qBittorrent, pero tengo una idea para un futuro proyecto de cliente orientado a seedboxes.
Lo probé, pero no logré hacer que HTTPS funcionara.
En la consola se imprime constantemente
04:43:20.160 [warning] invalid 'event' parameter: size: 6 value: "paused", aunque parece funcionar.También quería ver estadísticas HTTP, pero UDP está bien. Eso sí, tengo UDP desactivado.
"paused"forma parte de BEP 21.Se envía para avisarle al tracker que el cliente todavía no está en estado completado, pero que ya no seguirá descargando.
Por ejemplo, cuando el usuario solo quiere algunos archivos del torrent.
Según el README del proyecto, el soporte de BEP 21 no está implementado.
Estoy usando una librería de terceros para el servidor web, así que todavía tengo que determinar la forma correcta de hacerlo.
Para usar HTTPS debes proporcionar una ruta de certificado válida en
:https_keyfile, pero por ahora, si necesitas HTTPS, recomiendo poner Caddy o Nginx delante del tracker.La integración con certbot también está planeada, pero como la mayoría de los peers de torrents usan UDP, no tiene mucha prioridad.