Skip to main content

Air-gapped / Offline Install

Some environments have no network access to the registry at all. For those, Conduit splits the install into two steps: bundle a connector on a machine that can reach the registry, then install from that bundle on the machine that cannot.

The bundle is a self-contained carrier for an already-verified installation. Nothing is trusted just because it is in the bundle — the offline install re-verifies everything from the bundle's own contents.

1. Bundle on a connected machine

Run bundle on a machine with network access:

conduit connectors bundle postgres@0.14.1 --os linux --arch amd64 --output postgres.bundle.tar.gz

bundle resolves <name>[@version] exactly like install and runs the same full verification — index signature, artifact signature, and SLSA provenance — while it is still online. Only then does it package into a single .bundle.tar.gz:

  • the connector artifact for the target platform,
  • its signature and provenance bundles in cosign --bundle form (embedded certificate chain and Rekor inclusion proof, so no live Sigstore query is needed later), and
  • the full signed registry index snapshot.

Target a platform other than the build host with --os and --arch; both default to the current host. --output defaults to <name>-<version>-<os>-<arch>.bundle.tar.gz.

FlagDescription
--osTarget operating system. Defaults to this host's.
--archTarget architecture. Defaults to this host's.
--outputOutput bundle path. Defaults to <name>-<version>-<os>-<arch>.bundle.tar.gz.
--index-urlRegistry index URL. Default https://registry.conduitdata.io/index.json.
--index-fileRead the index from a local file instead of --index-url.
--jsonEmit the result as structured JSON.

2. Transfer the bundle

Copy the .bundle.tar.gz to the air-gapped machine by whatever means that environment allows (physical media, an internal artifact store, etc.). The bundle is the only thing that needs to cross the boundary.

3. Install from the bundle

On the air-gapped machine, install with --bundle:

conduit connectors install --bundle postgres.bundle.tar.gz

This makes no network call of any kind. Conduit re-verifies the artifact's signature and provenance and the index snapshot entirely from the bundle's contents before writing anything to --connectors.path. When --bundle is set, the positional <name>[@version] argument is ignored — the bundle already names its own connector and version.

Everything else about the install behaves as described in Installing Connectors: the same connectors directory resolution, the same fail-closed verification, the same sha256 corruption check.

Stale bundles

The index snapshot inside a bundle has an age. If it is older than the configured maximum staleness (install.max-staleness, 7 days by default), the offline install refuses it — a stale snapshot may predate a version yank or a publisher revocation.

--allow-stale-bundle tolerates an over-age snapshot, and is gated with exactly the same rigor as --allow-unsigned:

  • Interactively, Conduit prompts you to type the bundle path to confirm. Only an exact match proceeds.
  • Non-interactively, the flag alone does nothing — you must also set CONDUIT_ALLOW_STALE_BUNDLE=I_UNDERSTAND.
  • Operators can disable it entirely by setting install.allow-stale-bundle to false (the default), which no flag, TTY, or environment variable can override.
conduit connectors install --bundle postgres.bundle.tar.gz --allow-stale-bundle
tip

Prefer re-bundling on the connected machine over --allow-stale-bundle. A fresh bundle carries a current index snapshot and needs no escape hatch.

scarf pixel conduit-site-docs-using-connectors