Skip to content
← Documentation

Linux CLI installation

Installation

This guide installs Heliont on Ubuntu Server (or similar Linux) over SSH with the terminal installer. The same binary is used for updates.

What you will install

Piece What it is How you get it
Heliont Installer (heliont-install) Free binary that installs and updates Heliont Curl from the portal (no login) — always the latest build for your OS/arch
License JSON Entitles your installation to product packs Licenses while signed in, then copy to the server
Docker Engine + Compose Runs the Heliont containers Install on the server before running the installer
Optional offline pack Signed heliont-*-linux-*.tar.gz when the server cannot reach the portal Downloads while signed in
Optional TLS PEMs Full-chain certificate + private key for Public publishing Your CA / Let’s Encrypt — see TLS certificates

Product packs are not downloaded with a browser curl for normal online installs. After you provide a valid license, the installer fetches the entitled pack from the portal. Customers do not pull container images from a public registry.

Before you start (laptop)

  1. Sign in to the customer portal and download your license JSON from Licenses.
  2. Decide Local (lab / localhost, no certs) or Public (your domain + TLS PEMs).
  3. For Public, obtain a full-chain PEM and matching private key that cover every required name — see Obtaining TLS certificates.
  4. Optional offline: download the entitled Linux pack (heliont-*-linux-amd64.tar.gz or arm64) from Downloads.
  5. Know your CPU architecture:
    • Intel/AMD 64-bit → linux-amd64
    • ARM 64-bit → linux-arm64
  6. Confirm you can SSH to the server as a user that can run sudo.

Prepare the server

  1. Install Docker Engine and the Compose plugin. Confirm:
docker compose version
  1. Create a prep folder (any path you choose) and put the install inputs there:
mkdir -p ~/heliont-prep
cd ~/heliont-prep

Copy files into that folder (for example with scp from your laptop):

File When
License .json Always
fullchain.pem + privkey.pem (those names preferred) Public only
heliont-*-linux-….tar.gz Offline only
  • Local online = license only
  • Public online = license + TLS PEMs
  • Offline = license + pack (+ TLS PEMs if public)

Download the installer

Stay inside the prep folder. Detect architecture, download the latest installer and checksum, verify, then make it executable:

ARCH=$(uname -m)
case "$ARCH" in
  x86_64)  SLUG=linux-amd64 ;;
  aarch64|arm64) SLUG=linux-arm64 ;;
  *) echo "unsupported arch: $ARCH"; exit 1 ;;
esac
curl -fsSL -o "heliont-install-${SLUG}" "https://heliont.store/install/installer/${SLUG}"
curl -fsSL -o "heliont-install-${SLUG}.sha256" "https://heliont.store/install/installer/${SLUG}/checksum"
sha256sum -c "heliont-install-${SLUG}.sha256"
chmod +x "heliont-install-${SLUG}"

No portal login is required for the installer binary. Keep the filename so sha256sum -c matches the checksum sidecar.

Run the installer

You must use sudo. Stay in the prep folder so the current directory contains your license (and optional pack/certs).

Local (typical first install)

sudo ./"heliont-install-${SLUG}"

Public (domain + TLS files in the prep folder)

sudo ./"heliont-install-${SLUG}" -domain heliont.example.com

Replace with your real domain. The installer discovers cert and key files in the current directory.

What the installer does

  • Refuses to run without root (sudo)
  • Finds the license JSON in the current directory
  • Chooses online or offline from whether a pack archive is present
  • Chooses local or public from whether TLS PEMs are present
  • Installs under /opt/heliont by default
  • Prints a setup URL and one-time setup token

Custom install directory

If /opt/heliont is already used for something else on the host, choose another empty directory:

sudo ./"heliont-install-${SLUG}" -install-dir /opt/heliont-app

(Add -domain … for public installs as above.)

Site compose extend (ports behind host nginx)

Stock Heliont publishes host ports 80 and 443. If bare-metal nginx (or anything else) already owns those ports, do not edit compose.yml by hand — updates replace it.

Place one fixed extend file under the install directory (not the prep folder):

<install-dir>/.compose/compose_extend.yml

Example for /opt/heliont-app with Heliont on 7080/7443:

sudo mkdir -p /opt/heliont-app/.compose
sudo tee /opt/heliont-app/.compose/compose_extend.yml <<'EOF'
services:
  webserver:
    ports: !override
      - "7080:80"
      - "7443:443"
EOF
Path Role
compose.yml Stock product file; installer replaces on update
.compose/compose_extend.yml Site extend; installer always merges when present
.devconfig/* Manual/dev overlays only; installer never auto-loads these

.compose/ and .devconfig/ survive wipe/reinstall and are ignored when checking whether an install folder is empty. Put the extend file in place before first start if ports 80/443 are already taken.

Requires Docker Compose v2 with !override support for replacing the published port list.

Day-2 Compose commands

When you run Compose yourself, include the extend file if you use one:

cd /opt/heliont   # or your -install-dir
sudo docker compose -f compose.yml -f .compose/compose_extend.yml up -d

Alternatively, create /opt/heliont/.env (next to compose.yml) with:

COMPOSE_FILE=compose.yml:.compose/compose_extend.yml

Then plain sudo docker compose up -d merges both files. Listed paths must exist.

Complete web setup

  1. Open the printed setup URL in a browser.
  2. Enter the setup token when asked.
  3. Complete the guided web setup until Heliont reports operational.

Web setup does not upload a license. The installer must already have staged a valid license during install or update.

Flags reference (optional overrides)

Most Linux installs need no flags beyond -domain (public) and optionally -install-dir. Useful overrides:

Flag Purpose
-domain Public primary domain (required when TLS PEMs are present)
-install-dir Host install path (default /opt/heliont)
-license Explicit license path (otherwise discovered in cwd)
-pack Explicit offline pack path
-mode online|offline Force mode instead of inferring from pack presence
-agree-license Accept license terms without a prompt (with -yes)
-yes Non-interactive defaults
-branch install|update|uninstall Force branch (interactive menu when omitted)

Troubleshooting

Symptom What to check
Exec format error Wrong arch binary (amd64 vs arm64)
run with sudo… Run the installer with sudo
no valid Heliont license JSON found in this folder License not in the current directory, or verification failed — re-download from Licenses
address already in use on port 80/443 Host nginx owns those ports — add .compose/compose_extend.yml, then start again
install directory is not empty Choose a free path with -install-dir, or wipe/update an existing Heliont install
Certificate / domain errors Public needs matching PEMs in the prep folder plus -domain
Curl installer 503 / empty file Confirm https://heliont.store/install/installer/linux-amd64 returns HTTP 200

Related documentation