Technical Article / Field Note

Your website returns HTTP 200 but fails users: what can Uptime Kuma detect?

Detect misleading HTTP 200 responses with Uptime Kuma keyword checks, secure deployment, controlled alert drills and local-volume backup.

Your website returns HTTP 200 but fails users: what can Uptime Kuma detect? technical article image

An open port and a successful HTTP response do not prove that a business page contains the right content. For an enterprise portal, knowledge base or read-only query page, Uptime Kuma can check a stable keyword in the response body and alert when that content disappears. This is a useful step beyond status-code monitoring. It does not execute browser JavaScript or prove that login, checkout or a database transaction works.

The examples below use the official Uptime Kuma 2.5.6 documentation and implementation. They assume a Linux host with working Docker Compose and an approved read-only HTTP endpoint. Pages requiring interactive login, CAPTCHA or client-side rendering need a different test design. These are documented operating examples, not a report of a customer deployment or a completed transaction test.

Separate connectivity, HTTP success and expected content

Check What it establishes What it can still miss
TCP connection The probe can connect to a port Error pages and broken application dependencies
HTTP status The final response meets the configured status rules Maintenance and login pages returning 200
HTTP keyword The returned body contains a case-sensitive literal substring Browser rendering, complete transactions and deeper data correctness

TCP reachability, HTTP status and expected response content are different checks

Figure: an illustration prepared for this article. The three checks complement one another; none alone proves a complete business transaction.

Choose content that appears only in a successful server response. A company name reused on the maintenance page is a poor marker. A heading that only appears after JavaScript runs may be absent from the raw response and unsuitable for this monitor type.

Our existing alert-handling article covers ownership and follow-through in Chinese. This guide focuses on designing one content check and validating its alert path.

Confirm the operating boundaries first

  • The probe must resolve and reach the target from its own network. For an internal service, place the probe in an authorized reachable segment; do not expose the application publicly just to make monitoring easier.
  • Separate the probe from the application it monitors. A shared host can lose both the service and its alarm system during one failure. A colocated trial does not provide host-outage coverage.
  • Use local persistent storage. The project explicitly does not support NFS for its data directory. This example uses SQLite in a local Docker named volume, not an external MariaDB deployment.
  • Establish an approved management route, backup location and notification recipient. Bind the management port to loopback and initialize through an SSH tunnel.

A real Dell PowerEdge850 server showing physical host, power and network dependencies

Photo: Rodzilla, Dell PowerEdge850, photographed in 2005; original on Wikimedia Commons, CC BY 2.5. External photograph, not a Yuqi site or this deployment. It illustrates that a monitoring host has its own physical failure domain; it is neither a hardware recommendation nor evidence that this configuration was tested.

Pin the release and restrict management access

All paths and domains below are examples. Start by checking both the Docker client/server connection and Compose. If either fails, stop and use your organization's approved Docker repair process; do not grant world access to the socket.

docker version
docker compose version
mkdir -p "$HOME/uptime-kuma"
cd "$HOME/uptime-kuma"

Expected result: Docker reports client and server information, and Compose reports its version. Save this configuration as compose.yaml in that directory. Unlike a default all-interface port mapping, this example binds only to loopback. It does not mount the Docker socket or use host networking.

services:
  uptime-kuma:
    image: louislam/uptime-kuma:2.5.6
    restart: unless-stopped
    ports:
      - "127.0.0.1:3001:3001"
    volumes:
      - uptime-kuma-data:/app/data
volumes:
  uptime-kuma-data:

Validate, pull and start the pinned image, then inspect its state and logs.

docker compose config --quiet
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=80 uptime-kuma

Expect a valid configuration, a running container and a loopback port mapping. A temporary health: starting state during initialization is not itself a failure. Repeated restarts, insufficient storage, data-permission errors or an all-interface binding must be fixed before adding production monitors. A running container does not establish that the monitored application is usable.

On your own workstation, open a tunnel to the authorized management host. Replace the account and host; choose another local port if 3001 is occupied.

ssh -N -L 127.0.0.1:3001:127.0.0.1:3001 ops@monitor-host.example.com

Open the tunneled local port in your browser, select SQLite in database setup, finish database initialization, then create the administrator and enable supported two-factor authentication. Public reverse-proxy access is a separate design decision, not a prerequisite of this minimal deployment.

Inspect the raw response before configuring the monitor

Run a baseline check from the probe host against an approved read-only page. Do not include credentials, cookies or notification secrets in command history or screenshots.

curl --connect-timeout 5 --max-time 10 \
  --silent --show-error --dump-header baseline.headers \
  --output baseline.html \
  https://portal.example.com/health/readiness
head -n 12 baseline.headers
grep -F -- 'PORTAL_READY_V1' baseline.html

The marker is illustrative. Ask the application owner for a stable literal substring in the real successful response. This command does not follow redirects. Expect HTTP 200 and a matching grep result. A 302 login redirect, 403 response or missing marker needs investigation, not a broader list of accepted status codes. A custom readiness endpoint must calculate dependency readiness; a permanently hard-coded success string proves nothing about those dependencies.

Create a dedicated test monitor of type HTTP(s) - Keyword. Field names may differ slightly by UI language.

Setting Example Interpretation
URL Approved read-only readiness page Use the same address as the baseline and record the probe location
Keyword Application success marker Case-sensitive literal substring, not a regular expression
Accepted Status Codes 200 only Do not count redirects or error responses as success
Max Redirects 0 This readiness endpoint should not redirect; use its final canonical address
Heartbeat Interval 60 seconds Adjust for load and detection needs
Retries 2 Two retries after the first failure; intermediate state can be PENDING
Retry Interval 60 seconds Actual timing also includes request duration, scheduling and delivery
Notifications Named recipient or duty channel Test delivery first, then run the controlled drill below

DNS, TLS and HTTP results reflect the probe's location. If a workstation succeeds while the container fails, compare their resolution, proxy, routes and certificate chains. Do not disable TLS validation as a default workaround. Use approved diagnostics rather than adding privileges to the monitoring container.

Exercise the alert path without stopping production

Controlled drill: change only a test keyword, observe DOWN, confirm notification and restore UP

Figure: a proposed controlled drill. The production service stays running; this illustration is not evidence of a completed test.

First establish stable UP status on the dedicated test monitor. Record the correct marker, probe location, channel and baseline time. A successful notification test proves delivery at that moment; it does not prove that a detected fault will traverse the whole alert path.

  1. Replace the test monitor's keyword with a drill marker absent from the response. Save it. Do not edit the business page or stop its server.
  2. Observe the first failure, any PENDING state and the transition to DOWN. Record when the recipient actually receives the alert. Do not promise an exact two-minute delay: request timeouts, retries, scheduling and delivery all contribute.
  3. Verify the message identifies the right monitor and reaches an accountable person. If the monitor never becomes DOWN, inspect the detection rules and retries. If it is DOWN but no message arrives, inspect notification binding and delivery.
  4. Restore the original keyword, wait for UP and check the configured recovery notification. Confirm that no drill keyword remains.
  5. Record detection and recovery timing before extending the pattern. Every production monitor still needs its own valid baseline.
Acceptance item Required evidence Stop condition
Normal baseline HTTP 200 with the correct raw-response marker Do not label the service available without it
Fault detection Absent marker causes the test monitor to reach DOWN Do not deploy the same rule pattern as accepted
Alert delivery Actual recipient receives the matching fault message Do not rely on the channel for duty coverage
Recovery Correct marker restores UP and configured recovery message is checked Do not record a complete drill
Probe failure domain An independent mechanism detects a missing probe Do not claim host-outage coverage from a colocated probe

This drill tests content mismatch, fault state, notification and recovery. It does not test a login transaction, power loss or a disconnected site.

Back up the complete data directory

Uptime Kuma v2 removed the old JSON Backup/Restore feature. For the SQLite/local-volume setup used here, schedule a maintenance window and stop the container before copying the complete data directory. Monitoring and notification are interrupted while the probe is stopped; inform duty staff and provide another monitoring path.

cd "$HOME/uptime-kuma"
docker compose stop uptime-kuma

Confirm the container has stopped, then use your approved Docker-volume backup procedure. Do not guess the real volume name: Compose prefixes depend on the project name. Inspect the actual mount first.

docker inspect "$(docker compose ps -a -q uptime-kuma)" \
  --format '{{range .Mounts}}{{if eq .Destination "/app/data"}}{{.Name}} {{.Source}}{{end}}{{end}}'

Store the complete data backup, Compose file and release number in an access-controlled location. Backups may contain monitoring credentials and notification secrets; never place them in a public repository. Restart the original instance after backup and recheck its baseline and notifications. Do not run cleanup commands that delete the volume.

docker compose start uptime-kuma
docker compose ps
docker compose logs --tail=80 uptime-kuma

Restore tests belong in an isolated environment with outbound access to production notification channels blocked, avoiding duplicate alerts. External MariaDB deployments require database-aware backup as well; a local directory alone is not a complete backup. Keep a recoverable pre-upgrade backup and do not feed a v2 data directory back into v1.

Frequently asked questions

Why does keyword monitoring fail when the page always returns 200?

The body may contain a maintenance page, login page, proxy-generated response or client-rendered shell. Inspect the response seen by the probe, including redirects and marker presence. A workstation browser is a different observation point.

Can this prove login or checkout works?

A single keyword check cannot prove a multi-step browser workflow or transaction correctness. Use appropriate synthetic transactions and business metrics, with safeguards against creating real orders or changing production data.

Can the probe run on the application server?

For a trial or limited local check, yes. It shares the application's failure domain. Host, uplink and site-outage coverage need an independently placed probe and a way to detect failure of the probe itself.

Why not use the latest image tag?

The official tag documentation says latest is deprecated and points to v1. This example pins 2.5.6. Evaluate upgrades against release notes, compatibility, backups and a maintenance window; a successful image pull does not establish upgrade success.

Technical sources

Version 2.5.6 README, monitor implementation, Docker image tags and v1-to-v2 migration and backup. Operational steps are examples derived from these sources, not a site-specific acceptance report.

Related solutions

Enterprise IT operations can help define probe placement and response ownership. Business continuity planning addresses failure domains and recovery exercises.

Further reading

If your monitoring dashboard is green but staff still cannot use a service, start with one approved read-only endpoint. Validate its response marker, accountable recipient and recovery message before expanding coverage.

Back to articles

Related solutions

Connect this topic to an implementation path

Backup and Disaster Recovery

Connect backup, deletion, ransomware, restoration and business-continuity articles with a recoverable data-protection design.

View solution →

IT Managed Services

Connect infrastructure maintenance and incident-management articles with a sustainable enterprise operating model.

View solution →

Network Equipment, Switching and Routing

Connect switching, routing, VLAN, PoE and network-refresh articles with a complete enterprise network delivery plan.

View solution →

Related Articles

Related reading

Back to All Articles