Guides / Private-network monitoring

Private-network monitoring

Monitor endpoints behind your VPN or firewall with the thump agent — outbound-only heartbeat pings, dead-man’s-switch semantics, no inbound ports.

On this page

Private-network monitoring

thump's cloud probes run on Cloudflare's edge — they can reach anything public, and nothing behind your VPN, VPC, or office firewall. The thump agent closes that gap without opening a single inbound port.

How it works

The agent is a subcommand of the CLI that runs inside your private network:

  1. On a fixed cadence it performs local HTTP checks against your internal endpoints.
  2. Every check that passes pings a thump heartbeat (outbound HTTPS only).
  3. A check that fails deliberately withholds its ping. The heartbeat goes late, and thump opens an incident through the exact same pipeline as any other monitor — alert channels, reminders, escalation, status pages, everything.

Dead-man's-switch semantics mean the failure modes compose correctly: an endpoint going down, the agent crashing, the host losing power, or the network dropping all look the same from outside — the pings stop, and you get paged. There is no state to reconcile and no API for the agent to poll.

Setup

  1. In the dashboard, create one heartbeat per internal endpoint you want covered (Heartbeats → New). Set the expected interval to your agent cadence (60s cadence → 1 minute interval works well with the default tolerance). Copy each heartbeat's ping URL.
  2. Write an agent config file, one check per endpoint:
{
  "intervalSeconds": 60,
  "checks": [
    {
      "name": "intranet wiki",
      "url": "http://wiki.internal:8080/health",
      "expectStatus": 200,
      "heartbeatUrl": "https://thump.dev/ingest/heartbeats/<token>"
    },
    {
      "name": "warehouse db admin",
      "url": "https://pgadmin.corp.local/login",
      "bodyContains": "Sign in",
      "timeoutMs": 5000,
      "heartbeatUrl": "https://thump.dev/ingest/heartbeats/<token2>",
      "heartbeatSecret": "<signing secret, if set on the heartbeat>"
    }
  ]
}
  1. Run it:
thump agent --config ./thump-agent.json

--once runs a single round and exits (0 = all passed, 2 = something failed) — useful for cron-style scheduling or a smoke test.

Check options

FieldDefaultMeaning
urlrequiredInternal endpoint to check (http/https)
heartbeatUrlrequiredThe thump heartbeat ping URL to report to
nameURL hostLabel in agent logs
methodGETHTTP method
timeoutMs10000Per-check timeout (100–120000)
expectStatusany &lt; 400Exact status code required
bodyContainsSubstring the response body must contain
heartbeatSecretSigns pings with GitHub-format X-Hub-Signature-256
intervalSeconds60 (top level)Cadence for all checks; minimum 10

Signed pings

If a heartbeat has a signing secret configured, set the same value as heartbeatSecret in the check. The agent signs the exact ping body with HMAC-SHA256 (X-Hub-Signature-256: sha256=<hex>) — unsigned or tampered pings are rejected, so a leaked ping URL alone can't fake liveness.

Running it for real

Anything that keeps a process alive works. A systemd unit is the usual answer:

[Unit]
Description=thump private-network agent
After=network-online.target

[Service]
ExecStart=/usr/local/bin/thump agent --config /etc/thump/agent.json
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Run one agent per network segment. Agents are stateless — replacing the host is just starting the binary somewhere else with the same config.