CLI Reference
The quazzar-cli tool lets you manage your Cloud OS server from the terminal. It is a separate binary from the main quazzar server and communicates with the Cloud OS REST API.
The CLI is not yet included in the main quazzar APT package. Install it separately via sudo apt install quazzar-cli once available, or build from source with make build-cli.
Installation
APT (when available)
sudo apt install quazzar-cliBuild from Source
git clone https://github.com/quazzar/cloud-os.git
cd cloud-os
make build-cliThe compiled binary is placed in ./bin/quazzar-cli.
Authentication
Before using the CLI, authenticate with your Cloud OS instance:
quazzar-cli login --server https://your-server.example.comYou will be prompted for your email and password. If 2FA is enabled, you will also be prompted for your TOTP code.
The authentication token is stored in ~/.quazzar/credentials.
Commands
System
| Command | Description |
|---|---|
quazzar-cli status | Show system overview (CPU, RAM, disk, app count, version, uptime) |
Components
| Command | Description |
|---|---|
sudo quazzar setup | Open the component installer (root; runs quazzar-setup) |
sudo quazzar setup apply --set "-mail,vpn" | Change components without the installer. Other flags: --json, --wait-apt, --no-restart |
sudo quazzar setup detect | Check what is really installed and update the saved state |
quazzar setup status | Show installed, failed and pending components |
See Components.
Installer language. The installer and quazzar setup show English, Russian, Spanish or French, chosen from LC_ALL, then LC_MESSAGES, then LANG (anything else is English). For example LANG=fr_FR.UTF-8 sudo -E quazzar setup. See Languages.
Apps
| Command | Description |
|---|---|
quazzar-cli apps list | List all installed apps with status |
quazzar-cli apps install <template> | Install an app from the template library |
quazzar-cli apps start <app-id> | Start a stopped app |
quazzar-cli apps stop <app-id> | Stop a running app |
quazzar-cli apps restart <app-id> | Restart an app |
quazzar-cli apps logs <app-id> | View app container logs (use --follow to tail; admin only) |
Backups
| Command | Description |
|---|---|
quazzar-cli backup create | Trigger an immediate backup |
quazzar-cli backup list | List all backups with status and size |
quazzar-cli backup verify <backup-id> | Run integrity verification on a backup |
quazzar-cli backup health | Show backup health summary and staleness warnings |
Updates
| Command | Description |
|---|---|
quazzar-cli update check | Check for available Cloud OS updates |
quazzar-cli update apply | Download and apply the latest update |
Cluster
| Command | Description |
|---|---|
quazzar-cli cluster join --token qz_… --primary https://<primary> | Ask a cluster primary to admit this node (approve it on the primary). Run with sudo on a fresh node (uses the local join key) or as a logged-in admin. --insecure allows a plain-http primary. |
quazzar-cli cluster status | Show this node’s cluster role |
See Clustering.
Control Center
| Command | Description |
|---|---|
quazzar enroll --cc <url> --token <token> | Enroll this node in a Quazzar Control Center with a one-time token. Copy the exact command from the Control Center (onboarding step 2 or Fleet → Add node). Needs a logged-in admin (quazzar login). The token is single-use and expires after 1 hour by default. --cc selects the Control Center: for a self-hosted one pass its URL (https://cc.example.com, agent port 8443 unless the URL names another) — the node registers there instead of the hosted Control Center. Also recovers an enrolled node whose client certificate expired: the node re-registers under its existing identity (tags, group and history are kept). |
quazzar fleet status | Show whether this node is enrolled and connected, which Control Center it talks to, its plan, last heartbeat and last error. |
After quazzar enroll the node appears in the Control Center fleet within a few seconds. See Onboarding.
Configuration
| Command | Description |
|---|---|
quazzar-cli config get <key> | Get a configuration value |
quazzar-cli config set <key> <value> | Set a configuration value |
Authentication
| Command | Description |
|---|---|
quazzar-cli login | Authenticate with a Cloud OS instance |
Local administration (recovery)
These commands run on the server itself and only work under sudo (as root). They don’t use
the REST API or a login: they talk to the running Quazzar service over a local admin socket
(/var/lib/quazzar/run/admin.sock — <data dir>/run/admin.sock) that never listens on the
network. The service checks who is connecting and accepts root only — not even the quazzar
service account can reset a password — and the CLI refuses to start without root.
| Command | Description |
|---|---|
sudo quazzar-cli admin reset-password | Set a new password for an account without knowing the old one; signs out all of its sessions |
sudo quazzar-cli admin users | List the accounts on this server (email, name, role, 2FA) |
sudo quazzar-cli admin cp-trust show | Show the Control Center signing key this node trusts for root-terminal tickets |
sudo quazzar-cli admin cp-trust reset | Forget the pinned key; the next live license from the Control Center pins the new one |
admin reset-password flags:
| Flag | Description |
|---|---|
--email <email> | The account to reset (prompted when omitted; matching ignores letter case) |
--reset-2fa | Also turn off two-factor authentication and delete the account’s backup codes |
admin flags:
| Flag | Description |
|---|---|
--socket <path> | Admin socket to use. Default: $QUAZZAR_ADMIN_SOCKET, else <data dir>/run/admin.sock from /etc/quazzar/quazzar.yaml (or $QUAZZAR_CONFIG), honouring QUAZZAR_DATA_DIR from the environment or /etc/quazzar/quazzar.env |
$ sudo quazzar-cli admin reset-password
Email: [email protected]
New password: ********
Confirm password: ********
✓ Password for [email protected] (admin) reset; 3 sessions signed out.The new password is typed twice and hidden; it must be at least 8 characters. There is
deliberately no password flag, so it never ends up in your shell history. For scripts, pipe the
answers on stdin instead — one line each (email first when --email isn’t given):
printf '%s\n%s\n' "$NEW_PW" "$NEW_PW" | sudo quazzar-cli admin reset-password --email [email protected]With --json, both commands print the result as JSON and the prompts go to stderr. The exit
code is non-zero on any failure. Every reset is recorded in the activity log
(auth.password_reset) and on the system timeline.
If the command says the service isn’t running, start it (sudo systemctl start quazzar) — the
socket only exists while the service runs, and older Cloud OS versions don’t have it (update
the server so it matches the CLI). “Must be run as root”, “permission denied” or “closed the
connection” means you forgot sudo.
Docker: run the CLI inside the Cloud OS container (it runs as root there, and the CLI is included in the image):
docker exec -it <container> quazzar-cli admin reset-passwordKubernetes: The Helm chart runs the pod as a non-root user (uid 65534), so kubectl exec … quazzar-cli admin reset-password is refused by the root-only check. If you sign in through SSO, restore access in
your identity provider. Otherwise run the pod as root for the reset (podSecurityContext.runAsUser: 0
in the chart values), run kubectl exec -it <pod> -- quazzar-cli admin reset-password, and then
revert the setting.
cp-trust runs through the privileged helper. To list the operations the quazzar service account may run as root, use sudo quazzar-setup priv list.
Object storage
Runs on the server, as root, over the same local admin socket as admin (see above).
| Command | Description |
|---|---|
sudo quazzar objstore purge-minio | After the move to Garage, delete the old MinIO data (/var/lib/quazzar/objects), minio.env and /usr/local/bin/minio. Asks you to type delete |
| Flag | Description |
|---|---|
--yes | Don’t ask (required when stdin is not a terminal) |
--socket <path> | Admin socket to use (same default as admin) |
The command is refused until the move has finished (objstore_minio_purge_unavailable), for
6 minutes after the switch, and whenever the Settings → Components Delete button would be
refused — for example when Garage cannot be shown to hold everything that was moved, or MinIO
files changed after the switch (see
Deleting the old MinIO data).
Progress is in Settings → Components. With --json it prints
{"freed_bytes": N, "binary_removal_started": true}.
Global Flags
| Flag | Description |
|---|---|
--server <url> | Cloud OS server URL (default: http://localhost:8080) |
--json | Output in JSON format for scripting |
--no-color | Disable colored output |
Output Formats
By default, the CLI outputs human-readable colored tables. Use --json for machine-parseable output:
# Human-readable
quazzar-cli status
# JSON
quazzar-cli status --jsonExample Output
$ quazzar-cli status
Quazzar Cloud OS v0.2.9
-------------------------
CPU: 23.4%
RAM: 3.2 / 8.0 GB (40%)
Disk: 45.1 / 100.0 GB (45%)
Apps: 12 running, 2 stopped
Uptime: 14d 6h 32mShell Completions
Enable tab completion for your shell:
# Bash — add to ~/.bashrc
eval "$(quazzar-cli completion bash)"
# Zsh — add to ~/.zshrc
eval "$(quazzar-cli completion zsh)"
# Fish — add to ~/.config/fish/config.fish
quazzar-cli completion fish | sourceUsage Examples
# Install an app and check its status
quazzar-cli apps install nextcloud
quazzar-cli apps list
# Create a backup
quazzar-cli backup create
quazzar-cli backup list
# Check for updates
quazzar-cli update check
# Tail app logs
quazzar-cli apps logs nextcloud --follow
# Scripting: restart all stopped apps
quazzar-cli apps list --json | \
jq -r '.[] | select(.status == "stopped") | .id' | \
xargs -I {} quazzar-cli apps start {}