Use this when the target server has no internet access. You run the bootstrap on a connected machine to produce a portable bundle, then carry that bundle to the offline server.
The offline server must still meet all the prerequisites except outbound connectivity — it needs no internet access at all. The connected machine needs outbound HTTPS to oci.tines.com (and github.com for the small oras tool).
Step 1 — Produce the bundle on a connected machine
On any amd64 Linux machine with access to oci.tines.com, run the same command as a standard install:
sudo bash -c "$(curl --proto '=https' --tlsv1.2 -fsSL https://sh.3b.dev)"
When prompted Install or airgapped?, type airgapped. Provide the version, tenant name, and API key as before. The script downloads a single self-contained zip (3b-self-hosted-<version>.zip) into the current directory and prints its full path.
This zip contains setup.sh, the Helm chart, the bundled k3s and Helm binaries, the configuration template, and all the container images, so the offline server needs nothing from the network.
To script this step, pre-answer the prompts with environment variables:
sudo \ CONNECTIVITY=airgapped \ VERSION=v2.0.0 \ REGISTRY_USERNAME=your-tenant \ REGISTRY_PASSWORD=your-api-key \ bash -c "$(curl --proto '=https' --tlsv1.2 -fsSL https://sh.3b.dev)"
Step 2 — Move the bundle to the offline server
Copy the zip to the air-gapped server by whatever means you use (USB, SCP, internal file transfer, etc.).
Step 3 — Install on the offline server
On the offline server, extract the bundle into /opt/3b and run the installer. Both steps need root, because they write to /opt:
sudo unzip 3b-self-hosted-v2.0.0.zip -d /opt/3b && cd /opt/3b sudo bash setup.sh
(Replace the filename with your actual version.) From here, setup.sh asks the same configuration questions as the standard install, then installs k3s, imports the bundled images, and deploys everything. Because the images are already in the bundle, there is no registry download.
Continue with verifying the install.
Updating an air-gapped server
To move to a new version, produce the new version’s bundle on a connected machine (step 1), copy it over, extract it into /opt/3b, and re-run setup.sh:
sudo unzip 3b-self-hosted-<new-version>.zip -d /opt/3b && cd /opt/3b sudo bash setup.sh
Your configuration and secrets in /opt/3b/.env are preserved — extracting the bundle never overwrites an existing .env. See updating the single-server install.
