Academic and attendance system for MAN 1 Rokan Hulu. The school-facing product name in the UI is e-Hadir.
I built this while teaching introductory AI at the same school, then trained staff to use it.
A production attendance and academic-operations system:
- Teachers and staff record presence at the gate and in class
- An official Android reader scans student/teacher QR credentials
- Requests are signed and bound to a known device
- A worker reconciles attendance so the dashboard stays consistent
- Admin, teacher, and student roles see different work
This is not a demo CRUD app. It is the system the school actually runs.
- NestJS API + Prisma + PostgreSQL
- React (Vite) frontend
- Redis + reconciliation worker
- Nginx reverse proxy
- Docker Compose
- Official Android QR reader
UI stills from a test environment (no student records):
| View | File |
|---|---|
| Login / role picker | docs/public/screenshots/login.png |
| Admin dashboard | docs/public/screenshots/dashboard.png |
| Teacher dashboard | docs/public/screenshots/teacher-dashboard.png |
Public architecture (high level, no extra attack detail): docs/public/architecture.md
There is no public 30–90s production video yet. The stills are a UI walkthrough, not a live production capture.
- Official reader path is HMAC-signed
- Nonce on the signed request (replay is not a casual copy-paste)
- Readers are known devices, not anonymous scanners
- RBAC across admin / teacher / student
- Audit log + reconciliation worker
Do not expect keys, production hosts, or extra endpoints in this README.
Implementasi baseline production untuk sistem informasi akademik dan kehadiran MAN 1 Rokan Hulu dengan stack:
- NestJS API + Prisma + PostgreSQL
- React (Vite) frontend
- Worker reconciliation
- Redis
- Nginx reverse proxy
- Docker Compose production
Jalur QR produksi diarahkan ke APK Android resmi SIAB2 Reader.
QR Credential siswa/guru
→ APK Android official reader
→ HMAC signed request /api/v1/attendance/qr-reader-scan
→ Server validasi DeviceReader + nonce + signature + QR credential
→ Server menjalankan AttendancePolicy
→ GateLog/PrayerAttendanceLog/audit/reconciliation
Endpoint legacy /api/v1/attendance/qr-scan tetap tersedia untuk input manual admin/operator, tetapi bukan jalur produksi utama.
Dokumentasi:
docs/deployment/vps-production-runbook.md— runbook deployment VPS production terkinidocs/deployment/post-deploy-checklist.md— checklist monitoring setelah deploydocs/ADR_ANDROID_QR_READER_ENDPOINT.mddocs/ANDROID_QR_READER.mddocs/APK_BUILDER_GUI.mddocs/CARA_BUILD_APK_UNTUK_OPERATOR.mddocs/QR_SECURITY_MODEL.mddocs/QR_ROLLOUT_PLAN.md
cp .env.production.example .env
npm install --prefix apps/api
npm install --prefix apps/web
npm install --prefix apps/worker
npm install --prefix .
npx prisma generate --schema prisma/schema.prisma
npm run prisma:migrate
npm run prisma:seed
npm run build:allJalankan stack:
docker compose -f docker-compose.production.yml --env-file .env up -d --buildHealth check:
curl -i http://localhost/health/live
curl -i http://localhost/health/ready