Skip to content

Air-gapped install

The platform is designed to run with no internet egress. Every image it needs can be mirrored into your own registry, TLS can be self-signed from an internal CA, and identity stays inside your network. This page covers the air-gap-specific settings.

Who this is for

Platform engineers deploying into disconnected or tightly-egress-controlled environments (regulated industries, on-prem data centers).

1. Mirror the images

Every image — the gateway, control plane, console, databases, identity, observability, and the built-in plugins — is pinned to an explicit version and copied (not rebuilt) from the public release registry ghcr.io/opsta/opsta-ai-gateway into your registry. Run this once, from a host that can reach both your registry and ghcr.io (the source images are public — no Opsta credentials needed).

Prerequisites

  • oras and yq on the connected host (the repo's task runner uses both).
  • Log in to your registry: oras login your-registry.internal (use -u/-p or a token). The ghcr.io source is public, so it needs no login.

One command for the whole set

From a checkout of the product repo at the release tag you're installing:

bash
task mirror:product MIRROR=your-registry.internal/agw VERSION=v1.14.0
# add PLAIN_HTTP=1 if your registry serves plain HTTP (no TLS)

mirror:product copies everything into one project: the Opsta-built images (your-registry.internal/agw/<name>:v1.14.0), the built-in AI plugins (your-registry.internal/agw/plugins/<name>), and every third-party upstream image (oauth2-proxy, redis, nginx, …) flattened to your-registry.internal/agw/<leaf>. It is idempotent — re-running skips images already present. (Internally it runs task mirror for the upstream images and task mirror:images for ours + plugins; you can run those two steps separately if you prefer.)

Point the chart at your registry

Set both registry and imageMirror to the same project so the entire product is served from one place:

yaml
global:
  registry: your-registry.internal/agw       # Opsta-built images + AI plugins
  imageMirror: your-registry.internal/agw    # upstream third-party images (same project)
  imageMirrorFlatten: true                   # collapse everything under that one project
  imagePullSecrets:
    - name: internal-registry                # a Secret granting pull on your registry

One project, no repo sprawl

imageMirrorFlatten: true rewrites every upstream image to <imageMirror>/<leaf>:<tag>, and the Opsta-built leaf names are unique across the whole set (our console ships as opsta-console so it never clashes with Higress's console). With registry and imageMirror pointed at the same <host>/<project>, the entire product sits under one Harbor/ECR/Artifactory project — you create a single repository, not dozens. The chart rewrites image references automatically; you never edit manifests.

The exact image list and tested versions live in the chart's component matrix — see Upgrades and the Configuration reference. mirror:product always copies the whole set for the product version you check out; the set is tested together.

2. Self-signed or internal-CA TLS

Public ACME providers aren't reachable in an air-gap, so use a certificate source you control:

yaml
tls:
  mode: selfsigned     # cert-manager issues a self-signed wildcard

…or tls.mode: provided with a wildcard certificate from your internal CA, which your clients already trust. See TLS & domains.

3. Reuse in-cluster operators if you have them

If your platform already runs cert-manager, a Redis operator, or CloudNativePG, reuse them instead of installing duplicates — see Reuse existing operators. This also means fewer images to mirror.

4. Identity stays internal

Keycloak runs in-cluster as the identity broker, so sign-in never leaves your network. Organizations connect their corporate IdP to Keycloak over your internal network — see SSO & IdP brokering. Avoid the google SSO mode in a true air-gap; broker an internal OIDC/SAML provider instead.

5. Observability is self-hosted

The bundled metrics/logs/traces stack runs entirely in-cluster — nothing is shipped to a third-party cloud. In HA, point it at your internal object storage. See Platform observability.

What never leaves the cluster

  • LLM request and response content (the gateway proxies to the providers you configure).
  • Telemetry — metrics, logs, traces.
  • Identity — sign-in and tokens.
  • Configuration and audit — stored in your PostgreSQL.

See Data sovereignty for the full statement.

Egress allowlist (non-air-gapped clusters)

If you are not fully air-gapped but want to restrict outbound access, configure NetworkPolicy Egress rules or a firewall allowlist to these destinations only:

DestinationPortWhen requiredPurpose
Your LLM provider endpoints (e.g. api.openai.com)443AlwaysForwarding chat-completion requests
Your MCP server endpoints443 (or custom)If MCP servers configuredMCP tool calls
acme-v02.api.letsencrypt.org443tls.mode: letsencrypt onlyACME cert issuance
Kubernetes API server443AlwaysOperator reconcile loops (CNPG, Redis operator, cert-manager)
Your OIDC/SAML IdP endpoints443SSO configuredKeycloak broker discovery + token exchange
Your S3-compatible object store443HA + backups enabledLGTM blocks + Postgres WAL archiving
Your internal image registry443Air-gap + image pullsRequired if imagePullPolicy: Always is active

No outbound connection to Opsta. The platform has no telemetry, license check, or call-home.

For a true air-gap (full imageMirror + tls.mode: provided/selfsigned + internal IdP + local object store), zero outbound connections are required after installation beyond your LLM providers.

Next steps

Enterprise AI governance, on infrastructure you own.