CloudAddress -- User Guide v1.0.0

Every command, option and failure mode for running CloudAddress.

Applies to Cloud Spectra 1.0.0. Every command and flag on this page is a command or flag of cloudspectra_relay_client 1.0.0; run any command with --help for its full option list.

This guide covers everything you operate in CloudAddress: installing the client, creating relays in each cloud, connecting and moving devices, routing, DNS, IPv6, firewalling, the relay's dashboard, monitoring, upgrades, the security model and troubleshooting. For a first run, start with the Quick Start; for what CloudAddress is and when to use it, see the Overview.

Concepts

TermMeaning
RelayA small Linux instance in your cloud account that holds the address. It runs the Cloud Spectra relay software and its hardened kernel.
Project and nameEvery relay is identified by a project (default default) and a name (default default). Every cloud object the client creates is tagged with them, and all state lives in those tags: list, describe and destroy work from any machine holding the cloud credentials, including one that never ran create. Creating the same project and name twice adopts the existing relay instead of billing you for a second.
Worn address (identity)The address your device takes over. On Azure, Google Cloud and Oracle Cloud it is the relay's private address in its cloud network, which the cloud maps one-to-one to the relay's public IP. On DigitalOcean it is the public IPv4 itself.
EnrolmentBinding a device to a relay. The device generates its own WireGuard key pair and sends the public key with a one-time enrolment token. A device already enrolled reconnects without a token.
Instance indexThe relay's address slot (--instance-index, 0 to 249, default 0). A relay's public IPv4, private IPv4 and IPv6 belong to the slot, not the instance: destroy keeps them, and the next relay created with the same index in the same project and region comes back on them (on Azure, it must also have the same name).
DashboardThe relay's web console at https://<public-ip>:28300: tokens, devices, monitoring, firewall, logs and settings.

Installing the client

The client is free and published for each release at https://downloads.cloudspectra.ai/gateway/<version>/clients/. For 1.0.0:

PlatformFileInstalls
Debian / Ubuntu, x86_64 or arm64cloudspectra-relay-client_1.0.0_linux_amd64.deb
cloudspectra-relay-client_1.0.0_linux_arm64.deb
/usr/sbin/cloudspectra_relay_client, the cloudspectra-relay-daemon systemd service (enabled and started on install), a desktop indicator, and /etc/cloudspectra/relay/config.yaml. Depends on sudo, wireguard-tools, ca-certificates, nftables, cifs-utils and nfs-common.
macOS 13 or newer, Apple silicon or Intelcloudspectra-relay-client_1.0.0_macos_arm64.pkg
cloudspectra-relay-client_1.0.0_macos_amd64.pkg
/Applications/CloudSpectra.app, the CLI at /usr/local/bin/cloudspectra_relay_client, and the ai.cloudspectra.relay.daemon LaunchDaemon.
Windows, x64 or ARM64cloudspectra-relay-client_1.0.0_windows_amd64.msi
cloudspectra-relay-client_1.0.0_windows_arm64.msi
C:\Program Files\CloudSpectra\ (CLI, service and tray app), the CloudSpectra Relay service (CloudSpectraRelay), and a tray app started at sign-in. The folder is not added to PATH.
Any of the above, CLI onlycloudspectra_relay_client-<os>-<arch>.gz with <os> = linux, macos or windows (Windows: ...-windows-amd64.exe.gz)The bare command-line client. On Windows use the MSI instead: the bare executable comes without the service and the tunnel driver file the installer places beside it.
# Debian / Ubuntu
sudo apt install ./cloudspectra-relay-client_1.0.0_linux_amd64.deb
# macOS
sudo installer -pkg cloudspectra-relay-client_1.0.0_macos_arm64.pkg -target /
# Windows (Administrator PowerShell)
msiexec /i cloudspectra-relay-client_1.0.0_windows_amd64.msi
# check
cloudspectra_relay_client version

A running relay also serves the client matching its own release from its dashboard (Generate Token → Download the client).

Linux requirements. Kernel 5.10 or newer. The Linux client uses the kernel's WireGuard module by default; on a kernel without it, connect fails and names --user-mode-wireguard, which runs WireGuard in user space instead. macOS and Windows always use user-space WireGuard.

Desktop app. cloudspectra_relay_client gui opens the platform's native app -- the menu-bar app on macOS, the tray app on Windows, the indicator on Linux -- which drives the background service.

Cloud credentials

The client calls your cloud's API with your credentials; they stay on your machine and are never sent to Cloud Spectra. On macOS and Linux, commands that also need root (setup, connect, disconnect, teardown, pause, resume) are run with sudo -E, so that root sees your environment and your home directory.

Cloud--providerCredentials readScoped identity
Oracle Cloudoci~/.oci/config, or OCI_CLI_USER, OCI_CLI_TENANCY, OCI_CLI_FINGERPRINT, OCI_CLI_KEY_FILE, OCI_CLI_REGIONlogin --provider oci [--compartment <ocid>] [--region <home-region>] [--fss]
Microsoft AzureazureAZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_SUBSCRIPTION_ID, or a service-principal JSON file named by AZURE_AUTH_LOCATIONlogin --provider azure --tenant <id> --subscription <id> [--resource-group <rg>]
Google CloudgcpA service-account key named by GOOGLE_APPLICATION_CREDENTIALS; project from the key or CLOUDSDK_CORE_PROJECTlogin --provider gcp --project <id>
DigitalOceandoDIGITALOCEAN_TOKEN or DIGITALOCEAN_ACCESS_TOKEN, or a token file named by DIGITALOCEAN_CREDENTIALS_FILElogin --provider do [--token <token>]

login creates a dedicated cloudspectra-relay identity in your account with exactly the permissions the client needs -- it prints them and asks before creating anything (--yes skips the question) -- and stores it locally so later commands run as that identity rather than as your administrator. On DigitalOcean, which has no such identity to create, it stores a custom-scoped API token you paste. --cloud-shell creates the identity from your cloud's browser Cloud Shell instead, so no administrator credential is needed on your machine. logout --provider <cloud> deletes the identity and the local copy (it needs administrator credentials again).

Licence key. Read from the file named by CLOUDSPECTRA_LICENSE_KEY_FILE, by default ~/.cloudspectra/credentials (%USERPROFILE%\.cloudspectra\credentials on Windows). --license-key overrides it, but a value on the command line is visible to other local users. The old variable CLOUDSPECTRA_LICENSE_KEY is ignored, with a warning.

Creating a relay

There are two ways to create a relay:

  • setup -- create (or adopt) the relay, wait for it, mint an enrolment token from its dashboard, and connect this machine, in one command. It is the right choice when the machine that creates the relay is the one that will wear it.
  • create then connect -- create only provisions the relay and prints its address, its dashboard URL and the dashboard login, once; you then mint a token on the dashboard and run connect on the device that should wear the address. Use it when an administrator creates relays for other people, or when you need the dashboard password.
# one step, on the machine that will wear the address
sudo -E cloudspectra_relay_client setup --provider gcp --region europe-west1 --name office --daemonize

# two steps
cloudspectra_relay_client create --provider gcp --region europe-west1 --name office
sudo -E cloudspectra_relay_client connect --name office --token <token-from-dashboard>
The dashboard password. create generates a strong password, prints it with the login name admin under DASHBOARD LOGIN, and stores it nowhere: the relay keeps only a bcrypt hash. setup also generates one but uses it only internally, so after a plain setup you cannot sign in to the dashboard. If you will use the dashboard, pass --admin-password to setup or create: at least 8 characters with an upper-case letter, a lower-case letter, a digit and a special character.

Options for setup and create

FlagDefaultMeaning
--providerociCloud to create the relay in: oci, azure, gcp or do.
--regionyour cloud configuration's regionThe cloud's own region name. Pass the same value to every later command for this relay: a relay created in another region is not visible without it.
--project, --namedefault, defaultThe relay's identity. Re-running with the same pair adopts the existing relay.
--instance-type--An exact instance type (see list-instance-types). Overrides the floor below.
--cpu, --memory, --disk1 vCPU, 2 GiB, 10 GBA minimum; the cheapest instance type that clears it is chosen.
--archamd64 for setup; cheapest for createamd64 or arm64. A named --instance-type decides it.
--spotoffBuy the relay on the spot or preemptible market. The cloud can reclaim it, and a reclaimed relay drops the worn address until it is replaced. Refused on DigitalOcean.
--ephemeral-ipoffWear the instance's ephemeral public IPv4 instead of allocating a reserved one. No effect on DigitalOcean.
--addrephemeralHow the relay is reached: ephemeral or reserved (IPv4), or ipv6 (IPv6 only, no public IPv4). The default still reserves a static IPv4 on clouds that offer one; reserved is refused on DigitalOcean. See IPv6.
--instance-index0The relay's address slot. Give each relay that runs at the same time in one project its own index.
--vpcautoauto: the account's default network where the cloud has one, otherwise a new isolated network (and it says which). default: insist on the default network. create: a new isolated network. Or an existing network's id or name.
--subnet, --subnet-cidrcreateAn existing subnet id (required with --vpc <id> on clouds where a subnet is a separate object), or an exact CIDR for the subnet the client creates inside your existing network (/28 is the smallest every cloud accepts).
--open-porttcp/22Inbound ports the relay's cloud firewall admits to your device. Repeatable and comma-separated: tcp/443, udp/9000-9100, icmp, all, or a bare number for TCP. Naming any port replaces the tcp/22 default; -tcp/22 removes it. The relay's own ports are always added. See Inbound traffic.
--ssh-keynone (OCI: ~/.ssh/id_rsa.pub if present)A public key for the relay's recovery SSH on port 28301: a .pub path or the key text on Azure, Google Cloud and Oracle Cloud; the name of an SSH key already registered with DigitalOcean.
--admin-passwordgeneratedThe dashboard password; only its bcrypt hash reaches the relay.
--license-keythe licence fileOverride the licence file. Visible in the process list.
--timeout30mTime allowed for provisioning and the relay coming up.
--dry-run, --jsonoffPrint what would be created without calling the cloud; emit JSON.
--image--An exact image id to launch, skipping the image lookup (for a private or golden image).
--managed-fs, --shared-fs, --cloud-diskoffStorage add-ons; see Storage add-ons.

Options only on create

FlagDefaultMeaning
--source-cidr0.0.0.0/0 and ::/0Source ranges the relay's firewall admits. Narrowing it also restricts where devices can connect from, so leave it open for devices that roam.
--admin-useradminThe dashboard login name.
--token-ttl2mDefault lifetime of a token minted on the dashboard. Short by design; raise it for unattended automation.
--mtu-mobileoffAssume a mobile or CGNAT path and use the conservative 1180-byte tunnel MTU.

create refuses --tunnel-members above 1 and the --compression flags: those settings belong to the relay's dashboard (see Throughput).

Options only on setup

FlagDefaultMeaning
--full-tunneloff (split)Route all of this machine's traffic through the relay. See Routing.
--daemonize, -doffHold the tunnel in a background process and return the shell. Its log file is printed.
--foregroundtrueHold the tunnel in this terminal. Ctrl-C brings the tunnel down and destroys the relay, unless --skip-teardown-on-abort.
--skip-teardown-on-abortoffMake Ctrl-C (or a failure after the relay was created) leave the relay running. Without it, a failed setup destroys the relay it created so nothing keeps billing; a relay it merely adopted is never destroyed.
--no-attachoffProvision only; attach later with connect.
--takeoveroffMove the address to this machine, evicting the device wearing it. On a machine that did not create the relay, combine with --admin-password (the relay's dashboard password) so setup can mint a token.
--demo-web-server[=port]offServe a demo HTTPS page from this machine on the worn address (port 443, or the port given after =) and open that port in the relay's firewall.
--device-namehost nameThis machine's label on the dashboard.
--bond, --enable-compression1, offDashboard settings applied right after creation; they take effect at the relay's next restart.
--share-with, --share-filter, --forward, --dmz--Share the worn address with LAN devices; see Sharing.

Per-cloud notes

CloudRelay imageNetwork with --vpc autoPublic addressNotes
Oracle CloudThe published relay image, imported into your tenancy once per region and release; otherwise stock Ubuntu 24.04 with first-boot installA new isolated VCN (OCI has no account default network)Reserved public IP; a kept one costs nothingThe CLI's default cloud. Your tenancy must be subscribed to the region -- OCI answers 401 NotAuthenticated for an unsubscribed region, which looks like a credential error. The first image import adds several minutes; --force-import-image re-imports.
Microsoft AzureStock Debian 13, first-boot installA new isolated network (Azure has no account default network)Static public IPEach relay's objects are grouped in a resource group of their own.
Google CloudStock Ubuntu 24.04 LTS, first-boot installThe project's default network; a new isolated network for --addr ipv6, because the auto-mode default network cannot carry an IPv6 subnetStatic external IPThe project comes from your service-account key or CLOUDSDK_CORE_PROJECT.
DigitalOceanStock Debian 13, first-boot installThe region's default VPCThe droplet's own public IPv4: free and stable for the droplet's life, but not reserved -- a destroyed relay's address is gone, and the next relay gets a different oneNo spot market. The device wears the public IPv4 directly.
AWS is not supported for CloudAddress in 1.0.0. The client accepts --provider aws, but on AWS it launches only a relay machine image already present in your own AWS account, and 1.0.0 does not provide one; the instance boots without the relay software and never serves. Use one of the four clouds above.

Sizing and cost. A relay that wears one address is light work; the default floor (1 vCPU, 2 GiB) is enough to start. cloudspectra_relay_client list-instance-types compares the recommended instance types across the clouds -- price, vCPUs, memory and sustained network bandwidth -- with the monthly Cloud Spectra cost of each (--all shows every recorded type; --offline uses the catalogue built into the client).

Connecting devices

A relay has one wearer at a time. A device joins with a single-use enrolment token the first time; after that it reconnects with no token, no dashboard and -- if you pass --relay -- no cloud credentials.

Minting a token

Sign in to the relay's dashboard at https://<public-ip>:28300 (its certificate is self-signed) and open Generate Token. A token is single-use, expires after two minutes unless the relay was created with a longer --token-ttl or you choose another lifetime, and minting a new one replaces any outstanding token. The dashboard can also mint a multi-use token, valid for every use until it expires; the audit log records that it was issued.

connect

# on a machine with the cloud credentials: the relay is found by its tags
sudo -E cloudspectra_relay_client connect --name office --token <token>

# on a machine without cloud credentials: name the relay's address
sudo cloudspectra_relay_client connect --name office --relay <public-ip> --token <token>

# later, from the same machine: no token
sudo cloudspectra_relay_client connect --name office --relay <public-ip>

On Windows run the same commands from an elevated prompt as & "C:\Program Files\CloudSpectra\cloudspectra_relay_client.exe" connect .... By default connect raises the tunnel, hands it to a background process and returns; --foreground holds it in the terminal instead. That background process does not survive a reboot -- for that, see Keeping the address across reboots.

FlagMeaning
--project, --nameThe relay to join (--name is required).
--tokenNeeded only to install a new key: the first join, a new machine, or a rejoin after being evicted.
--relayThe relay's address, when this machine has no cloud credentials to look it up.
--takeoverReplace the device currently wearing the address. Without it, joining while another device has a live session is refused (exit code 7) and the token is not used, so you can retry with the flag.
--full-tunnelRoute all traffic through the relay; see Routing.
--device-name, --interfaceThe dashboard label; the local tunnel interface name.
--user-mode-wireguardLinux: use user-space WireGuard instead of the kernel module.
--verify-tlsVerify the dashboard certificate (off by default because a fresh relay's certificate is self-signed and only the single-use token crosses).
--foreground, --jsonHold in the terminal; emit JSON.

disconnect, and moving the address

# bring the tunnel down; this machine stays enrolled and reconnects without a token
sudo -E cloudspectra_relay_client disconnect --name office

# also give the address back: the relay wears nobody and this machine forgets its key
sudo -E cloudspectra_relay_client disconnect --name office --vacate

To move the address to another machine, mint a token and run connect --takeover there (or setup --takeover --admin-password ...). The machine that held it is evicted; reconnecting it later needs a new token. The address, and every allow-list and DNS record that names it, stays the same.

Keeping the address across reboots

For a machine that should wear the address permanently -- a home server, an office desktop -- enrol it with the client's background service, which the installers set up (cloudspectra-relay-daemon on Linux, the ai.cloudspectra.relay.daemon LaunchDaemon on macOS, the CloudSpectra Relay service on Windows). The service starts at boot, raises the tunnel from the stored enrolment, and repairs routing after network changes, sleep and wake.

# enrol into the service's state (once, with a token from the dashboard)
sudo cloudspectra_relay_client enrol --relay <public-ip> --token <token>
# raise the tunnel now; at every later boot the service raises it by itself
sudo cloudspectra_relay_client ctl connect

sudo cloudspectra_relay_client ctl status        # live tunnel state (add -json for JSON)
sudo cloudspectra_relay_client ctl diagnostics   # detailed diagnostics
sudo cloudspectra_relay_client ctl disconnect

enrol also accepts --full-tunnel, --takeover, --name (the dashboard label) and --wait <duration>, which keeps retrying while a just-created relay is still booting. ctl split-tunnel on|off switches the service's tunnel between split and full. On Windows, run these from an elevated prompt with the full path to the client.

Use one enrolment per machine and relay. The service's enrolment and a connect enrolment each hold their own key, and a relay has one wearer, so the two would compete for the same address. Pick the background service for an always-on machine and connect for a machine you connect by hand.

Phones and tablets

Phones and tablets use the stock WireGuard app for iOS or Android; there is no Cloud Spectra app to install. Because the phone cannot generate a key and send only its public half, the relay generates the phone's key pair and puts the whole configuration -- including the private key -- in the QR code. Anyone who photographs the code has the device's credential; it is shown once and stored nowhere.

  • From the dashboard: Generate Token → Enrol a phone, choose split or full tunnel, and scan the code in the WireGuard app (Add tunnel → Create from QR code). This makes the phone the relay's wearer, replacing whichever device held the address.
  • From the CLI: mint a token, then print the code in a terminal:
    cloudspectra_relay_client qr --relay <public-ip> --token <token> [--full-tunnel] [--compact] [--show-config]
    This path refuses (409) while another device has a live session; disconnect that device first, or use the dashboard. --compact halves the width for an 80-column terminal, --invert helps a camera that cannot read the default colours, and --show-config also prints the configuration as text.

A phone on a split tunnel sends only the relay's network through the tunnel, so inbound connections to the address cannot be answered by it directly. The dashboard's Firewall page has an Inbound to your phone setting for the ports you need; on those ports the relay translates the visitor's address, so your service sees one address for every visitor.

Sharing the address with LAN devices

Consoles, NAS boxes, cameras and other devices that cannot run a client can wear the cloud address through a Windows, macOS or Linux machine that does. That machine remains the relay's one wearer; it routes the shared devices' traffic into the tunnel and translates it to the worn address. Nothing is shared until you name a device.

sudo -E cloudspectra_relay_client connect --name home --share-with 192.168.1.50 --forward udp/3074:192.168.1.50
FlagMeaning
--share-withLAN devices to share with (repeatable or comma-separated). Each device must use this machine as its default gateway; its traffic then leaves wearing the cloud address.
--share-filterWhich of a shared device's traffic takes the tunnel: '<udp|tcp|all> [and not port N]...'. Default 'udp and not port 443'.
--forwardDeliver an inbound port on the cloud address to a shared device: proto/port[-port]:device[:port][@source-cidr]. The port is also opened in the relay's cloud firewall, which needs cloud credentials. Repeatable.
--dmzForward every inbound port to one device, except the ports this machine needs for its own control plane.
--share-allowNetworks a shared device may be on (CIDRs). Default: this machine's directly connected networks. 0.0.0.0/0 would make this machine an open relay wearing your address.

The same flags are accepted by setup. A shared device acts as your identity: it leaves the internet from your address, so share only with devices you trust.

Routing: split and full tunnel

Split tunnel (default)Full tunnel (--full-tunnel)
Through the relayThe relay's network range, and -- for a device that is not itself a cloud instance -- the cloud metadata addressesEverything
This machine's own traffic to the internetLeaves from your own connection, as beforeLeaves from the relay's public IPv4
Inbound to the worn addressDelivered to the deviceDelivered to the device
Requires--A relay with a public IPv4 (refused on an --addr ipv6 relay)

A full tunnel takes over the machine's default route, so existing connections -- including an SSH session into the machine -- move with it. After taking the default route, the client checks that the tunnel carries traffic; if it does not, it rolls the change back so the machine keeps its own connectivity, and reports tunnel did not carry traffic ... after taking the default route. When the tunnel goes down, the machine gets its own egress back.

Reaching the relay's network

On Azure, Google Cloud and Oracle Cloud the device wears the relay's private address, so other instances in the relay's network reach the device at that address, and the device reaches them through the tunnel -- subject to your cloud's firewall rules. In a network the client created, the device routes that whole network range; when you place the relay in an existing network (--vpc <id> --subnet <id>), it routes the relay's own subnet.

Instance metadata

On a device that is not itself a cloud instance, the cloud metadata address 169.254.169.254 (and Azure's 168.63.129.16) is routed to the relay when the relay grants metadata access, so cloud tooling on the device reads the relay's instance metadata. A device that is itself a cloud instance keeps its own metadata service: the client deliberately does not capture it there.

DNS

At enrolment the relay gives the device the resolver it uses itself -- its cloud network's resolver -- and its internal search domain, on every supported cloud. The client applies them while the tunnel is up and removes them when it goes down:

  • Linux: with systemd-resolved, the resolver and domains are attached to the tunnel interface (resolvectl), and the tunnel does not become the default resolver. Without it, /etc/resolv.conf is backed up to /run/cloudspectra/resolv.conf.bak, replaced, and restored afterwards.
  • macOS: on a split tunnel, a resolver scoped to the network's domains (none is installed if the relay issued no search domain); on a full tunnel, the relay's resolver answers every name. Your network services' own settings are not edited.
  • Windows: the resolver is set on the tunnel adapter, and the search domains are added to the suffix search list.
  • Phones: the resolver is part of the WireGuard configuration in the QR code.

IPv6

  • Default (IPv4 endpoint). The device reaches the relay over IPv4. If the relay also holds a public IPv6 address, the device wears it as well.
  • --addr ipv6. The relay is reached on its IPv6 address and gets no public IPv4, so no public IPv4 is billed. All four supported clouds implement it. Your device needs working IPv6 to reach the relay, the dashboard is at https://[<ipv6>]:28300, and a full tunnel is refused -- before the enrolment token is used -- because there is no public IPv4 to leave from. On Google Cloud the client creates an isolated network for it.
  • If you ask for --addr ipv6 and the cloud assigns no public IPv6, create warns you.

Inbound traffic and firewalling

Three layers decide what reaches your device on the worn address:

  1. The relay's cloud firewall (security group, network security group, security list or cloud firewall, created with the relay). It admits the relay's own ports -- TCP 28300 (dashboard and enrolment), TCP 28301 (recovery SSH) and UDP 28302-28349 (the tunnel) -- plus the ports you choose with --open-port, which default to TCP 22. Sources default to anywhere. --forward and --demo-web-server open their ports for you.
  2. The reserved band. Ports 28300-28349 on the address always stay with the relay and never reach your device. Every other port that the firewall admits is delivered to your device with the visitor's address intact.
  3. Your device's own firewall, which decides what the device answers.

The dashboard's Firewall page filters only traffic that terminates on the relay itself; it cannot filter traffic tunnelled to your device. To change the ports open to your device after the relay exists, edit the inbound rules of the relay's firewall in your cloud console (on Oracle Cloud, the security list of the relay's subnet).

The dashboard's Policy page (Where devices may go) can filter the destinations your device reaches through the relay: off by default; the most specific rule wins and a deny wins over an allow for the same network; changes apply when the relay restarts.

The relay dashboard

Every relay serves its dashboard at https://<public-ip>:28300 with a self-signed certificate. Sign in as admin (or your --admin-user) with the dashboard password.

PageWhat it is for
AccessThe enrolled device, and removing it.
Generate TokenEnrolment tokens for computers, the client downloads, and phone enrolment by QR code.
MonitoringThe relay's CPU, memory, storage and network rates, its cost this month, and top talkers when flow visibility is on.
FirewallRules for traffic terminating on the relay, and Inbound to your phone.
Cloud VPNSettings for reaching peered cloud networks; not needed for CloudAddress.
LogsThe account-activity (audit) log and the service log.
PolicyOptional destination filtering for devices.
OperatorsWho can sign in (for operators allowed to manage them).
SettingsPassword, appearance, monitoring and flow visibility, the dashboard certificate, alerts, sending the activity log to a SIEM, and backup and restore.
Build infoThe relay's software build.

The Access page also shows the relay mode: a CloudAddress relay reads CloudAddress Relay (1:1 address transfer), and the mode picker lists CloudAddress as Cloud IP. Changing the mode changes which product the relay runs; it takes effect when the relay restarts, and every enrolled device must enrol again afterwards -- so leave it unless you mean to.

Status, monitoring and logs

CommandWhat it tells you
sudo cloudspectra_relay_client status [--name N] [--json]This machine's enrolments in a project, from local state only: worn address (and IPv6), relay, mode, interface, MTU, compression, tunnel members, enrolment time, whether the tunnel is up and its pid, and whether the relay is paused.
cloudspectra_relay_client list [--provider P] [--region R] [--all-projects] [--json]The relays in a project, read from cloud tags: name, provider, address, region, size, status -- and, for a destroyed relay, what was kept.
cloudspectra_relay_client describe --name N [--provider P] [--region R] [--json]One relay's tags plus a live read.
sudo cloudspectra_relay_client ctl status | diagnosticsThe background service's live tunnel.

Client logs: a daemonized setup prints the path of its log file; the background service logs to the systemd journal on Linux (journalctl -u cloudspectra-relay-daemon), to /var/log/cloudspectra-relay-daemon.log on macOS, and to %ProgramData%\CloudSpectra\relay\service.log on Windows. Relay logs: the dashboard's Logs page; with a recovery SSH key, journalctl -u cloudspectra-relay and journalctl -u cloudspectra-relay-dash over SSH on port 28301. Alerts: the dashboard can post alerts to a webhook and send its activity log to a SIEM (Settings).

Exit codes are a stable contract for scripts: 0 success, 1 failure, 2 usage error or missing credentials or a capability the cloud lacks, 6 relay not found, 7 a live session exists (pass --takeover), 8 the relay is paused (resume it).

Pause, resume, destroy and kept addresses

pause and resume

sudo -E cloudspectra_relay_client pause --name office     # stop the relay's instance
sudo -E cloudspectra_relay_client resume --name office    # start it, wait until it serves, reconnect

pause stops the relay's instance and keeps its addresses and disk; the Cloud Spectra meter stops (your cloud may still charge for the kept disk and address). Without --name it pauses the relay whose tunnel this machine is running. resume starts it, waits until it serves, and raises this machine's tunnel again if it was wearing the address when paused (--no-reconnect skips that). If you created the relay with --ephemeral-ip, pausing can change its public IPv4 on Google Cloud and Oracle Cloud; a reserved address -- the default -- is kept.

destroy and teardown

teardown is the mirror of setup: it disconnects this machine, gives the address back, and destroys the relay (--keep-relay does everything except the destroy). destroy destroys relays without touching the local tunnel; with no --name it destroys every relay in the project, and --dry-run prints the plan first. Both keep some things by default:

Kept by defaultWhyBills while kept?Flag that deletes it
The public addressBelongs to the relay's instance index; the next relay with that index wears it again (on Azure, a relay with the same name)Yes on Azure and Google Cloud; no on Oracle Cloud; DigitalOcean keeps none--delete-address (cannot be undone)
The network, subnet, gateway and firewallThe next create in the project reuses them; the private IPv4 and IPv6 come from themNo--delete-network
A cloud drive (--cloud-disk)Holds your filesYes--delete-drive
The project's shared filesystem (--shared-fs)Shared by every relay in the projectYes--delete-shared-fs, or destroying the whole project with --delete-network

--delete-all is all four at once. A managed filesystem (--managed-fs) is always deleted with its relay. Everything kept is named in the command's output.

Kept addresses

Because addresses belong to the instance index, you can rebuild a relay -- to change its size or move it to a newer release -- without changing its address: teardown (or destroy) without --delete-address, then setup (or create) again in the same project and region with the same --instance-index -- and, on Azure, the same name. On Azure, Google Cloud and Oracle Cloud the new relay comes back on the same public IPv4 and private IPv4; on Oracle Cloud its IPv6 is kept too, for as long as the network is kept. On DigitalOcean nothing is kept, and the new relay has new addresses.

Throughput: bonding, compression and MTU

  • Bonding. A tunnel can be bonded across several WireGuard members (1 to 32) to spread it over more network paths. Set it on the dashboard or with setup --bond N; it takes effect at the relay's next restart, and an unlicensed relay uses 1. status shows the members this machine agreed with the relay.
  • Compression. Payload compression can cut the relay's egress on the download leg at the cost of CPU. Turn it on on the dashboard or with setup --enable-compression (it takes effect at the relay's next restart); on a machine enrolled with the background service, ctl compression no|auto|yes sets this machine's side.
  • MTU. The client chooses and checks a tunnel MTU for the path it is on. create --mtu-mobile starts from the conservative 1180-byte setting meant for mobile and CGNAT networks.

Storage add-ons

Optional storage that devices holding the address can use. Read the lifetimes carefully -- they differ, and one of them deletes your files with the relay.

FlagWhat it isCloudsLifetime
--cloud-disk <GB>A block volume attached to the relay and shared over the tunnel; the device holding the tunnel mounts it. Can be grown by re-running with a larger size, never shrunk.All fourOutlives the relay. Kept by destroy (and still billed) unless --delete-drive; reattached by a later create of the same project and name.
--managed-fsA cloud-managed NFS filesystem (OCI File Storage) in the relay's network, mounted by every connected device.Oracle CloudDies with the relay: destroy deletes it and every file on it.
--shared-fsThe project's shared NFS filesystem: one per project and region, used by every relay in the project. Everything on it is visible to everyone connected in the project.Oracle CloudKept when one relay is destroyed (and still billed); deleted by destroy --delete-shared-fs or by destroying the whole project with --delete-network.

On Oracle Cloud, a scoped identity needs File Storage permission for the filesystem options: create it with login --provider oci --fss.

Configuration file

Every option can be given a default in a YAML file, by default config.yaml in the client's state directory (/etc/cloudspectra/relay on Linux, /usr/local/etc/cloudspectra/relay on macOS, C:\ProgramData\CloudSpectra\relay on Windows), or the file named by --config. The file has one section per command (setup, create, connect, disconnect, status, list, describe, destroy, teardown, pause, resume); keys are the flag names without the dashes. A flag typed on the command line always wins. cloudspectra_relay_client print-config writes a fully commented example.

setup:
  provider: oci
  region: eu-frankfurt-1
  name: laptop
connect:
  full-tunnel: true

Upgrades

The client does not update itself. To upgrade, install the newer release's package over the old one: the Debian package restarts the background service on upgrade, the macOS package replaces the running daemon, and the Windows installer upgrades in place. Enrolments survive the upgrade.

The relay is pinned to a release: by default the release of the client that created it (--package-version overrides it). At every boot, before the relay starts serving, it checks its release bucket and installs that build if it is not already running it, verifying the package's signature against the Cloud Spectra release-signing key; the check never interrupts a running tunnel, and if the bucket cannot be reached the relay starts on what it has. To move a relay to a newer release, rebuild it with the newer client on the same instance index, as described under Kept addresses.

Security model

Where things run

  • The relay is an instance in your cloud account, created with your credentials, which never leave your machine. Your tunnel traffic flows between your device, your relay and the internet; it does not pass through Cloud Spectra.
  • The relay talks to Cloud Spectra for three things: it validates its licence and reports the usage it is billed for (check-ins every two minutes), it obtains its signed datapath at start-up by presenting the licence key, and it downloads its signed software package and kernel.
  • Licence enforcement fails closed at start and soft in flight. A relay with no licence, or one that does not verify, starts parked: its dashboard answers and says why, and it forwards nothing. A relay that has been entitled keeps serving for 24 hours if the control plane becomes unreachable, then parks.

Keys, tokens and passwords

  • The device generates its own WireGuard key pair and sends only the public key; the private key is stored on the device readable by root only (on Windows, by SYSTEM and Administrators). The relay's own key is created by the client at provisioning and delivered to the instance in its first-boot data, inside your cloud account.
  • For phones the relay generates the key pair and the QR code contains the private key; it is shown once and stored nowhere.
  • Enrolment tokens are single-use, short-lived, replace any outstanding token, and are compared in constant time. A refusal -- another device holds a live session, or a full tunnel this relay cannot carry -- does not use the token up.
  • A live session cannot be taken over without --takeover. An operator signed in to the dashboard can still replace the device, by enrolling a phone or removing the device on the Access page.
  • The dashboard is reachable on port 28300 from anywhere by default and protected by its password, which the relay holds only as a bcrypt hash; failed sign-ins are rate-limited. Its certificate is self-signed, so the client does not verify it unless you pass --verify-tls.
  • The licence key is read from a file, never from an environment value. On the relay it is stored in root-only files.

The relay instance

  • First boot verifies the signatures of the package and the kernel against the release-signing key before installing either (--insecure-skip-signature exists for lab use only), then boots Cloud Spectra's hardened kernel.
  • The relay's own SSH listens only on port 28301, and only with a key you supplied with --ssh-key; port 22 on the address belongs to your device.
  • Your device's exposure is decided by the relay's cloud firewall and your device's own firewall; the dashboard's firewall protects only the relay.

Troubleshooting

SymptomCause and fix
setup waits, then fails: relay dashboard never became ready ... (the relay may be parked -- check its licence and that its datapath sealed)The relay did not finish starting. Most often the licence: check that the key file exists and that the command could read it (run with sudo -E, or set CLOUDSPECTRA_LICENSE_KEY_FILE to an absolute path). Unless you passed --skip-teardown-on-abort, setup destroys the relay it created. Re-run with --skip-teardown-on-abort and an --admin-password to inspect a failing relay on its dashboard.
The dashboard answers but no traffic flowsThe relay is parked; the dashboard says why. A relay with no valid licence never serves.
A warning that CLOUDSPECTRA_LICENSE_KEY is no longer honouredWrite the key to a file and point CLOUDSPECTRA_LICENSE_KEY_FILE at it, or use the default ~/.cloudspectra/credentials.
that enrolment token is not valid. Tokens are single-use and expire (401)The token was used, expired (two minutes by default) or replaced by a newer one. Mint a new one.
an active session for this relay already exists (409, exit code 7)Another device wears the address. Re-run with --takeover to move it here; the token was not used.
A full tunnel is refused on enrolmentThe relay has no public IPv4 (--addr ipv6). Use the default split tunnel; the token was not used.
... needs root / installing routes needs rootRun with sudo -E on macOS and Linux, or from an elevated prompt on Windows.
connect fails on Linux and names --user-mode-wireguardThe kernel has no WireGuard module. Pass --user-mode-wireguard.
tunnel did not carry traffic ... after taking the default route; rolled backThe full tunnel was raised but nothing passed through it, so the client restored the machine's own route. Re-run connect (it needs no token); check that UDP 28302 reaches the relay from this network. On mobile and CGNAT networks, a relay created with --mtu-mobile uses a smaller tunnel MTU.
list, describe, destroy or teardown do not find a relay you createdPass the same --provider and --region you created it with. The default provider is oci and the default region is your cloud configuration's.
Exit code 8The relay is paused. resume it.
A service on your device is not reachable on the addressCheck the relay's cloud firewall (the port must be admitted; only TCP 22 and the relay's own ports are by default), that the port is not in 28300-28349, and your device's own firewall. A phone on a split tunnel needs Inbound to your phone.
Oracle Cloud returns 401 NotAuthenticatedBesides a wrong key, OCI returns this for a region your tenancy has not subscribed to. Subscribe to the region or choose another.
--addr reserved or --spot refusedDigitalOcean has neither a reserved address nor a spot market; its droplet address is already free and stable.
--tunnel-members or --compression refused by createSet them on the relay's dashboard, or use setup --bond / --enable-compression.
A relay created on AWS never servesAWS is not supported for CloudAddress in 1.0.0; destroy it with destroy --provider aws --name <name> and use another cloud.

Still stuck? Email support@cloudspectra.ai with the command you ran, its output, and the client's log (see Status, monitoring and logs).

Teardown checklist

  1. Bring each device's tunnel down: disconnect --vacate, or ctl disconnect for the background service.
  2. Destroy the relay: sudo -E cloudspectra_relay_client teardown --provider <cloud> [--region <region>] --name <name>.
  3. Decide what to keep: add --delete-address to release the address (irreversible), --delete-drive for a cloud drive, or --delete-all to keep nothing.
  4. Check with cloudspectra_relay_client list --provider <cloud> [--region <region>] that nothing you meant to delete is still listed.
  5. Optionally remove the scoped identity with logout --provider <cloud>, and uninstall the client.