Status & Infra Monitor: watching my own production servers

A public status page and admin dashboard for the apps I run on one cloud VM: health checks, SSL expiry, metrics, audit logs and automated database backups.

The challenge

I run several production apps for a client on one Oracle Cloud VM: an exam evaluation platform, a leave management app and an elective registration portal. When something broke, I usually found out from a user. I wanted to know first, and I wanted the people using those apps to see whether something was down without having to ask me.

What I built

A public status page plus an admin dashboard, running on the same VM as the apps it watches.

The hard parts

Monitoring that can't hurt what it monitors. The monitor runs next to the apps it watches. Its deploy pipeline only ever reloads the status dashboard itself; the other apps are never touched by its deploys.

Backups that actually leave the server. After INC-001, I didn't want backups living only on the machine they protect. The daily job dumps MongoDB, compresses it and uploads it to Google Drive using a refresh token, so a dead VM doesn't take the backups with it.

Knowing about expiry before visitors do. Certificates expire quietly. The monitor checks each certificate's expiry date directly and flags it weeks ahead.

Shipping and running it

GitHub Actions deploys it over SSH on every push: pull, install, build, then a reload of the status dashboard's PM2 process only. Health checks, SSL expiry tracking, metrics, the incidents page, audit logs and daily backups are all live. The backup now runs every morning at 7:30. I also built a Grafana dashboard on top of the Prometheus metrics, at grafana.avinashgupta.in.

What I learned

Monitoring isn't a feature you add at the end. It's how you find out your assumptions are wrong before your users do. And a backup that lives on the same disk as the data isn't a backup.

Related: INC-001 → /incidents/INC-001 · MongoDB backups note → /notes/mongodb-7-upgrade-and-free-backups