jkunz 144dd224ca fix: bound coordinator requests, cancel the poll delay on stop and fail a broken uninstall
- every coordinator request is bounded (30 s default, body included)
- stop() cancels the pending poll delay and clears its timer
- a failing `systemctl disable --now` fails the uninstall and keeps the unit file
- license renamed to license.md; readme one-liners use curl -fsSL
- install.sh and release.yml regenerated with @git.zone/cli 9.2.2 assets
2026-10-15 17:36:42 +00:00

@uptime.link/uptimerunner

uptime.link runner agent. It connects to an uptime.link instance, fetches assigned checks, executes them from the runner's network location, and reports results back.

It ships as a single executable (Node.js 26 single executable application) for Linux (x64, arm64; glibc 2.28 or later with libstdc++6 and libatomic1), macOS (x64, arm64; 13.5 or later) and Windows (x64). The executable trusts the operating system's CA store in addition to Node's bundled CAs.

Install

As root:

curl -fsSL https://code.foss.global/uptime.link/uptimerunner/releases/download/latest/install.sh | sudo bash

The installer is an asset of every release from 1.0.1 on. It downloads the executable of the newest release for the host's platform, verifies it against the release's SHA256SUMS.txt, and runs it with --version before it changes anything. It installs to /opt/uptimerunner/uptimerunner and links /usr/local/bin/uptimerunner. Pass --version vX.Y.Z for a given release or --install-dir <dir> for another directory:

curl -fsSL https://code.foss.global/uptime.link/uptimerunner/releases/download/latest/install.sh | sudo bash -s -- --version vX.Y.Z

Running it again updates the runner: a running uptimerunner service is restarted with the new version, and when any step fails the previous installation and service are restored. The config in /etc/uptimerunner is not touched. The installer needs curl and sha256sum or shasum.

On Linux the executable needs libstdc++6 and libatomic1 (Debian and Ubuntu: apt-get install libstdc++6 libatomic1); without libatomic.so.1 it exits with 127 and the installer stops before it changes anything.

Every release also carries the executables, their third-party notices and SHA256SUMS.txt as assets for a manual download: https://code.foss.global/uptime.link/uptimerunner/releases/download/<version>/uptimerunner-<os>-<arch> with <os> one of linux, macos, windows and <arch> x64 or arm64 (Windows: x64 only, uptimerunner-windows-x64.exe).

Configure

sudo uptimerunner config write \
  --url https://uptime.link \
  --runner-id edge-1 \
  --token <runner-token>

The config is written to /etc/uptimerunner/config.json (or UPTIMERUNNER_CONFIG) with mode 0600. UPTIMERUNNER_INSTANCE_URL, UPTIMERUNNER_RUNNER_ID, UPTIMERUNNER_TOKEN, UPTIMERUNNER_LABELS, UPTIMERUNNER_POLL_INTERVAL_MS and UPTIMERUNNER_MAX_CONCURRENT_CHECKS override its values.

Run

uptimerunner run

For systemd:

sudo uptimerunner service install
sudo uptimerunner service start

Runner Protocol

The runner polls:

GET /api/runner/v1/checks?runnerId=<runnerId>

The uptime.link instance returns:

{
  "checks": [
    {
      "id": "api-health",
      "type": "http",
      "plannedTime": 1760000000000,
      "url": "https://api.example.com/health",
      "expectedStatusCodes": [200],
      "expectedBodyIncludes": "ok"
    }
  ]
}

The runner reports:

POST /api/runner/v1/results

Supported check types:

  • http
  • tcp
  • assumption

Results report ok, not ok or timed out, and their timing echoes the job's plannedTime. The request and response shapes are the data types of @uptime.link/interfaces.

Development

pnpm install --frozen-lockfile
pnpm build                # type-check and compile to dist_ts/
pnpm test                 # tstest
pnpm run build:binary     # tsbundle + tssea: all executables in dist/binaries/
pnpm run dev --help       # run from source

Issue Reporting and Security

For reporting bugs, issues, or security vulnerabilities, please visit community.foss.global/. This is the central community hub for all issue reporting. Developers who sign and comply with our contribution agreement and go through identification can also get a code.foss.global/ account to submit Pull Requests directly.

S
Description
No description provided
Readme
141 KiB
0 Stars 3 Watchers 0 Forks
2026-10-15 12:58:41 +00:00
Languages
TypeScript 65.9%
Shell 25.6%
JavaScript 8.5%