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
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).
- 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
- 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
- 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
Capturas del proyecto
Imágenes reales detectadas en la documentación del repositorio.
Perfil de infraestructura
Estimación inicial derivada del repositorio y de los servicios detectados.
Despliegue detectado
Qué señales reales de instalación hemos encontrado.
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).
Stack y dependencias
Componentes inferidos a partir de manifests, configuración y documentación.
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.