A lightweight, distributed serverless code execution platform
Execute Python & Node.js code in isolated Docker containers with automatic load balancing
Features β’ Architecture β’ Getting Started β’ API Reference
| Feature | Description |
|---|---|
| π³ Container Isolation | Each code execution runs in a fresh Docker container |
| βοΈ Load Balancing | Round-robin distribution across multiple worker nodes |
| π Async Job Queue | Redis-powered job queue with background processing |
| π Real-time Monitoring | Prometheus metrics + Grafana dashboards |
| π gRPC Communication | High-performance inter-service communication |
| π Multi-Language | Support for Python and Node.js |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CLIENT (Browser) β
βββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββ
β HTTP/REST
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β API GATEWAY (Fiber) β
β β’ Authentication (API Key) β’ Rate Limiting β
β β’ Job Submission β’ Status Polling β
β β’ Prometheus Metrics β’ Static UI Serving β
βββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββ
β β
βΌ βΌ
βββββββββββββββββββββββββ βββββββββββββββββββββββββββββ
β PostgreSQL β β Redis β
β (Job Persistence) β β (Job Queue) β
βββββββββββββββββββββββββ βββββββββββββββ¬ββββββββββββββ
β
βββββββββββββββββββββββββββββββΌββββββββββββββ
β β β
βΌ βΌ βΌ
βββββββββββββββββββββ βββββββββββββββββββββ
β WORKER 1 β β WORKER 2 β ...
β (gRPC Server) β β (gRPC Server) β
β β β β
β βββββββββββββββ β β βββββββββββββββ β
β β Docker β β β β Docker β β
β β Container β β β β Container β β
β βββββββββββββββ β β βββββββββββββββ β
βββββββββββββββββββββ βββββββββββββββββββββ
- Go 1.21+
- Docker Desktop
- PostgreSQL (via Docker)
- Redis (via Docker)
# Clone the repository
git clone https://github.com/JullMol/nebula.git
cd nebula
# Start infrastructure
docker-compose up -d redis postgres prometheus grafana
# Run Gateway (Terminal 1)
go run cmd/gateway/main.go
# Run Workers (Terminal 2 & 3)
go run cmd/worker/main.go -port 9091
go run cmd/worker/main.go -port 9092Open http://localhost:3000 in your browser π
nebula/
βββ api/
β βββ proto/ # Protocol Buffer definitions
β βββ pb/ # Generated gRPC code
βββ cmd/
β βββ gateway/ # API Gateway service
β β βββ main.go
β β βββ index.html # Web UI
β βββ worker/ # Worker service
β βββ main.go
βββ internal/
β βββ gateway/
β β βββ proxy/ # gRPC proxy to workers
β βββ orchestrator/
β β βββ scheduler/ # Load balancer (Round Robin)
β βββ platform/
β β βββ database/ # PostgreSQL connection
β β βββ docker/ # Docker client
β β βββ queue/ # Redis queue
β βββ worker/ # Worker gRPC server
βββ pkg/
β βββ config/ # Configuration loader
βββ deploy/
β βββ docker/ # Dockerfiles
β βββ monitoring/ # Prometheus config
βββ docker-compose.yaml
βββ config.yaml
POST /submit
Headers: X-API-KEY: rahasia-negara
Content-Type: application/json
{
"image": "python:alpine",
"command": "",
"code": "print('Hello, Nebula!')"
}Response:
{
"status": "queued",
"job_id": "uuid-here",
"info": "Job tersimpan di DB & Masuk Redis"
}GET /status/:job_idResponse:
{
"job_id": "uuid-here",
"status": "completed",
"result": "Hello, Nebula!\n",
"created_at": "2024-01-05T10:00:00Z",
"updated_at": "2024-01-05T10:00:03Z"
}Access dashboards:
- Prometheus: http://localhost:9090
- Grafana: http://localhost:4000 (admin/admin)
Available metrics:
nebula_jobs_submitted_total- Total jobs submittednebula_jobs_processed_total{status="completed|failed"}- Jobs by status
| Layer | Technology |
|---|---|
| Language | Go 1.21 |
| Web Framework | Fiber v2 |
| RPC | gRPC + Protocol Buffers |
| Database | PostgreSQL 15 |
| Queue | Redis |
| Container | Docker |
| Monitoring | Prometheus + Grafana |
- Client submits code via REST API or Web UI
- Gateway saves job to PostgreSQL and pushes to Redis queue
- Background Dispatcher dequeues job and forwards to available worker
- Worker creates temp file, mounts to Docker container, executes
- Worker captures logs and returns result via gRPC
- Gateway updates PostgreSQL with result
- Client polls status endpoint until completion
MIT License - feel free to use for learning and portfolio!
Built with β€οΈ by JullMol