Skip to Content
DocsCloud OSInstall Script

Install Script

scripts/install.sh is the curl-bash bootstrapper that gets new users from “blank machine” to “running Quazzar Cloud OS” in about 90 seconds. Phase В.1 of the GA roadmap polished it — preflight checks, idempotent re-run, phased progress, debug bundle on failure, rollback, and CLI flags.

Usage

curl -fsSL https://get.quazzar.cloud/install | sudo bash

For non-interactive (CI / cloud-init) installs:

curl -fsSL https://get.quazzar.cloud/install | sudo bash -s -- --unattended

Choosing components

On a fresh install with a terminal, the script opens an installer where you pick the optional components (S3 storage, VPN, local AI, mail, WhatsApp, system tuning, network management) and decide what to do about Docker. Skipped components are not installed and their pages stay hidden. With --unattended, or when there is no terminal, the defaults are used unless you pass --components. Docker is no longer installed automatically by the package; the installer handles it. Change your choice later with sudo quazzar setup. Details: Components.

Supported platforms

  • Ubuntu 22.04 / 24.04
  • Debian 12+
  • Rocky Linux / AlmaLinux / RHEL 9+
  • Fedora 39+

Architectures: x86_64 (amd64), aarch64 (arm64).

The installer aborts gracefully on unsupported distros. Pre-flight checks run before any state-changing operation.

Phases

The install runs in six phases; each prints [N/6] <label>:

  1. Pre-flight checks — distro, arch, /var disk (warn <10G, fail <4G), RAM (warn <1500M, fail <800M), systemd present, sudo/root, ports 80/443 (warn if occupied — Caddy falls back to 8080 automatically), outbound HTTPS to apt.quazzar.cloud.
  2. Adding Quazzar repository — GPG key import, repo file write. Skipped if already present (idempotent re-run).
  3. Installing quazzar packages — quazzar + quazzar-cli from APT or DNF.
  4. Starting services — systemctl enable --now quazzar.
  5. Waiting for health — polls http://127.0.0.1:8080/api/health for 30s.
  6. Done — prints login URL + recovery info.

Idempotent re-run

If quazzar is already installed, the script:

  • Exits 0 with a message if the installed version matches the candidate.
  • Upgrades in-place if a newer candidate exists (apt --only-upgrade / dnf upgrade).
  • Refuses to downgrade unless --allow-downgrade is passed.

An upgrade never overwrites your edits to /etc/quazzar/quazzar.env or /etc/quazzar/quazzar.yaml: the script tells dpkg to keep your copy (the new template is saved as *.dpkg-dist).

Configuration after install

The package installs /etc/quazzar/quazzar.env, a commented template that lists every environment variable the node reads with its default. Edit it, then apply with sudo systemctl restart quazzar. You do not need to set QUAZZAR_JWT_SECRET: the node generates and keeps its own random session secret. Full reference: Configuration → Environment variables.

Failure handling

A single ERR trap fires on any error:

[FAIL] Install failed at phase 3 (Installing quazzar packages). Last 100 lines of journald for quazzar.service: …dump… Run this and paste the URL into your support ticket: quazzar-cli debug-bundle | curl --upload-file - https://0x0.st

The ROLLBACK_ACTIONS array tracks every state-mutating operation (GPG key write, repo file write, package install, service enable, port override) and walks them in reverse on hard error so the next attempt starts clean.

In --unattended mode the journald dump is suppressed (CI reads the exit code instead).

Troubleshooting

EXPKEYSIG 531A6B20FA058A70 Caddy Web Server

apt-get update prints this when the host has Caddy’s APT repository with an expired copy of its signing key; Caddy rotates the key from time to time. The install script and Quazzar’s Caddy installer now refresh the key automatically when that repository is present. To fix it by hand:

curl -1sSLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --batch --yes --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg && sudo apt-get update

If your Caddy source file (/etc/apt/sources.list.d/caddy-stable.list) names a different signed-by= keyring, write the key to that path instead.

Flags

FlagDefaultEffect
--unattendedoffSkip prompts; warns become errors. CI / cloud-init friendly.
--components SPECdefaultsChoose components without the installer, e.g. "-mail,docker=keep". Same as QUAZZAR_COMPONENTS.
--channel=<stable|testing>stablePick repo channel.
--port=<n>8080Override OS web port; written to /etc/quazzar/web.port.
--no-tunneloffSkip pair-tunnel setup (air-gapped installs).
--allow-downgradeoffPermit a version downgrade.
--skip-healthoffSkip phase 5 (used by image bakers).
--register=<env_file>offAuto-register the node with a Quazzar Control Panel after install (Phase Г.4 cluster autoscaling — set by cloud-init bootstraps). The env file must define QUAZZAR_REGISTER_URL, QUAZZAR_REGISTER_TOKEN, QUAZZAR_TENANT_ID. Implies --unattended.
--help—Print this list.

--unattended implies DEBIAN_FRONTEND=noninteractive for apt and -y for dnf.

Where it lives

  • scripts/install.sh — master copy (867 lines, shellcheck clean).
  • quazzar-cloud-landing/install.sh — byte-for-byte mirror served by the landing page.

Updates land in both files together.