Skip to content

Air-gapped installation

Cloudkeel-DD needs no internet access to run. We operate no endpoints of our own, so there is no telemetry, no analytics and no licence server to punch a hole for. The only outbound calls it makes are the read-only ones to the endpoints you connect — your Terraform state backend, your cloud APIs, your Kubernetes clusters — plus any notification webhook or Git host you configure yourself.

What an air-gapped install does need is the container images and the chart, mirrored inside your network before you start.

Five, all pulled at install time.

ImageUsed byAlways pulled?
driftdetective/ddetective-backendAPI, worker, beat, the schema-migration Job, and the wait-for-database init containersYes
driftdetective/ddetective-frontendThe UIYes
openpolicyagent/opa:1.18.2Policy evaluationYes — deployed unconditionally
postgres:16Bundled databaseOnly when postgresql.enabled (default true)
redis:7Bundled broker and rate-limit storeOnly when redis.enabled (default true)

One image covers five workloads. The API, worker and beat are the same backend image run with different commands, and both the migration Job and the wait-for-database init containers use it too. Mirror it once.

Pin the tags. images.backend.tag and images.frontend.tag default to the chart’s appVersion when left empty. Set them explicitly for an air-gapped mirror, so a chart upgrade cannot ask for a tag you have not copied in.

If you point postgresql.enabled and redis.enabled at external managed instances instead, those two images drop off the list.

The chart lives in the same public OCI registry as the images. Pull it to a file on a connected machine:

Terminal window
helm pull oci://registry-1.docker.io/driftdetective/d-detective --version <version>

That writes d-detective-<version>.tgz. Carry it in with the images and install from the local file rather than from the registry.

imagePullSecrets:
- name: my-registry-creds
images:
backend:
repository: registry.internal/mirror/ddetective-backend
tag: "<appVersion>"
frontend:
repository: registry.internal/mirror/ddetective-frontend
tag: "<appVersion>"
opa:
image: registry.internal/mirror/opa:1.18.2
postgresql:
image: registry.internal/mirror/postgres:16
redis:
image: registry.internal/mirror/redis:7
Terminal window
helm install dd ./d-detective-<version>.tgz -f airgap-values.yaml \
--namespace ddetective --create-namespace

The required secrets are unchanged — see secrets. The Fernet key is immutable after first install.

Nothing of ours. But Cloudkeel-DD can only scan what the cluster can reach: your Terraform state backend, the cloud API endpoints for each connected credential, and the API server of each connected Kubernetes cluster. If a scope is not reachable from inside the air gap, it cannot be scanned — that is a network constraint on your side, not an internet requirement on ours.

The documentation site loads nothing from a third party: no script, stylesheet, image or font comes from an external host, and every absolute URL in the built site is its own canonical link. Fonts are self-hosted. So the same static files the public site serves can be served inside the air gap with no external access.

Ask us and we will supply the built bundle.