Agent index (llms.txt) — fetch this first, then the page it names.
orama node
Install, run, upgrade and remove nodes. Every command and flag below comes from the orama command tree, so it matches the binary.
Global conventions are on the CLI overview.
orama maint node
Install, stage, recover and migrate nodes
orama maint node
Node commands for maintainers and for the installer. Install and stage a release on this machine, simulate the auto-update decision, recover a cluster that lost its raft quorum, migrate older state, apply gateway schema migrations, and enroll or unlock an OramaOS node.
Subcommands: autoupdate, enroll, install, migrate-conf, migrate-raft-id, recover-raft, schema, stage-archive, unlock
orama maint node autoupdate
Decide whether a newer release should be installed
orama maint node autoupdate [flags]
Report what this cluster should do with a candidate release. This answers the question for the values you give it and changes nothing. The agent that asks it of the cluster's real state, and acts, is 'orama node autoupdate run'. The default mode is notify: a newer verified release is reported and not installed. auto means the node may install, and only when the cluster is healthy, the release is newer, and the maintenance window is open. A release that fails TUF verification, including a rolled-back snapshot or an expired timestamp, is refused. So is a downgrade and a release a previous health-gate failure marked bad. A validator (--role validator) is never auto: on auto the decision is skip, with the reason, and the command exits 0; chain upgrades are staged explicitly with 'orama maint global stage-oramad'.
| Flag | Default | Description |
|---|---|---|
--bad | false | candidate was marked bad by a failed health gate |
--candidate | — | version being considered |
--channel | stable | release channel |
--current | — | version installed now |
--degraded | false | cluster is already degraded |
--healthy-voters | 2 | raft voters that are up |
--mode | notify | off, notify, or auto |
--role | cluster | this node's role: cluster or validator |
--verify | — | simulated TUF failure: rollback, freeze, threshold, or hash |
--voters | 3 | raft voters |
--window | — | maintenance window as start-end hours, for example 1-5 |
Subcommands: run
orama maint node autoupdate run
Look for a newer release on the cluster's channel and act on it (requires sudo)
orama maint node autoupdate run
Run this node's auto-update agent once. orama-autoupdate.timer runs it every
15 minutes on every node; running it by hand does the same thing.
The agent reads the cluster's policy (orama maint cluster settings show): auto-update
off, notify or auto; the channel; the maintenance window; the release repository.
It does nothing unless the cluster stored a release repository and this node
adopted a release root (orama node trust add-root).
It fetches the channel's metadata and verifies it against the adopted root:
every role at its threshold, an unexpired timestamp, a snapshot no older than the
newest this node has accepted, and the channel's own keys for the channel's own
paths. What does not verify is refused, reported in 'orama status', and never
installed.
With notify (the default) a newer release is reported in 'orama status' and
nothing is installed. With auto the node installs it only when
- the cluster is not degraded and a majority of the raft voters are up;
- the hour is inside the maintenance window, if there is one;
- no node has failed the release (a failure anywhere marks the release bad for
every node, until a newer release supersedes it);
- it is this node's turn in the rollout plan: followers first, the leader
last, nameservers spaced, one node at a time;
- it holds the cluster-wide rollout lock.
The install is 'orama maint node stage-archive --release-only', keeping the release it
replaces, then 'orama node upgrade --restart', then the health gate. If the
upgrade or the gate fails, the previous release is put back and the node is
upgraded onto it again; the release is then marked bad for the cluster. A
validator (a machine that runs the chain) is never installed automatically.
If a run is killed in the middle of an install, the next run finishes it first
(the intent is in /var/lib/orama-autoupdate/install-intent.json), whatever the
policy now says. One agent runs at a time on a machine.orama maint node enroll
Enroll an OramaOS node into the cluster
orama maint node enroll [flags]
Enroll a freshly booted OramaOS node into the cluster. The OramaOS node prints a registration code on its console. Provide that code along with an invite token. The Gateway pushes cluster configuration (WireGuard, secrets, peer list) to the node, sealed under the code. The code is not served over the network. A GET on port 9999 used to return it. Usage: orama maint node enroll --node-ip <ip> --code <code> --token <invite-token> --gateway <url> --gateway must be an https:// URL: the invite token is a credential and is never sent in the clear. The node must be reachable over the public internet on port 9999 (enrollment only). After enrollment, port 9999 is permanently closed and all communication goes over WireGuard.
| Flag | Default | Description |
|---|---|---|
--code | — | Registration code from the node's console (required) |
--env | production | Environment name |
--gateway | — | Gateway URL (required, e.g. https://gateway.example.com) |
--node-ip | — | Public IP of the OramaOS node (required) |
--token | — | Invite token for cluster joining (required) |
orama maint node install
Install production node (requires sudo)
orama maint node install [flags]
Install and configure an Orama production node on this machine. For the first node, this creates a new cluster. For subsequent nodes, use --join and --token to join an existing cluster. Run it on the node itself with sudo, or from your own machine with --remote to drive the install over SSH against --vps-ip. Which of the two happened used to be decided by whether you had used sudo. The build archive must be extracted at /opt/orama and signed by a wallet in the node's trust anchor, /etc/orama/archive-signers. A genesis install creates the anchor from --operator-wallet (required) before it verifies the archive; a joining node takes it from the cluster in the join response. With --remote, --archive names the build: it is verified on this machine against --operator-wallet before it is uploaded.
| Flag | Default | Description |
|---|---|---|
--acme-ca | — | ACME directory for TLS certificates: letsencrypt (production, the default), letsencrypt-staging (clusters rebuilt many times a week) or an https URL |
--archive | — | With --remote: the build archive to upload, verified here against --operator-wallet first |
--base-domain | — | Base domain for deployment routing (e.g., example.com) |
--ca-fingerprint | — | SHA-256 fingerprint of the gateway's TLS cert; the invite carries this, so it is only needed to override it |
--domain | — | Domain for HTTPS (auto-generated for non-nameserver nodes if omitted) |
--dry-run | false | Show what would be done without making changes |
--environment | — | Environment name (devnet, testnet, etc.) |
--expect-archive-signers | — | When joining: the archive signers the cluster must send (comma-separated); the archive is verified against them before the join |
--force | false | Force reconfiguration even if already installed |
--host-key | — | Expected SSH host-key fingerprint (SHA256:...) for --remote; omit to confirm it interactively |
--ipfs-addrs | — | Comma-separated multiaddrs of existing IPFS node |
--ipfs-cluster-addrs | — | Comma-separated multiaddrs of existing IPFS Cluster node |
--ipfs-cluster-peer | — | Peer ID of existing IPFS Cluster node |
--ipfs-peer | — | Peer ID of existing IPFS node to peer with |
--join-sni | — | Server name to present to --join; the invite carries it, so it is only needed to override it |
--join | — | Gateway to join; the invite carries this, so it is only needed to override it |
--nameserver | false | Make this node a nameserver (runs CoreDNS + Caddy) |
--node-names-zone | — | Zone this node's cluster publishes node identification names under, strictly below --base-domain (for example nodes.<base-domain>); omit to keep the zone node.yaml carries |
--operator-wallet | — | Operator wallet address |
--peers | — | Comma-separated list of bootstrap peer multiaddrs |
--release-repo | — | When creating a cluster: the https release repository to store as its release_repo setting, so the auto-update agent has one to look in; a setting the cluster already has is kept |
--remote | false | Install the machine at --vps-ip over SSH, instead of this machine |
--skip-checks | false | Skip minimum resource checks (disk, RAM, CPU) |
--skip-firewall | false | Skip UFW firewall setup (for users who manage their own firewall) |
--ssh-user | — | SSH user for remote management |
--token | — | Invite from 'orama maint invite'; it carries the gateway to join and the certificate to pin |
--update-channel | — | When creating a cluster: the release channel (nightly, main, dev/<branch>) to store as its update_channel setting; a setting the cluster already has is kept |
--vps-ip | — | Public IP of this VPS (required) |
orama maint node migrate-conf
Register nodes.conf nodes with your wallet
orama maint node migrate-conf [flags]
One-time migration: reads nodes from nodes.conf for an environment and registers each with your wallet via the gateway API. After migration, these nodes will appear in 'orama nodes' output. Requires: orama auth login (for API authentication)
| Flag | Default | Description |
|---|---|---|
--env | — | Environment to migrate (default: active) |
orama maint node migrate-raft-id
Move nodes to stable, peer-id-based raft identities (one-time)
orama maint node migrate-raft-id [flags]
Give each node a raft identity that survives an address change. RQLite defaults a node's raft id to its raft advertise address, so identity has been a function of routing: give the same machine a new overlay address — a replacement, a WireGuard re-provision, a 10.0.0.x reassignment — and it mints a new raft id, joins as a SECOND member, and the old entry stays in the configuration as a voter nothing can reach. Two such events on a five-voter cluster leave quorum at 3-of-7 with five live voters; one more failure freezes the registry. RQLite cannot rename a member in place, so this is a deliberate migration rather than something an upgrade does silently. Nodes are migrated ONE AT A TIME. For each: the quorum arithmetic is checked, the old id is removed from the raft configuration and tombstoned, the node's local raft state is discarded, and it rejoins under its libp2p peer id and replicates back from the leader. The next node is not touched until the previous one is back in the configuration. Safe to re-run: nodes already on a stable id are skipped, so an interrupted run continues where it stopped. Examples: orama maint node migrate-raft-id --env testnet --dry-run orama maint node migrate-raft-id --env testnet orama maint node migrate-raft-id --env testnet --node 203.0.113.4
| Flag | Default | Description |
|---|---|---|
--dry-run | false | Report what would change and exit |
--env | — | Target environment [required] |
--force | false | Skip the confirmation prompt |
--node | — | Migrate only this public IP. Default: every node that needs it |
orama maint node recover-raft
Recover RQLite cluster from split-brain
orama maint node recover-raft [flags]
Recover the RQLite Raft cluster from split-brain failure.
One node's data is kept. Every other node's raft log and database are DELETED
and rebuilt from it. Nothing is backed up: there is no copy to restore from
afterwards, and the deleted nodes' data is gone. Take a backup yourself first
if the surviving node might not be the right one.
What happens:
1. Stop orama-node on every node
2. Reset the kept node to a single-member cluster, preserving its data,
raft log and raft term
3. Start it and confirm it comes back as Leader with its data intact
4. Delete raft.db, raft/, db.sqlite (+shm/wal) and wsnapshots (rsnapshots) on every other
node, and record the kept node as the member each one re-joins
(data/cluster-membership.json)
5. Start them one at a time; each pulls a full snapshot from the kept node
6. Verify cluster health
Which node is kept decides which copy of the data survives. Without --leader
the command reads every node's applied index, keeps the furthest ahead, and
prints what each one reported before asking you to confirm. --leader overrides
that.
Use --leader-raft-addr when quorum is already lost and rqlite is not answering
anywhere, so the leader's raft address cannot be read from the cluster.
This is a DESTRUCTIVE operation. Use --force to skip confirmation.
Examples:
orama maint node recover-raft --env testnet
orama maint node recover-raft --env testnet --leader 203.0.113.4
orama maint node recover-raft --env devnet --leader-raft-addr 10.0.0.1:10101 --force| Flag | Default | Description |
|---|---|---|
--env | — | Target environment (devnet, testnet) [required] |
--force | false | Skip confirmation (DESTRUCTIVE) |
--leader-raft-addr | — | Explicit leader raft address host:port (e.g. 10.0.0.1:10101). Use when quorum is already lost so the leader can't be auto-resolved; bypasses the live-Leader check. |
--leader | — | IP of the node whose data to keep; default is the node with the highest applied index |
orama maint node schema
Inspect and apply gateway schema migrations against the local RQLite
orama maint node schema [flags]
Schema lifecycle commands. The gateway binary embeds a set of SQL migrations. Each migration is numbered; the highest number is the schema version the binary requires. After deploying a new gateway binary, run 'orama maint node schema apply' on every namespace's RQLite to bring the schema up to date — otherwise function deploys fail at runtime with cryptic missing-column errors.
| Flag | Default | Description |
|---|---|---|
--dsn | — | RQLite DSN (default: this node's index rqlite from /opt/orama/.orama/configs/node.yaml) |
Subcommands: apply, status
orama maint node schema apply
Apply pending migrations to the local RQLite
orama maint node schema apply [flags]
Apply every embedded migration not yet recorded in schema_migrations. Each migration runs as one transaction together with its schema_migrations row, so it is applied and recorded, or not applied at all. A statement whose effect is already in place (an existing column, table or index, left by an older engine that applied migrations statement by statement) is skipped. Any other error aborts the run at that migration, which leaves no trace; re-running is safe because each migration is independently versioned.
| Flag | Default | Description |
|---|---|---|
--yes | false | Skip the confirmation prompt |
orama maint node schema status
Show required vs applied schema version + pending migrations
orama maint node schema status
orama maint node stage-archive
Verify a pushed build archive and put it in place (run by 'orama maint push')
orama maint node stage-archive [flags]
Verify a build archive against this node's trust anchor, /etc/orama/archive-signers,
and only then replace the archive files under /opt/orama with it.
'orama maint push' runs this on every node with the node's installed orama. The
archive is extracted into a private directory, its manifest signature must
recover to a trusted signer and every file must match the signed manifest;
anything else leaves /opt/orama untouched. The replacement is undone if any
step of it fails, and holds the lock install and upgrade take on /opt/orama.
--trust-signers creates the anchor on a node installed before archives were
signed, and only after the archive has verified against those addresses. It
never changes an existing anchor.
--release-metadata and --release-target opt in to the release root adopted at
/etc/orama/release-root.json. Before anything is extracted, the archive file
must be that target in the TUF metadata: the root signs timestamp, snapshot and
targets, the timestamp is unexpired, the snapshot is not older than the one
recorded in /etc/orama/release-seen.json, and the file has the target's length
and hashes. Any failure refuses the archive; the wallet check is not tried
instead. An archive that passes is then verified against the trust anchor as
above: the release root is required in addition to it, not in place of it.
--release-only is the one case where the release root is enough: the archive
is an unsigned release (the CI build), it must not name signers or a release
root, and the node records in /etc/orama/release-staged.json that it was staged
through the release root, which is what lets 'orama node upgrade' install it.
A channel target ('nightly/orama-...') is a target of the top-level targets
metadata, under its channel's path prefix.| Flag | Default | Description |
|---|---|---|
--archive | — | The pushed archive on this node [required] |
--release-metadata | — | Directory holding timestamp.json, snapshot.json and targets.json; requires --release-target |
--release-only | false | Accept the archive on the release root's checks alone, without a wallet signature (an installed node; needs --release-metadata and --release-target) |
--release-target | — | Name the archive has in the release targets metadata; requires --release-metadata |
--trust-signers | — | Create a missing trust anchor with these addresses (nodes installed before archive signing only) |
orama maint node unlock
Unlock an OramaOS genesis node
orama maint node unlock [flags]
Manually unlock a genesis OramaOS node that cannot reconstruct its LUKS key via Shamir shares (not enough peers online). This is only needed for the genesis node before enough peers have joined for Shamir-based unlock. Once 5+ peers exist, the genesis node transitions to normal Shamir unlock and this command is no longer needed. The encrypted genesis key is written where the node was created, and the OramaOS agent does not serve it, so --key-file is required. The command used to try fetching it from the node first, on a path the agent has never served, and spent ten seconds timing out before telling you to pass the flag. Usage: orama maint node unlock --genesis --node-ip <wg-ip> --key-file <path> The node must be reachable over WireGuard on port 9998.
| Flag | Default | Description |
|---|---|---|
--genesis | false | Confirm genesis node unlock |
--key-file | — | Path to the encrypted genesis key file (required) |
--node-ip | — | WireGuard IP of the OramaOS node (required) |
orama node
Node operator commands
orama node
Operate Orama nodes, both the one on this machine and the fleet you own. Local, run on the node itself and needing root (sudo): uninstall, upgrade, start, stop, restart, status, logs, doctor, report, invite, trust, tls status Remote, run from your machine and reaching nodes over SSH: list, setup, remove, wipe, dns delegation Installing a node's software, staging an archive, auto-update, recovery and migration are maintainer commands: see 'orama maint node'.
Subcommands: dns, doctor, invite, list, logs, report, restart, start, status, stop, tls, trust, uninstall, upgrade, wipe
orama node dns
Cluster DNS: what the outside world needs to reach its nameservers
orama node dns
Subcommands: delegation
orama node dns delegation
Print the NS and glue records to create at the parent zone
orama node dns delegation [flags]
Print exactly the records the operator must create at the parent zone (or registrar) so the internet reaches this cluster's nameservers: one NS record per nameserver, and the glue A record that gives each nameserver its address. Nameserver slots (ns1, ns2, …) are claimed by the --nameserver nodes as they come up, so which address holds which name is only known to the cluster. This reads it from the cluster over SSH. Only slots whose glue the cluster has written are listed — the same set the cluster's own zone publishes. After the records it asks DNS whether the parent zone returns them, and says which NS or glue record is missing or points at another address. The answer is stored on the environment (environments.json), replacing the last result for the domain. A resolver that cannot answer is reported and nothing is stored. --json adds "delegated" and "findings" to each domain. Run it again after adding or removing a nameserver, and update the parent zone to match. See orama.network/docs/operator/nameserver.
| Flag | Default | Description |
|---|---|---|
--cloudflare-token-file | — | Create or update the NS and glue records in the parent Cloudflare zone, then check DNS |
--env | — | Environment to read (devnet, testnet, …) [required] |
orama node doctor
Diagnose common node issues
orama node doctor
Run a series of diagnostic checks on this node to identify common issues with services, connectivity, disk space, and more.
orama node invite
Manage invite tokens for joining the cluster
orama node invite [flags]
Generate invite tokens that allow new nodes to join the cluster. Running without a subcommand creates a new token (same as 'invite create').
| Flag | Default | Description |
|---|---|---|
--expiry | 1h0m0s | How long the token stays valid |
--raw | false | Print only the invite, for scripts (orama node setup --join-via reads it this way) |
orama node list
List your nodes across environments
orama node list [flags]
List all nodes owned by your wallet. Queries the network API with your stored credentials, falling back to nodes.conf. Requires: orama auth login (for API-based resolution)
| Flag | Default | Description |
|---|---|---|
--env | — | Filter by environment (default: active environment) |
orama node logs
View production service logs
orama node logs <service> [flags]
Stream the journal of one service on this node. <service> is an alias or a unit name. A tenant service is a systemd template instance, so name it in full: orama node logs orama-namespace-olric@anchat --since takes a window rather than a line count, which is what a diagnostic that greps for a periodic line needs: orama node logs node --since -30min | grep 'WireGuard peer sync completed' Aliases: caddy, cluster, coredns, gateway, ipfs, ipfs-cluster, node, olric, rqlite, turn
| Flag | Default | Description |
|---|---|---|
--since | — | Show entries newer than this, e.g. -30min or "2 hours ago" (overrides --lines) |
-f, --follow | false | Stream new log lines as they arrive |
-n, --lines | 50 | How many lines of history to show |
orama node remove
Remove one node from the cluster, then erase it (replaced by orama remove)
orama node remove [flags]
The old path of 'orama remove', which is the command to use: this one runs it (--force is --yes) and prints a notice. The removal is the same: the quorum arithmetic for every raft cluster the node votes in, the tombstone, the retirement and the wipe, plus the chain: a node in the validator set is refused unless --drop-validator, and a node with the global layer needs --chain-node-id or --no-chain. See 'orama remove --help'. Examples: orama node remove --env testnet --node 203.0.113.4 --dry-run # Show the plan only orama node remove --env testnet --node 203.0.113.4 orama node remove --env testnet --node 203.0.113.4 --offline # VPS already deleted orama node remove --env testnet --node 203.0.113.4 --force
| Flag | Default | Description |
|---|---|---|
--chain-id | — | The chain id you expect, for a network that is on no registry network (one from the registry already names it); the wallet signs for no other chain |
--chain-node-id | — | The node's id in the chain's node registry: retire it there before removing it |
--drop-validator | false | Remove the node although it signs for the validator set; its consensus key is erased with it |
--dry-run | false | Print the quorum impact and the statements, change nothing |
--env | — | Target environment (devnet, testnet) [required] |
--force | false | Skip confirmation (DESTRUCTIVE) |
--no-chain | false | Leave the node's chain registration alone (its bonds stay locked until you retire it) |
--node | — | Public IP of the node to remove [required] |
--nuclear | false | When wiping, also remove shared binaries, the Tor package and the system accounts Orama created |
--offline | false | The node is already gone: retire it cluster-side only, do not try to wipe it |
orama node report
Output comprehensive node health data as JSON
orama node report [flags]
Collect all system and service data from this node and output as a single JSON blob. Designed to be called by 'orama status' over SSH. Requires root privileges for full data collection.
| Flag | Default | Description |
|---|---|---|
--pretty | false | Indent the JSON for reading, instead of one line |
orama node restart
Restart all production services (requires sudo)
orama node restart [flags]
Restart all Orama services. Stops in dependency order then restarts. Includes explicit namespace service restart. The auto-update timer, and a run of the update agent already in progress, are stopped for the restart, and the timer is started again once the node is serving, so the update agent never runs against a node that is down. When the restart fails or the node does not come to serve, the timer stays stopped (starting it would fire the agent at once against a node that is down) and the output names the command that starts it. An interrupt, a terminate or a hangup finishes the restart, then starts the timer if the node serves; a timer that was stopped stays stopped. Use --force to bypass quorum safety check.
| Flag | Default | Description |
|---|---|---|
--force | false | Bypass quorum safety check |
orama node setup
Set up a fresh VPS as an Orama node (use orama setup)
orama node setup [flags]
Use "orama setup": it does this for every machine you give it, and the rest of joining the
network as well. This command stays for now and installs the cluster node only.
Bootstrap a fresh VPS into a running Orama node in one command.
Creates an SSH key in rootwallet, installs it on the VPS, uploads the binary
archive, and runs the node install. For the first node, use --genesis to
create a new cluster.
Examples:
# Genesis node (first node, creates new cluster).
# Store the VPS login first: rw vault add 203.0.113.4 (username root).
# --password is a switch; it reads that login. --archive is the path
# "orama maint build" printed.
orama node setup --ip 203.0.113.4 --password --env devnet \
--base-domain orama-devnet.network --role nameserver --genesis \
--archive /tmp/orama-<version>-linux-amd64.tar.gz
# From a published release: no checkout, no Go or zig. The root is the
# release signers' key set you decided to trust; the cluster adopts it.
orama node setup --ip 203.0.113.4 --password --env mycluster \
--base-domain cluster.example.com --role nameserver --genesis \
--release 0.3.1 --release-repo https://releases.example.org/tuf --release-root ./root.json
# Join existing cluster
orama node setup --ip 203.0.113.8 --password --env devnet \
--base-domain orama-devnet.network \
--archive /tmp/orama-<version>-linux-amd64.tar.gz
# Key-only VPS (no password login): install the RootWallet key once
# with the key that opens it today. Do not pass --password as well.
orama node setup --ip 203.0.113.8 --user ubuntu --bootstrap-key ~/.ssh/id_ed25519 \
--env devnet --base-domain orama-devnet.network \
--archive /tmp/orama-<version>-linux-amd64.tar.gz
# Join as nameserver
orama node setup --ip 203.0.113.12 --password --env devnet \
--base-domain orama-devnet.network --role nameserver \
--archive /tmp/orama-<version>-linux-amd64.tar.gz| Flag | Default | Description |
|---|---|---|
--acme-ca | — | ACME directory for the node's TLS certificates (passed to node install): letsencrypt, letsencrypt-staging or an https URL |
--archive | — | Build archive to install — the path orama maint build printed [required]; a node already running this exact build is not re-uploaded |
--base-domain | — | Base domain for the network |
--bootstrap-key | — | SSH private key that opens the VPS today (key-only images, e.g. --user ubuntu); used once to install the RootWallet key, never stored |
--channel | — | Release channel to read (default stable); with --release |
--env | — | Target environment (default: active) |
--gateway | — | Gateway URL of the cluster to join (default: the environment's): its domain, e.g. https://orama-devnet.network; the invite is minted through one of its nodes and pins that node's certificate |
--genesis | false | Create a new cluster (first node) |
--host-key | — | Expected SSH host-key fingerprint (SHA256:...) of the VPS; omit to confirm it interactively |
--ip | — | Public IP address of the VPS (required) |
--join-via | — | user@ip of a node already in the cluster; the invite is minted there over SSH (no 'orama auth login' needed) |
--password | false | Bootstrap over password login; the password is read from your RootWallet vault login for the IP (rw vault add <ip>), never from the command line |
--release-repo | — | https URL of the release repository (TUF metadata and archives); with --release |
--release-root | — | The TUF root.json of the release signers you trust, checked out of band; with --release. The cluster adopts it |
--release | — | Install this published release version instead of an archive you built: it is fetched from --release-repo, verified against --release-root, then signed by your RootWallet |
--role | node | Node role: node or nameserver |
--user | root | SSH user on the VPS |
orama node start
Start all production services (requires sudo)
orama node start
orama node status
Show the service status of the node on this machine
orama node status
Report the systemd units of the Orama node installed on this machine. For the health of your whole fleet from your own machine, use 'orama status'.
orama node stop
Stop all production services (requires sudo)
orama node stop [flags]
Stop all Orama services in dependency order and disable auto-start. Includes namespace services, global services, and supporting services. Use --force to bypass quorum safety check.
| Flag | Default | Description |
|---|---|---|
--force | false | Bypass quorum safety check |
orama node tls
This node's TLS certificates
orama node tls
Subcommands: status
orama node tls status
Show whether this node holds its certificates, and why not (requires sudo)
orama node tls status
Report the certificate of every name this node's Caddy manages: the base domain and its wildcard, and any site of its own. For each name it says whether Caddy serves an issued certificate, who issued it and when it expires. When it does not, it says what the certificate authority last answered to the order, read from Caddy's log: the ACME problem type (for example rateLimited), the CA's message and, when the CA gave one, the time it will accept a new order. A rate limit shows here and nowhere a client can see: the client's only symptom is "tls: internal error". Reads the journal of orama-namespace-caddy@index, so it needs root. --json prints the same as a document with a "names" list. See orama.network/docs/operator/tls-certificates.
orama node trust
Manage what this node accepts code from, besides its operator's wallet
orama node trust
Subcommands: add-root
orama node trust add-root
Adopt a TUF release root on this node (requires sudo)
orama node trust add-root <root.json> [flags]
Adopt a TUF release root as /etc/orama/release-root.json. A node trusts its operator's wallet by default (/etc/orama/archive-signers). A cluster may also trust a release root: a set of keys whose threshold signature on release metadata makes an archive installable without the operator building and signing it. The Orama release root is one; a cluster adopts it by choice and can drop it by deleting the file. The root is checked before it is written: well-formed, signed by its own keys at its threshold, not expired. Adopting a root other than the one already adopted needs --replace. This command changes this node only; 'orama maint build --release-root' puts the root in a signed archive, and every node that installs that archive adopts it. --rotate adopts the root as the next version of the one adopted: it has to be signed by the adopted root's keys at their threshold and by its own, exactly as a client following the release repository checks a rotation. A push of a release uses it, so a root the operator renewed or rotated reaches this node without --replace and without anyone's word for it. Examples: sudo orama node trust add-root ./root.json sudo orama node trust add-root --rotate ./2.root.json
| Flag | Default | Description |
|---|---|---|
--replace | false | Replace a different release root that is already adopted |
--rotate | false | Adopt the root as the next version of the adopted one, verified against it (a rotation) |
orama node uninstall
Remove production services (requires sudo)
orama node uninstall
orama node upgrade
Upgrade existing installation (requires sudo)
orama node upgrade [flags]
Upgrade the Orama node binary and optionally restart services. Uses rolling restart with quorum safety to ensure zero downtime. Run on a node, with sudo, this upgrades that node. Run from your machine with --env it rolls the nodes of an environment one at a time from the build already staged on them: that remote mode is replaced by 'orama upgrade' (the newest signed release of your network's channel) and 'orama maint rollout' (a build of your own), and prints a notice.
| Flag | Default | Description |
|---|---|---|
--acme-ca | — | ACME directory this node's TLS certificates come from, recorded in node.yaml: letsencrypt (production), letsencrypt-staging or an https URL (default: the recorded one) |
--delay | 300 | Seconds a node has to rejoin the cluster after its upgrade before the rollout stops |
--env | — | Target environment for remote rolling upgrade (devnet, testnet) |
--force | false | Reconfigure all settings |
--nameserver | false | Make this node a nameserver (uses saved preference if not specified) |
--node | — | Upgrade a single node IP only |
--public-ip | — | This node's public IP, recorded as node.public_ip (default: the recorded one, else the source address of the default route) |
--restart | false | Automatically restart services after upgrade |
--skip-checks | false | Skip minimum resource checks (disk, RAM, CPU) |
--yes | false | Execute the rolling upgrade plan (without it the plan is printed and nothing is restarted) |
orama node wipe
Erase Orama from remote nodes (target-side only)
orama node wipe [flags]
Remove all Orama data, services and configuration from remote nodes. Tor is left installed (its config and state are removed); --nuclear purges it. The wipe ends by listing what of Orama is still on the machine (LEFTOVER lines) and fails if anything is; the system accounts are removed only with --nuclear. Every wipe removes the IPv6 sysctl drop-in and puts IPv6 back to its value from before the install (enabled when the install recorded none); --nuclear also removes the RAM hygiene drop-in and puts back the values it recorded. Target-side only: this says nothing to the cluster. If the node is still a member, use 'orama remove' instead — otherwise the survivors keep counting it toward quorum and re-adding its WireGuard peer. This is a DESTRUCTIVE operation. Use --force to skip confirmation. Examples: orama node wipe --env testnet # Wipe every node orama node wipe --env testnet --node 203.0.113.4 # Wipe one node orama node wipe --env testnet --nuclear # Also remove shared binaries and accounts
| Flag | Default | Description |
|---|---|---|
--env | — | Target environment (devnet, testnet) [required] |
--force | false | Skip confirmation (DESTRUCTIVE) |
--node | — | Public IP of the node to wipe; omit to wipe every node in the environment |
--nuclear | false | Also remove shared binaries (rqlited, ipfs, caddy, ...), the Tor package and the system accounts Orama created (orama, orama-*, ntfy) |