Ctrl K
ComunidadGuías…
GITHUB · ANALIZADO

SOJ

SOJ es un backend Go para sistemas de evaluación online (online judge) con arquitectura desacoplada mediante PostgreSQL y Redis. Soporta 7 lenguajes con sandboxes intercambiables y pipeline asíncrono robusto contra fallos.

Ficha actualizada 25 sept 2026, 12:26 · upstream 25 sept 2026, 12:21 · release v1.3.10

00

Qué es SOJ

Descripción editorial construida a partir del repositorio, su documentación y sus señales de mantenimiento.

SOJ (Sundial Online Judge) es un sistema de evaluación online auto-alojado diseñado para autoría de problemas, concursos y evaluación automática de código. El backend está implementado en Go con arquitectura desacoplada: el API maneja autenticación, problemas y submissions sin ejecutar código, mientras que los workers y judge agents consumen eventos asíncronos desde Redis Streams para procesar las evaluaciones.

El sistema soporta 7 lenguajes (C, C++17, Go, Java, Node.js, Python 3, Rust) con sandboxes intercambiables: fake, process o Docker con gVisor/runsc. La arquitectura evita bloqueos en submissions lentas o fallidas mediante procesamiento asíncrono, garantizando que el API retorne inmediatamente (202 Accepted) mientras el background compila y ejecuta el código en entornos aislados.

La infraestructura utiliza PostgreSQL para estado persistente, Redis para mensajería asíncrona, y MinIO/S3 para almacenamiento de archivos. Incluye componentes separados: soj-api (HTTP API con Gin), soj-worker (gestión de tareas y reconciliación), soj-judge-agent (ejecución en sandbox) y soj-migrate (migraciones de base de datos).

CASOS DE USO
  • Plataforma de evaluación online para competiciones de programación con sistema de puntuación automático
  • Sistema de autoría de problemas con gestión de casos de prueba y veredictos en tiempo real
  • Infraestructura para concursos de programación con tablas de clasificación (scoreboards)
  • Evaluación asíncrona de código que no bloquea la respuesta al usuario final
  • Sandbox seguro para ejecución de código de usuarios sin acceso a socket Docker ni credenciales
PUNTOS DESTACADOS
  • Arquitectura desacoplada con PostgreSQL para estado y Redis para mensajería, evitando pérdida de submissions ante fallos de proceso
  • Pipeline asíncrono robusto: el API retorna inmediatamente (202 Accepted) mientras el background procesa la evaluación
  • Soporte nativo para 7 lenguajes con configuración modular mediante language.yaml en directorios separados
  • Sandboxes intercambiables (fake, process, Docker/gVisor/runsc) permitiendo despliegue sin runtime de sandbox
  • Mecanismos de reconciliación y dead letters para manejar tareas fallidas o duplicadas
  • Observabilidad integrada con Prometheus en puerto 9090 y métricas en soj-worker/soj-judge-agent
PRECAUCIONES
  • Requiere Docker Compose v2 para despliegue simplificado; sin soporte one-click
  • El API está escrito en Go 1.25, versión específica que puede requerir actualización de entorno
  • La adición de nuevos lenguajes requiere crear directorio con language.yaml y reiniciar el API
  • No incluye frontend en este repositorio (se encuentra en SOJ-web separado)
  • El sistema depende de servicios externos: PostgreSQL, Redis, MinIO/S3 para almacenamiento
VISUAL

Capturas del proyecto

Imágenes reales detectadas en la documentación del repositorio.

SOJ backend architecture
01

Perfil de infraestructura

Estimación inicial derivada del repositorio y de los servicios detectados.

CPU4 vCPUrecomendación inicial
MEMORIA4 GBRAM estimada
DISCO30 GBalmacenamiento base
COMPLEJIDADhighnivel de operación
02

Despliegue detectado

Qué señales reales de instalación hemos encontrado.

Despliegue manual

Despliegue recomendado con Docker Compose v2. Ejecutar make down y make up para inicializar servicios. Para producción, configurar variables de entorno en .env.local del frontend (SOJ-web) y validar configuración con make compose-config. El API requiere Go 1.25 si se ejecuta directamente. Asegurar que soj-judge-agent tenga acceso al socket Docker solo si usa sandbox Docker; los contenedores de usuario no deben tener socket Docker ni credenciales. Monitorear métricas en localhost:9081 (worker) y localhost:9082 (judge-agent).

—Dockerfile
—Compose
—One-click
03

Stack y dependencias

Componentes inferidos a partir de manifests, configuración y documentación.

FRAMEWORKS
Next.jsNode.jsGoRustPython
SERVICIOS
PostgreSQLRedisMongoDBS3/MinIO
BASES DE DATOS
PostgreSQLRedisMongoDB
PUERTOS
808080818082900190903000
06

Experiencia real de la comunidad

Ayuda a contrastar la estimación automática con instalaciones reales.

Todavía no hay datos comunitarios para este proyecto.