Skip to main content

The warden of your servers โ€” status, resources, cost/expiry and security of Linux hosts over SSH.

Project description

Vordr ๐Ÿบ

vordr โ€” the warden of your servers

In Norse lore, the Vรถrรฐr is the guardian spirit that follows each person from birth to death, watching without rest. Here, Vordr stands guard over your servers.

Vordr is a CLI that watches your Linux hosts over SSH and answers, in one place, the questions that matter day to day:

  • Are they up? โ€” state, uptime, load, RAM, disk and containers for every host.
  • Will I be charged? โ€” how long you've hosted each one, when the server renews and when the domain expires, and how much you spend per month. The feature that prevents the surprise charge.
  • Are they secure? โ€” failed logins, listening ports, fail2ban, pending updates and reboot-required.

No agents installed on the servers, no database, no secrets in the code: Vordr only needs your ~/.ssh/config.

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Vordr ยท server status                                                  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ host      โ”‚ state    โ”‚ uptime  โ”‚ load โ”‚ ram โ”‚ disk  โ”‚ docker โ”‚ expires โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ web       โ”‚ โ— online โ”‚ 2w 5d   โ”‚ 0.28 โ”‚ 32% โ”‚ 22%   โ”‚ 5/6    โ”‚ 53d     โ”‚
โ”‚ db        โ”‚ โ— online โ”‚ 4w 4d   โ”‚ 0.04 โ”‚ 18% โ”‚ 62%   โ”‚ 6/6    โ”‚ 6d  โš    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Why it exists

Anyone running a few servers ends up collecting loose commands and repeated logins to answer simple questions. Vordr folds that into a single layer that:

  1. looks at all hosts at once, with comparable metrics colored by threshold (load per CPU, disk/RAM %);
  2. warns before a renewal charges again;
  3. gives a quick security audit without logging into each machine.

Vordr collects metrics via small sh scripts that emit KEY=value (stable and testable) instead of parsing fragile colored output โ€” but it still offers a --raw mode that reproduces the native output of a status_command of yours, when you set one.

Install

Requires Python 3.11+ and the ssh client configured with the hosts you want to watch.

pipx install vordr          # recommended (isolated tool on PATH)
# or, for development:
pip install -e ".[dev]"

Quick start (just a token)

For cost and billing you don't need to configure anything: give a provider token and Vordr discovers your account's servers on its own.

vordr secret set hetzner   # or: vordr secret set vultr
vordr cost                 # lists the account's servers, with cost and age
vordr billing              # balance/credit and next charge

The config.toml is optional and only covers what the API can't know: a nice label, the SSH alias (for status/resources/security) or a pinned price that differs from the list price (promo/legacy). What you write in the config always wins over the API.

Configuration (optional)

Hosts are aliases from your ~/.ssh/config โ€” no IP, user or key is stored by Vordr. Each host has two lifecycle blocks: [hosts.X.server] (the hosting) and [hosts.X.domain] (the domain) โ€” both with all-optional fields, filled from the API/RDAP when you leave them blank.

vordr init        # wizard: imports servers from the API and maps SSH aliases

In a terminal, vordr init is a wizard: with a saved token, it lists the account's servers, suggests the SSH alias for each (reading your ~/.ssh/config) and asks whether there's a fixed price to pin โ€” generating the config without you writing TOML. In a pipe/CI, or without a token, it writes a commented template.

If a server has no SSH alias (you leave it blank, or write ssh = ""), it becomes billing-only: it shows in cost/billing, but status/resources/security ignore it (with a warning), since there's no way to contact it.

[thresholds]
warn_days = 14
critical_days = 7

[hosts.web]
ssh = "web"                   # alias in ~/.ssh/config
label = "Web"
# status_command = "my-status"   # optional: your script for `vordr status --raw`

  [hosts.web.server]          # the hosting
  provider = "Hetzner"
  since   = "2024-03-01"      # since when you've hosted (hosting age)
  expires = "2026-08-15"      # YYYY-MM-DD โ€” next server renewal
  cost = 6.99
  currency = "USD"
  cycle = "monthly"           # monthly | yearly

  [hosts.web.domain]          # the domain (optional)
  name = "web.example.com"
  registrar = "Cloudflare"
  expires = "2027-03-01"
  cost = 12.00
  currency = "USD"
  cycle = "yearly"

Vordr ships no hosts. Without a config and without a token, the commands just point you to the next step (vordr secret set or vordr init). The SSH-based commands (status, resources, security) need the aliases in the config; cost and billing work with just the token.

Usage

vordr status              # board of all hosts
vordr status web          # a single host
vordr status --watch 5    # refresh every 5s (full screen)
vordr status --raw        # host's native status_command output

vordr resources           # CPU/load, memory and disk in detail
vordr security            # audit: logins, failures, ports, fail2ban, updates
vordr cost                # table: hosting, server/domain renewal, cost/mo
vordr cost web            # detailed lifecycle panel for one host
vordr cost --offline      # no network: uses only the config
vordr billing             # balance/credit and next charge per provider
vordr hosts               # lists what's configured

vordr secret set hetzner  # stores the API token (chmod 600, outside the repo)
vordr secret status       # shows which providers have a token (masked)

All colors follow thresholds: green (ok), yellow (attention), red (critical) โ€” for disk/RAM, load per CPU and days until the charge.

cost automation (no typing dates)

cost fills in what you didn't provide โ€” and the config value always wins (handy for promo/legacy prices):

  • Domain: give just name in [hosts.X.domain] and the expiry comes from RDAP (public, no credential), cached in ~/.cache/vordr/rdap.json.
  • Server: with provider = "Hetzner" or "Vultr" and a token configured, the since (creation date) and the monthly cost come from the provider's API.

Supported providers: Hetzner (HCLOUD_TOKEN) and Vultr (VULTR_API_KEY). Tokens never live in the repository: they're read from an environment variable or from ~/.config/vordr/secrets.toml (chmod 600, in .gitignore), with env taking precedence. Configure with vordr secret set <provider>. Values coming from the network are tagged with (API) / (RDAP).

โš ๏ธ The API price is the list price of the type/plan โ€” if your account has a promo/locked value, set cost in the config (it wins). The Vultr API uses an IP allowlist and the token is full-access (there's no read-only): guard it well.

Balance and next charge (vordr billing)

With a token configured, vordr billing answers when and from where the charge comes โ€” each provider has a model:

  • Prepaid (e.g. Vultr): shows credit, the cycle's pending usage and the runway โ€” how many days the balance still covers (summing the account's server costs) and the date it runs out. Useful when running on a bonus/credit: the card is only charged once the balance hits zero. A summary of that line also appears in the footer of vordr cost.
  • Postpaid (e.g. Hetzner): the Cloud API doesn't expose a balance; billing shows the next charge date (1st of the next month) and the estimated monthly cost.

How it works

Layer File Responsibility
SSH transport src/vordr/ssh.py Runs remote commands (BatchMode, timeout).
Metric probe src/vordr/probe.py sh scripts โ†’ KEY=value โ†’ dataclasses.
Configuration src/vordr/config.py Reads the TOML; days/cost computation.
Domain expiry src/vordr/rdap.py Public RDAP + on-disk cache (no credential).
Provider API src/vordr/hetzner.py, src/vordr/vultr.py Read-only clients (since, price, balance).
Secrets src/vordr/secrets.py Tokens outside the repo (env > chmod-600 file).
Formatting src/vordr/format.py Pure functions (uptime, bytes, color thresholds).
CLI src/vordr/cli.py Typer + Rich; orchestrates everything in parallel.

Hosts are queried in parallel (ThreadPoolExecutor), so watching 2 or 10 servers takes essentially the same time.

Secure by design

  • Read-only: Vordr only runs read commands (/proc, df, ss, last, โ€ฆ).
  • No secrets in the repository: hosts are SSH aliases; the real config.toml stays out of version control (see .gitignore).
  • No interactive sudo: privileged checks use sudo -n (non-interactive) and degrade gracefully when there's no permission โ€” they never block the terminal.
  • BatchMode: if the key isn't available, it fails fast instead of prompting for a password.

Development

make dev      # pip install -e ".[dev]"
make lint     # ruff check .
make test     # pytest -q

The tests never touch the network: the SSH layer is injected (monkeypatch) and the parsing/formatting logic is tested against real samples of server output. A full sample config lives in examples/config.example.toml; the README hero is regenerated with python3 docs/make_hero.py.

License

MIT โ€” see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vordr-0.7.0.tar.gz (43.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vordr-0.7.0-py3-none-any.whl (36.3 kB view details)

Uploaded Python 3

File details

Details for the file vordr-0.7.0.tar.gz.

File metadata

  • Download URL: vordr-0.7.0.tar.gz
  • Upload date:
  • Size: 43.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for vordr-0.7.0.tar.gz
Algorithm Hash digest
SHA256 908a01e6672c708b72a1e19082581c6b9a5098cd35fd2d5a49fb73501460894c
MD5 a8b6877d2c382fab7898450046ff43b8
BLAKE2b-256 ce0f919bb3383ee3c81e8785c3afd4ce06ec73213f0876ed52f1b7910c350545

See more details on using hashes here.

Provenance

The following attestation bundles were made for vordr-0.7.0.tar.gz:

Publisher: publish.yml on gusta-ve/vordr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vordr-0.7.0-py3-none-any.whl.

File metadata

  • Download URL: vordr-0.7.0-py3-none-any.whl
  • Upload date:
  • Size: 36.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for vordr-0.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8d7e17b93ceaa7ac67b70ac4c645be4bcacca6b82188c56fd2886028a8e91c96
MD5 0cf33961c08b38b2d9376247abe9b4f4
BLAKE2b-256 923ce7517c073c70acd7f1ea417c06e022fb0ab92007da52984c768e4224762a

See more details on using hashes here.

Provenance

The following attestation bundles were made for vordr-0.7.0-py3-none-any.whl:

Publisher: publish.yml on gusta-ve/vordr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page