Skip to main content

Install on a Hetzner Cloud VPS

Cloud providers don't let you upload a custom ISO, but they all offer a plain Debian 13 image. xcon OS turns that into an advantage: one script converts a fresh Debian 13 VPS into real xcon OS — with no provider APIs, just root and a disk.

These steps are written for Hetzner Cloud, the provider we've verified end to end. Other providers work on the same principle and are being validated one at a time.

warning

This erases the server and installs xcon OS on it. Run it only on a fresh VPS you own and have nothing to keep on.

Steps

  1. In the Hetzner Cloud Console, create a new server:

    • Image: Debian 13
    • Any type/size (a small one is fine to start)
    • Add your SSH key
  2. SSH in as root:

    ssh root@<your-server-ip>
  3. Download, verify, and run the installer. The bootstrap script is Ed25519-signed with the same offline key as the system images, so you can verify it before running — the recommended path:

    cd /root
    curl -fsSLO https://update.xconos.com/testing/bootstrap-takeover.sh
    curl -fsSLO https://update.xconos.com/testing/bootstrap-takeover.sh.sig
    curl -fsSL https://update.xconos.com/pubkey.pem -o xcon.pub
    openssl pkeyutl -verify -pubin -inkey xcon.pub -rawin \
    -in bootstrap-takeover.sh \
    -sigfile <(base64 -d bootstrap-takeover.sh.sig) \
    && sudo bash bootstrap-takeover.sh

    The quick (less strict) path is curl … | sudo bash, but verifying the script first closes the trust chain end to end.

  4. The script shows the target disk, asks for the xcon password (twice), and requires you to type YES before it does anything.

  5. It verifies the signed system image, then hands off. The server reimages itself and comes back as xcon OS at the same IP a few minutes later (Hetzner hands the address back over DHCP).

Open https://<your-server-ip>:8443 in a browser and sign in as xcon with the password you set.

How it works

The script downloads the signed system image, appends it to a boot image, and kexecs straight into the xcon installer. The old system's kernel is discarded, the disk is freed, and the installer writes xcon OS onto it — installing GRUB for both BIOS and UEFI so it boots on Hetzner's BIOS setup and UEFI hardware alike.

Because it only ever touches the local disk — never a provider API — the same script is the basis for every other provider we add.

Unattended

For automation (injecting this via cloud-init user-data), skip the prompts:

XCON_PASSWORD='your-password' XCON_YES=1 \
bash bootstrap-takeover.sh