SaaS

How I Built a SaaS Website Monitor in One Day

03.07.2026  · 

Idea

A service where anyone signs up, adds their own sites and gets notified when something goes down — like UptimeRobot, but on my own infrastructure. Also my first full SaaS case: multi-tenancy, billing-readiness, public status pages.

Architecture

The app (Nuxt 3 + PostgreSQL) runs in a Proxmox LXC container on a home server, exposed to the internet through nginx with TLS on a cloud node over a WireGuard tunnel. Site checks are performed by a separate worker in the cloud — deliberately not from home: monitoring must run from a stable network, otherwise a home ISP outage would fire false alerts to every user. Alerts go to Telegram through a proxy layer (the Telegram API is not directly reachable from Russia).

Multi-tenancy & Security

Login via Telegram Login with HMAC signature verification. Each user sees only their own sites — isolation at the query level. A critical detail for a service that fetches arbitrary URLs: SSRF protection — the service rejects attempts to add internal addresses (private ranges, cloud metadata endpoints, localhost), so it cannot be used to scan the internal network. Plus per-user rate-limiting and plan limits.

Features

Checks of availability, HTTP status, response time and SSL certificate expiry every 5 minutes. Incidents with anti-flapping protection (an alert only after two consecutive failures). A dashboard with 24-hour and 30-day uptime, a latency graph and incident history. Public status pages with a dynamic SVG «uptime 99.9%» badge for embedding.

Operations

The code lives in a self-hosted Gitea with CI/CD: a push builds and atomically deploys with auto-rollback. The database is backed up nightly with replication to a second node and restore testing; a separate watchdog sends an alert if a backup does not arrive. The service is monitored by Zabbix and Grafana alongside the rest of the infrastructure.

Summary

In a single day — from an empty container to a working SaaS in production: registration, multi-tenancy, workers, public pages, backups, monitoring. Stack: Nuxt 3, PostgreSQL, Node.js, nginx, WireGuard, Proxmox LXC, Gitea CI/CD, Telegram Bot API.

← Self-Hosted Matrix Messenger: Synapse, Federation and Video Calls