DNSpect usa arquitectura local híbrida:
- Frontend: React + Vite + TypeScript
- Backend: FastAPI
Motivo: el navegador no puede realizar consultas DNS UDP directas de forma nativa.
Ruta: backend/app/
main.py: endpoints de API, exportaciones y servido del frontend estático en modo empaquetado.models.py: validación estricta de entrada (runs,timeout, resolvers IP, hostnames).runner.py: ejecución de benchmarks en segundo plano, clasificación de fallos y persistencia.stats.py: parser dedrilly cálculo de métricas.detect_dns.py: detección DNS del sistema (Linux/Windows).providers.py: carga del conjunto de datos de proveedores y consultas.cli.py: arranque de servidor para binario empaquetado.
- Linux:
drillsi está disponible. - Fallback y Windows:
dnspython.
GET /api/benchmarks/{id} retorna:
status:running | done | errorprogress:current,total,current_resolverresults(solo cuandodone)
Por defecto, results retorna sin muestras (samples: [] + sample_count).
Para incluir muestras:
GET /api/benchmarks/{id}?include_samples=1GET /api/benchmarks/{id}/export.json?include_samples=1
Orden aplicado:
median_msascp95_msasctimeout_countasc
Justificación: prioriza la latencia típica, luego la consistencia en la cola alta y, por último, la confiabilidad según timeouts.
- Siempre guarda metadatos del run en
backend/data/runs/<id>.json. - Puede guardar muestras completas si
DNS_SPEED_LAB_PERSIST_SAMPLES=1enbackend/data/runs/<id>.samples.json.
Ruta: frontend/src/
- Dashboard de configuración y progreso
- Ranking con filtros (texto, confiabilidad, NA)
- Recomendación primaria/secundaria aplicable en 1 clic
- Gráficos con límite Top-N para legibilidad
- Modal detalle por resolver (muestras bajo demanda)
Estrategia implementada: Opción B
frontendse compila a estáticos (frontend/dist).FastAPIsirve esos estáticos en/.- PyInstaller genera binario único de backend + estáticos +
data/.
Archivos relevantes:
scripts/package_backend.py.github/workflows/release.yml
- Entrada de resolver: solo IP literal.
- Consultas: hostname validado.
- Límites de workload:
runs <= 300,timeout <= 10. - Subproceso seguro sin
shell=True. - Sin telemetría.