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.