Real-time Service Health Monitoring & Intelligent Alerting
Production-grade uptime monitoring with zero-spam alerting
OpsBoard is a lightweight service monitoring platform designed for DevOps teams who need reliable uptime tracking without the noise. It continuously monitors your services, provides real-time visibility through a sleek dashboard, and sends intelligent email alerts only when service states actually change.
- ⚡ Zero-Spam Alerts — Emails sent only on state transitions (UP ↔ DOWN)
- 🎯 Production-Ready — Docker Compose setup, Prisma migrations, structured logging
- 🚀 Fast & Modern — Built with Bun runtime for blazing performance
- 📊 Visual Insights — Mini uptime graphs and real-time status tracking
- 🔧 DevOps Friendly — Easy to deploy, scale, and integrate
- HTTP-based health checks with configurable intervals
- Multi-environment support (prod, staging, dev)
- Automatic failure tracking and recovery detection
- Configurable timeout and retry policies
- Summary Cards — Total services, UP count, DOWN count at a glance
- Service Table — Sortable, filterable list with real-time status
- Uptime Visualization — Mini graphs showing service health over time
- Manual Refresh — On-demand updates without auto-refresh spam
- State-change-only notifications (no repeated failure spam)
- Multi-recipient email management
- Both failure and recovery notifications
- Gmail SMTP with app password support
- Alert history tracking (coming soon)
- Fully containerized with Docker Compose
- PostgreSQL with persistent volumes
- Prisma ORM with migration support
- Environment-based configuration
- Health check endpoints for orchestration
┌─────────────────────────────────────────────────────────────┐
│ OpsBoard │
└─────────────────────────────────────────────────────────────┘
┌──────────────┐ ┌──────────────────┐
│ Frontend │◄───REST API────│ Backend API │
│ (React) │ │ (Bun/Express) │
│ Port: 5173 │ │ Port: 4000 │
└──────────────┘ └────────┬─────────┘
│
┌────────────────────────┼────────────────┐
│ │ │
┌─────────▼─────────┐ ┌────────▼────────┐ ┌───▼────┐
│ PostgreSQL DB │ │ Health Checker │ │ SMTP │
│ (Port: 5432) │ │ (Cron Job) │ │ Alerts │
└───────────────────┘ └──────────────────┘ └────────┘
│
Persistent Storage
- Service Registration → Frontend sends service details to API
- Health Checking → Background job periodically pings service URLs
- State Detection → Compares previous vs current status
- Alert Triggering → Sends email only if state changed
- Dashboard Update → Fetches latest service status from database
| Layer | Technology | Purpose |
|---|---|---|
| Runtime | Bun | Ultra-fast JavaScript runtime with built-in TypeScript |
| Backend | Express.js | RESTful API with middleware support |
| Database | PostgreSQL 15 | Relational database with ACID compliance |
| ORM | Prisma | Type-safe database client with migrations |
| Frontend | React 18 | Modern UI with hooks and functional components |
| Styling | Custom CSS | Dark theme with green accent colors |
| Nodemailer | SMTP email delivery with Gmail support | |
| Container | Docker Compose | Multi-container orchestration |
# Required
docker >= 20.10
docker-compose >= 2.0
# Optional (for local development)
bun >= 1.0
node >= 18.0git clone https://github.com/your-username/opsboard.git
cd opsboardCreate opsboard-backend/.env:
# Database
DATABASE_URL=postgresql://opsuser:opspass@db:5432/opsboard
# SMTP Configuration (Gmail)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASS=your-16-digit-app-password
# Optional: Monitoring Configuration
HEALTH_CHECK_INTERVAL=60000 # 60 seconds
REQUEST_TIMEOUT=5000 # 5 seconds🔐 Gmail App Password Setup:
- Enable 2FA on your Google account
- Go to Security → App Passwords
- Generate password for "Mail" app
- Use this 16-digit password in
.env
# Start backend + database
cd opsboard-backend
docker-compose up --build
# In another terminal, start frontend
cd opsboard-frontend
npm install
npm run dev# Execute inside running container
docker exec -it opsboard-app bash
bunx prisma db push
exit- Frontend: http://localhost:5173
- Backend API: http://localhost:4000
- Health Endpoint: http://localhost:4000/health
https://httpstat.us/200
https://www.google.com
https://api.github.com/status
https://httpstat.us/500
http://localhost:9999
https://invalid-domain-xyz-123.com
https://httpstat.us/200?sleep=5000 (slow response)
https://httpstat.us/503 (service unavailable)
POST /services/register
Content-Type: application/json
{
"name": "API Gateway",
"environment": "prod",
"url": "https://api.example.com/health"
}GET /dashboard/servicesResponse:
{
"services": [
{
"id": "1",
"name": "API Gateway",
"environment": "prod",
"url": "https://api.example.com/health",
"status": "UP",
"failureCount": 0,
"lastChecked": "2026-01-10T12:00:00Z"
}
]
}GET /alerts/emailsPOST /alerts/emails
Content-Type: application/json
{
"email": "team@example.com"
}DELETE /alerts/emails/:idGET /healthmodel Service {
id String @id @default(uuid())
name String
environment String
url String
status String @default("UNKNOWN")
failureCount Int @default(0)
lastChecked DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model AlertEmail {
id String @id @default(uuid())
email String @unique
createdAt DateTime @default(now())
}# Build and run in detached mode
docker-compose up -d --build
# View logs
docker-compose logs -f app
# Stop services
docker-compose down
# Clean restart with fresh database
docker-compose down -v
docker-compose up --build| Service | Port | Purpose |
|---|---|---|
app |
4000 | Backend API server |
db |
5432 | PostgreSQL database |
volumes:
postgres_data: # Persists database across container restartsThis project is licensed under the MIT License - see the LICENSE file for details.
Arshad Mohammad
Backend Engineer & DevOps Enthusiast
- GitHub: @your-username
- Built with Bun - The blazing-fast JavaScript runtime
- Styled with inspiration from modern DevOps dashboards
- Icons and design patterns from Lucide
⭐ Star this repository if you find it helpful!
Made with ❤️ for the Fun DevOps