Files
npm-statuspage/README.md
Fredrik Johansson a300ea1b43
All checks were successful
Docker / build-and-push (push) Successful in 35s
Initial commit — status checker service
Polls Nginx Proxy Manager API for proxy hosts matching configurable
domain patterns (NPM_INCLUDE_PATTERNS), HTTP-checks each every 60s,
serves results as JSON (/api/status) and a terminal-aesthetic HTML
page (/). Port 3035.

NPM connection and domain filter patterns are fully configurable via
environment variables — see README and .env.example.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-07 21:44:49 +02:00

2.0 KiB

status

A lightweight HTTP status checker that sources its target list from Nginx Proxy Manager and serves results as JSON and a terminal-aesthetic HTML page.

Designed to run as a standalone public status page on its own subdomain — if your main site is down, the status page is still reachable independently.

How it works

  1. On startup (and every 10 minutes), fetches all enabled proxy hosts from the NPM API
  2. Filters to domains matching NPM_INCLUDE_PATTERNS
  3. HTTP-checks each host every 60 seconds
  4. Serves current results at / (HTML) and /api/status (JSON)

The HTML page auto-refreshes every 60 seconds.

Running locally

cp .env.example .env
# fill in NPM_EMAIL and NPM_SECRET
npm install
npm run dev

Environment variables

Variable Default Description
PORT 3035 Port to listen on
NPM_BASE_URL http://localhost:81 Base URL of your Nginx Proxy Manager instance
NPM_EMAIL NPM account email
NPM_SECRET NPM account password
NPM_INCLUDE_PATTERNS \.example\.com$ Comma-separated regex patterns; only domains matching at least one are checked

Docker

docker compose up -d

Uses the image from IMAGE in .env. For a local build:

docker build -t status:local .
IMAGE=status:local docker compose up -d

CI/CD

Gitea Actions workflow at .gitea/workflows/build.yml. Builds and pushes to the Gitea container registry on every push to main. Requires a TKNTKN secret (PAT with packages:write) in the repo settings.

API

GET /api/status
{
  "lastRefreshed": "2026-07-07T19:35:43Z",
  "hosts": [
    {
      "name": "example.com",
      "url": "https://example.com",
      "status": "up",
      "statusCode": 200,
      "latencyMs": 182,
      "checkedAt": "2026-07-07T19:35:43Z"
    }
  ]
}

status is "up" for any response (including 4xx — the server is reachable), "down" for connection errors and 5xx, "unknown" before the first check completes.