Install the components you operate¶
Use urthctl on the machine where you manage resources. Install urth-worker
in each network location from which you need measurements. Install the API and
web interface only if you operate your own control plane.
Override the control-plane address¶
These guides assume that the control plane runs at https://urth.example.org
and that urthctl and urth-worker are configured to use it by default. You can
omit the address from the normal examples. This is a configuration assumption
for these guides; an unconfigured source build can have a different default.
For another deployment, save a separate CLI profile during login:
urthctl --profile=other auth login --api-server-address=https://other.example.org
urthctl --profile=other get scenarios
The profile retains its endpoint. Select that profile for later commands. A profile's credential cannot be sent to a different endpoint by overriding its address after login. Authenticate a separate profile instead.
For a Worker, set the override in its service arguments:
install -d -m 700 "$HOME/.local/state/urth-worker/work"
urth-worker --working-directory="$HOME/.local/state/urth-worker/work" \
--token-file /secure/path/runner-token \
--client.api-server-address=https://other.example.org
The CLI flag is --api-server-address. The Worker flag is
--client.api-server-address. Broker addresses returned by the API take
precedence over --nats.url.
Use a matching release set¶
The release packaging defines archives for the Linux API and Worker, and for
urthctl on Linux and macOS, for amd64 and arm64. It also defines Debian
packages, snaps, and container images. Check the assets actually present in
your selected release. Availability of each channel and asset depends on the selected release.
Download an archive and checksums.txt from the same release. Compare its
SHA-256 digest with the listed digest. Extract the executable to a directory on
your PATH. Then check the command:
The archive names are urthctl_<version>_<os>_<arch>.tar.gz and
urth-worker_<version>_linux_<arch>.tar.gz. Use darwin for macOS.
Use the version string exactly as the release names it.
The native Worker container and Worker snap support native probes, including HTTP, TCP, DNS, ICMP, gRPC, REST, and HAR replay. They do not include browser probe support. ICMP also requires suitable host permissions. For browser scripts, follow Set up browser probes.
When using a container, provide a private token file and a persistent writable configuration volume. Give each installation its own volume. A replaced container must retain its installation key. Check the selected release's container guide for image and mount details.
Set up browser probes on a Linux host¶
Use a host Worker build that includes Puppeteer support. The native container and snap cannot acquire this capability by installing Node.js. Run the setup as the same operating-system user that runs the Worker. Start from the source checkout for your selected Urth release.
Install Node.js and npm versions compatible with that release's Puppeteer package. Copy the release's locked dependency files to the Worker directory:
install -d -m 700 "$HOME/.local/state/urth-worker/work"
cp worker/package.json worker/package-lock.json "$HOME/.local/state/urth-worker/work/"
cd "$HOME/.local/state/urth-worker/work"
npm ci
npx puppeteer browsers install chrome
Installation needs registry and browser-download access. Install the browser's host libraries for your Linux distribution. Use Puppeteer's system requirements and Linux troubleshooting instructions for the package version in your release. Do not assume that the current upstream requirements also apply to an older locked version.
Save this as browser-smoke.js in that working directory:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ headless: true });
try {
const page = await browser.newPage();
await page.goto('data:text/html,<title>Urth smoke test</title>');
if (await page.title() !== 'Urth smoke test') throw new Error('Unexpected title');
console.log('Browser smoke test passed');
} finally {
await browser.close();
}
})().catch(error => { console.error(error); process.exitCode = 1; });
node browser-smoke.js
urthctl run -f browser-smoke.js --puppeteer.headless \
--runner.working-directory="$PWD" --runner.timeout=30s
Expect Browser smoke test passed and a successful final probe result.
The first command checks the installed browser. The second checks Urth's
execution path. Resolve missing libraries, browser-cache permissions, or sandbox
configuration before enrolling the Worker. Keep the browser sandbox enabled.
The service user must retain access to the downloaded browser and packages.
Start the Worker with --working-directory set to this directory. Confirm that
it advertises Puppeteer support and that its Runner permits puppeteer jobs.
This smoke test does not check connectivity to your service; test the actual
workflow next.
Build from source¶
From an accessible Urth source checkout, use the Go toolchain required by
go.mod:
The source directory is named cmd/nats-worker; the packaged executable is
named urth-worker. The CLI and Worker must be compatible with your API release.
Follow Connect probers after installation.
Start a local development stack¶
Use a fresh PostgreSQL 18 database and a fresh NATS JetStream store. Earlier PostgreSQL versions and migration of existing Urth resources are unsupported. SQLite is not a supported alternative, even though an old API default names it.
The source quick start requires Go, Podman, jq, and Node.js/npm. The website
uses a private GitHub Packages dependency. Configure package read access outside
the repository before installing it. Use a separate terminal for each process:
In a fourth terminal:
The default development UI is http://localhost:3001. The API is
http://localhost:8080. The development Makefile bootstraps
admin@urth.example with password urth-dev-password. Use these credentials
only in an isolated development environment. The container targets bind host
ports; restrict access to the development host.
Use the quick start with this login command:
For a Worker on the same host, replace the HTTPS Worker command with:
install -d -m 700 "$HOME/.local/state/urth-worker/work"
./urth-worker --working-directory="$HOME/.local/state/urth-worker/work" \
--token-file /secure/path/runner-token \
--client.api-server-address=http://localhost:8080 \
--allow-insecure-api --nats.allow-insecure
The insecure flags permit loopback development only. Remote deployments require an HTTPS API and authenticated NATS over TLS. Do not use development bootstrap credentials, ephemeral stores, or these Makefile targets as a production setup. Security and release validation remain prerequisites for production use.