On this page
A green homepage does not mean a server has spare capacity, and a high CPU reading does not necessarily mean visitors are experiencing an outage. Useful monitoring combines external availability checks with local resource measurements and an alert someone can act on.
This walkthrough deploys Uptime Kuma, adds a small set of meaningful checks, and connects incident times with Linux diagnostics. It also separates what Kuma measures from the resource telemetry that requires other tools.
Define availability and establish a shared clock
Uptime Kuma primarily tracks service availability, response time, and supported monitor-specific conditions. It is not a general-purpose historical CPU, memory, or disk metrics collector. Pair it with operating-system tools or a dedicated metrics platform rather than expecting a dashboard check to explain every slowdown.
Use the Unix Timestamp Converter below to translate incident epochs into readable times. It helps align an alert with application logs and host measurements, especially when systems display different time zones. Distinguish seconds from milliseconds before interpreting a timestamp.
Decide which visitor action defines success: loading a public article, completing an authenticated health check, or reaching an application dependency. Document the owner and an initial response action for each monitor. A dozen unexplained red indicators are less useful than three checks with clear meaning.
Deploy Kuma outside the server it watches
For meaningful failure isolation, run your monitor on another host or network. Kuma on the same VPS can report an application failure, but cannot notify you when its own machine loses power or connectivity. A separate monitoring host still needs its own backup and maintenance plan.
The Uptime Kuma project provides installation and supported-version guidance. Choose a supported release, review upgrade notes, and pin the tested image version before production deployment. The example uses the major-version tag as a starting point, not a promise of immutable builds.
services:
uptime-kuma:
image: louislam/uptime-kuma:2
restart: unless-stopped
ports:
- "127.0.0.1:3001:3001"
volumes:
- kuma-data:/app/data
volumes:
kuma-data:Store this as compose.yaml on the monitoring machine and start it with docker compose up -d. Review the Docker documentation for installation, volume management, and image updates on your operating system.
The loopback binding deliberately avoids exposing the dashboard to the internet. Use an SSH tunnel for setup, such as ssh -L 3001:127.0.0.1:3001 monitor@example.com, replacing the hostname with your monitoring host. Browse to the forwarded local port, create a unique administrator password, and configure additional supported account protections.
For ongoing shared access, use a properly secured HTTPS reverse proxy or private network. Do not publish a bare administration port just because a container starts successfully. Back up persistent application data using a supported procedure and test recovery on a separate instance.
Add checks that represent real service behavior
Create an HTTP monitor for https://example.com/ and require the expected success status. A redirect to a generic error page may still end in a successful status, so use an HTTP keyword check when a stable, public page marker provides stronger evidence.
Add a lightweight application health endpoint if you control the code. It should disclose no credentials or internal details. Decide whether it checks only the web process or also a critical dependency; deep dependency checks can create unnecessary load and make one failure generate many redundant alerts.
Start with an interval measured in tens of seconds or a minute, then adjust for your service needs and monitor capacity. Configure retries and notification channels so one lost packet does not wake someone unnecessarily, while sustained failure still produces a timely alert. Effective detection time depends on interval, timeout, retries, and scheduling.
- Check the public hostname to include DNS, TLS, routing, and the web service in one visitor-facing signal.
- Add a private-origin check only when the monitoring host has authorized access to that network.
- Use certificate-expiry notifications where supported, and test delivery instead of assuming configuration is sufficient.
- Label each monitor with its purpose and response owner, not only its URL.
Avoid putting secrets in public status pages or monitor names. A status page can inform readers without exposing internal hostnames, maintenance tokens, or database addresses. Keep detailed operational views private.
Collect host resource evidence alongside alerts
When a failure occurs, capture memory pressure, CPU activity, disk capacity, and recent service logs. On a systemd-based Linux server, the following read-only checks provide a quick starting point. Replace nginx if another service handles requests.
date -u '+%Y-%m-%dT%H:%M:%SZ'
timedatectl status
uptime
free -h
df -h
df -i
vmstat 1 5
systemctl --failed
journalctl -u nginx --since '20 minutes ago' --utc --no-pageruptime reports load averages, not CPU utilization percentages. Load can include tasks waiting on I/O, so interpret it alongside vmstat and service behavior. The first vmstat report generally summarizes time since boot; subsequent samples show the requested interval.
Free memory alone is not a reliable alarm because Linux uses RAM for reclaimable cache. Review available memory, swap activity, and kernel out-of-memory events. Likewise, a filesystem can run out of inodes before bytes; the inode cleanup guide covers that failure mode.
For retained graphs, add a dedicated collector such as Prometheus with a host exporter, or another maintained resource-monitoring system. Keep collectors private and limit access. The Prometheus documentation explains its metrics model; Kuma remains your availability and notification layer rather than becoming a substitute for that system.
Rehearse alerts and correlate an incident
Schedule a controlled test on a noncritical endpoint. Make it fail, confirm notification arrival, restore it, and verify the recovery message. Record the observed detection delay, including retries, rather than estimating it only from the configured interval.
Use the timestamp converter to align alert events with UTC logs. Confirm that host clocks are synchronized before drawing conclusions from a few seconds of apparent ordering. Note whether any pasted number is an epoch value or merely a duration.
During a real incident, compare public availability with local resources. An unreachable public URL with a healthy origin may indicate DNS, TLS, firewall, or routing trouble. High disk wait and slow requests suggest a different investigation than a clean host receiving a certificate error.
Write a short incident timeline with symptoms, evidence, action, and recovery verification. Tune noisy checks after understanding their cause, not by disabling alerts until the dashboard looks calm.
Review monitor ownership after infrastructure changes so retired endpoints do not generate noise and newly critical services receive an explicit check.
Key takeaways
- Separate availability from capacity: Kuma checks services; host diagnostics explain resource pressure.
- Monitor from another machine so an origin outage does not also silence the observer.
- Protect administration access, preserve persistent data, and test notification and recovery paths.
- Correlate synchronized timestamps with resource evidence before deciding what caused an outage.
Reach designers & developers at work
Put your product next to the tools people use every day. One sponsor per placement, no tracking pixels.
Become a sponsor