A modern, role-based classroom management system with dashboards, enrollments, and DevOps-ready deployments.
Classroom streamlines academic operations for admins, teachers, and students with a clean dashboard, role-aware workflows, and intuitive management screens for departments, subjects, classes, and enrollments.
Login screen sample (clean, recruiter-friendly UI).
- ✅ Role-based access for Admin, Teacher, and Student.
- 📊 Dashboard metrics and recent activity snapshots.
- 🧩 Modules: Departments, Subjects, Classes, Faculty, Enrollments.
- 🔐 Authentication flow with secure session handling.
- ☁️ Cloudinary-ready uploads for profile/asset handling.
- ⚙️ Scalable REST API with clean resource routes.
Frontend
- ⚛️ React 19 + Refine
- 🎨 Tailwind + shadcn/ui + Radix UI
- 📈 Recharts for analytics
Backend
- 🟢 Node.js + Express
- 🧬 Drizzle ORM + PostgreSQL
- 🔐 Better Auth
- 🛡️ Arcjet security middleware
This repo includes real-world DevOps concepts — perfect for recruiters evaluating production readiness:
- 🐳 Dockerized services (frontend & backend).
- 🧩 Docker Compose for local multi-container orchestration.
- ☸️ Kubernetes manifests (Deployments, Services, Ingress).
- 🛡️ Secrets + environment config patterns.
- 📦 Static frontend served via Nginx.
This project implements a complete DevOps lifecycle.
The Kubernetes cluster runs on an Azure VM using k3s.
- Azure Virtual Machine (Ubuntu 22.04)
- k3s lightweight Kubernetes
- Public NodePort exposure
- GitHub Actions deployment
Automated workflows using GitHub Actions:
- Docker Build: On push to
main, Docker images for Frontend and Backend are built. - Push to Registry: Images are tagged with the commit SHA and pushed to Docker Hub (
vanshsuri07/classroom-*). - Deploy to K8s: The manifest files are updated with the new image tags, and
kubectlcommands apply the changes to the cluster.
The application runs on a Kubernetes cluster with the following components:
- Ingress Controller: Routes traffic to Backend (
/api) and Frontend (/). - Services:
LoadBalancerfor Backend,NodePortfor Frontend (Internal communication). - Deployments: Scalable pods for both services with health checks (Liveness/Readiness probes).
- Secrets: Secure management of credentials (DB URL, API Keys).
flowchart TD
A[User] -->|Browser| B[Frontend - Refine + React]
B -->|REST API| C[Backend - Express + Drizzle]
C -->|SQL| D[(PostgreSQL)]
B -->|Uploads| E[Cloudinary]
subgraph Kubernetes
B
C
end
classroom/
├── classroom-frontend/ # UI + dashboard
├── classroom-backend/ # API + auth + database
├── k8s/ # Kubernetes manifests
├── docker-compose.yml # Local dev orchestration
└── Readme.md # This file
VITE_BACKEND_BASE_URL=http://localhost:8000/api/
VITE_CLOUDINARY_UPLOAD_URL=<cloudinary_url>
VITE_CLOUDINARY_CLOUD_NAME=<cloud_name>
VITE_CLOUDINARY_UPLOAD_PRESET=<preset>
DATABASE_URL=postgres://...
FRONTEND_URL=http://localhost:3000
BETTER_AUTH_SECRET=your_secret
ARCJET_KEY=your_arcjet_key
ARCJET_ENV=development
cd classroom-frontend
pnpm install
pnpm devcd classroom-backend
pnpm install
pnpm devdocker compose up --buildEnsure you have kubectl configured and pointing to your cluster.
-
Apply Secrets:
kubectl create secret generic backend-secrets --from-literal=DATABASE_URL=<your_db_url>
-
Deploy Resources:
kubectl apply -f k8s/backend.yml kubectl apply -f k8s/frontend.yml kubectl apply -f k8s/ingress.yml
-
Access the App: Add
127.0.0.1 classroom.localto your/etc/hostsfile (if running locally/minikube) to access via ingress.
- Images are tagged using Git commit SHA
- Rolling updates handled by Kubernetes Deployments
- Secrets injected via Kubernetes Secret objects
- Backend supports graceful shutdown (SIGTERM)
- CI/CD deploys without SSH access
If you'd like a live demo or walkthrough, reach out!
⭐ If this project helped you, please star the repo!