Services
Uptime Kuma
Infrastructure observability and alerting, LXC 101.
Uptime Kuma runs as an unprivileged LXC container (ID: 101) on the Proxmox host — a native Node.js install, not Docker. It's the lab's "is it up?" layer: synthetic checks every 60 seconds, HTML alert emails on failure, and the public status-page API the live docs site reads from directly for real-time service dots.
Deployment & Scope
Container Specs:
- Container ID: 101
- Compute: 1 Core
- Memory: 512MB RAM
- Swap: 512MB
- Root Disk: 4GB on
local-lvm - Features:
nesting=1,keyctl=1 - Network:
192.168.1.102onvmbr0 - Timezone:
Asia/Colombo - Tags:
analytics,community-script,monitoring - Autostart:
onboot=1
Monitored Targets:
- Hardware/Gateway: ZTE Router (
192.168.1.1) - External DNS: Cloudflare (
1.1.1.1), to verify ISP connectivity - Hypervisor: Proxmox Host GUI (
https://192.168.1.100:8006) - Internal DNS: Pi-hole (
192.168.1.101)
Complements, not replaces, the monitoring stack: Kuma answers "is it up?" with a synthetic check; Prometheus/Grafana answer "how's it trending?" with real resource metrics over time.
External Dependencies
- Gmail (SMTP + App Password): a dedicated system Gmail account sends
outbound alert emails. Standard plaintext alerts were insufficient, so
custom Liquid templating (
{% if status == 'up' %}) and inline CSS produce responsive, professional-looking alert cards instead — the raw template/CSS source lives in this repo's/templatesdirectory. - No Cloudflare Tunnel, no other external API.
Access & Security
- LAN: direct IP,
http://192.168.1.102:3001. - Reverse proxy:
https://kuma.lab.jaysynclab.comvia Nginx Proxy Manager, wildcard TLS. - Off-VLAN: reachable via Tailscale split-DNS, same as every other
*.lab.jaysynclab.comhost — confirmed working from a real off-VLAN device. (If it's ever unreachable off-VLAN, check that Tailscale is actually connected on the client first — split-DNS resolution only works while the tailnet connection is active.) - Public status-page API: deliberately public (no auth), by design —
jaysync-lab-site reads
/api/status-page/defaultand/api/status-page/heartbeat/defaultdirectly from the browser to render live per-service status dots and an aggregate "N/M services up" indicator, with no backend proxy in between.
Operational Notes
- Health check: the dashboard itself shows each monitor's live
heartbeat;
systemctl statuswon't show a unit namedkuma— check the running Node process directly if the web UI itself is unreachable. - No automated backup configured for
/opt/uptime-kuma's SQLite database (monitor definitions, history) — losing it means re-adding every monitor by hand from this page's "Monitored Targets" list (plus whatever's been added since).