A lightweight Platform-as-a-Service (PaaS) that enables application deployment, routing, and log streaming.
This project focuses on core deployment mechanics with minimal infrastructure, making it ideal for demonstrating backend architecture and system design fundamentals.
- ⚡ Deploy applications via API (file upload or git URL)
- 🌐 Dynamic routing using Caddy
- 📦 Docker-based container deployments
- 📡 Real-time log streaming (Server-Sent Events)
- 🔁 Lightweight async processing using
queueMicrotask - 🧠 Simple deployment orchestration
- ⚙️ Zero configuration required
- Node.js (TypeScript)
- Express
- Docker
- Caddy
- Multer (file uploads)
This project intentionally avoids heavy infrastructure (like Redis or job queues) to keep the system:
- Simple
- Fast to run locally
- Focused on core PaaS concepts
Async work is handled using the native event loop:
queueMicrotask(() => {
void this.deploymentManager.runDeployment(deployment.id, request);
});This ensures non-blocking execution without introducing external dependencies.
Client → API → Deployment Manager → Docker → Caddy → Deployed App
Logs → Server-Sent Events (SSE) → Client
- Node.js
- Docker
git clone https://github.com/Simplecodez/brimble-mini-paas.git
cd brimble-mini-paas
sudo docker compose up -d
then open http://localhost:8081 to test the appNo environment variables required — defaults are preconfigured.
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/deployments |
Upload (git url) & deploy a project |
| GET | /api/deployments |
List all deployments |
| GET | /api/deployments/:id |
Get a single deployment |
- Content-Type:
multipart/form-data - Field name:
projectArchive - Expected: zipped project directory
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/events |
Stream deployment logs (SSE) |
This endpoint uses Server-Sent Events (SSE) to stream logs in real time.
- Client uploads project archive or git url
- Deployment record is created
- Deployment runs asynchronously via
queueMicrotask - Docker image is built
- Container is started
- Caddy dynamically routes traffic
- Logs are streamed via SSE
// Deployments
POST /api/deployments
GET /api/deployments
GET /api/deployments/:id
// Logs (SSE)
GET /api/events- No distributed queue system
- No authentication
- No autoscaling
These trade-offs were made to prioritize clarity and core functionality.
- Introduce job queue (BullMQ / Redis or other job queues)
- Rollbacks
- Custom domains & SSL
- Horizontal scaling
MIT
Built by Simplecodez