Skip to content

Latest commit

 

History

History

README.md

Java Playground Backend

Backend para ejecutar código Java de forma segura usando Docker.

🚀 Setup Inicial

Prerequisitos

  • Node.js 18+
  • Docker instalado y corriendo
  • npm o yarn

Instalación

  1. Instalar dependencias:
npm install
  1. Construir la imagen Docker:
npm run docker:build
  1. Verificar que la imagen se creó:
npm run docker:check

🏃 Ejecutar

Modo desarrollo (con hot-reload):

npm run dev

Modo producción:

npm run build
npm start

El servidor estará disponible en http://localhost:3001

📡 API Endpoints

GET /health

Health check del servicio.

Response:

{
  "status": "ok",
  "service": "java-playground-backend"
}

GET /check-docker

Verifica que Docker esté disponible y la imagen lista.

Response:

{
  "dockerAvailable": true,
  "imageReady": true,
  "message": "Docker image ready"
}

POST /execute

Ejecuta código Java en un contenedor aislado.

Request:

{
  "code": "public class Main {\n  public static void main(String[] args) {\n    System.out.println(\"Hello World!\");\n  }\n}"
}

Response (exitoso):

{
  "success": true,
  "output": "Hello World!\n",
  "executionTime": 1234
}

Response (error):

{
  "success": false,
  "error": "Main.java:2: error: ';' expected",
  "executionTime": 567
}

🔒 Seguridad

El código se ejecuta con las siguientes restricciones:

  • Timeout: 5 segundos máximo
  • Memoria: Límite de 128MB
  • CPU: 0.5 cores
  • Red: Deshabilitada (--network none)
  • Procesos: Máximo 50 procesos
  • Usuario: No privilegiado dentro del contenedor
  • Sistema de archivos: Solo lectura

🛠️ Comandos útiles

# Reconstruir imagen Docker
npm run docker:build

# Ver imágenes Docker
npm run docker:check

# Limpiar contenedores huérfanos
docker container prune

# Ver logs de contenedores
docker ps -a

📝 Ejemplo de uso con curl

curl -X POST http://localhost:3001/execute \
  -H "Content-Type: application/json" \
  -d '{
    "code": "public class Main { public static void main(String[] args) { System.out.println(\"Hello from Java!\"); } }"
  }'

🏗️ Arquitectura

Cliente HTTP
    ↓
Express Server (index.ts)
    ↓
JavaDockerExecutor (javaExecutor.ts)
    ↓
Docker Container (java-runner:latest)
    ↓
[Compilar + Ejecutar Java]
    ↓
Resultado

🐛 Troubleshooting

Error: "Docker image not ready"

Ejecuta: npm run docker:build

Error: "Cannot connect to Docker daemon"

Asegúrate de que Docker está corriendo: docker ps

Error de permisos en Linux

Agrega tu usuario al grupo docker: sudo usermod -aG docker $USER