Deploying Behind Proxies

If your Kubernetes cluster is behind an HTTP proxy or firewall, follow the instructions below to ensure Robusta and HolmesGPT have the necessary access.

Configuring Proxy Settings

Set the HTTP_PROXY and HTTPS_PROXY environment variables in your Helm values:

runner:
  additional_env_vars:
    - name: HTTP_PROXY
      value: "http://your-proxy:port"
    - name: HTTPS_PROXY
      value: "http://your-proxy:port"

holmes:
  additionalEnvVars:
    - name: HTTP_PROXY
      value: "http://your-proxy:port"
    - name: HTTPS_PROXY
      value: "http://your-proxy:port"

To set many variables at once, runner.additional_env_froms accepts a Kubernetes envFrom source. See this GitHub issue for details and examples.

Firewall / DNS Allowlist

When deploying Robusta in a tightly restricted environment, the runner needs outbound access to a number of external endpoints. The list below is organized by feature so you can allow only what you actually use. Under each wildcard, the specific hosts it expands to are listed indented so you can pick exact hostnames instead of a wildcard if your firewall requires it.

Note

Traffic is always initiated outbound from the runner. No inbound connections to your cluster are required. All endpoints are reached over HTTPS (TCP/443) unless noted otherwise.

# Robusta SaaS platform (required if robusta_sink enabled)
*.robusta.dev
    api.robusta.dev          # platform REST API: cluster registration, action relay, telemetry
    relay.robusta.dev        # WebSocket relay (wss://); override with WEBSOCKET_RELAY_ADDRESS
    platform.robusta.dev     # Robusta UI (links rendered into Slack/Teams/email)
    sp.robusta.dev           # platform analytics
    docs.robusta.dev         # doc links embedded in notifications (not strictly required)
*.supabase.co                # cluster data store; exact subdomain comes from your token's store_url

# Install / upgrade (only needed during helm install/upgrade and image pulls)
robusta-charts.storage.googleapis.com   # Robusta Helm chart repository
*.docker.io                             # default registry for robustadev/* images
    registry-1.docker.io
    auth.docker.io
    production.cloudflare.docker.com
us-central1-docker.pkg.dev              # HolmesGPT MCP server images and bundled tooling
quay.io                                 # only with bundled kube-prometheus-stack subchart
ghcr.io                                 # only with bundled kube-prometheus-stack subchart

# Error reporting (only if runner.sentry_dsn / holmes.sentryDSN is set; default points to .de.sentry.io)
*.sentry.io
    *.ingest.sentry.io
    *.ingest.de.sentry.io

# Sinks (only those you enable)
*.slack.com
    slack.com
    hooks.slack.com
    files.slack.com
slack-files.com                         # Slack file uploads
*.office.com                            # Microsoft Teams Incoming Webhook
*.logic.azure.com                       # Microsoft Teams Workflows / Power Automate
graph.microsoft.com                     # Microsoft Teams Graph API
*.pagerduty.com
    events.pagerduty.com
    api.pagerduty.com
*.opsgenie.com
    api.opsgenie.com
    api.eu.opsgenie.com                 # if host: eu
*.atlassian.net                         # Jira (your tenant subdomain)
*.service-now.com                       # ServiceNow (your instance subdomain)
*.datadoghq.com
    api.datadoghq.com
    api.us3.datadoghq.com
    api.us5.datadoghq.com
    api.ap1.datadoghq.com
*.datadoghq.eu                          # Datadog EU region
discord.com                             # webhooks under discord.com/api/webhooks/...
api.telegram.org                        # override with TELEGRAM_BASE_URL for self-hosted Bot API
api.pushover.net
api.incident.io
webexapis.com
alert.victorops.com                     # VictorOps / Splunk OnCall
botapi.messenger.yandex.net             # Yandex (override with YM_API_BASE_URL)
# Mattermost, RocketChat, Zulip, generic Webhook, Kafka: allow the host you configured

# HolmesGPT LLM providers (only those you use)
api.openai.com                          # OpenAI
api.anthropic.com                       # Anthropic
*.openai.azure.com                      # Azure OpenAI (your resource subdomain)
login.microsoftonline.com               # Azure AD OAuth (Azure OpenAI / Azure Managed Prometheus)
*.amazonaws.com                         # AWS Bedrock
    bedrock-runtime.<region>.amazonaws.com
    sts.amazonaws.com
*.googleapis.com                        # Google Vertex AI / Gemini
    aiplatform.googleapis.com
    generativelanguage.googleapis.com
    oauth2.googleapis.com

# Cloud / observability auth (only if you use these managed backends)
prometheus.monitor.azure.com            # Azure Managed Prometheus query endpoint
169.254.169.254                         # cloud instance metadata (Azure/AWS/GCP managed identity)

If you mirror images to a private registry, override image.registry (and the per-component image: fields) in your Helm values and you can drop the public registries from the allowlist.

If your private registry requires authentication, set global.imagePullSecrets. This applies the pull secret to the runner, kubewatch, and the pods the runner launches at runtime (e.g. KRR, Popeye, via the runner ServiceAccount). To also cover HolmesGPT, set holmes.imagePullSecrets — HolmesGPT is a subchart, so set it explicitly alongside the global value:

global:
  imagePullSecrets:
    - name: my-registry-secret

# HolmesGPT is a subchart — set its pull secret as well
holmes:
  imagePullSecrets:
    - name: my-registry-secret

A per-component value (e.g. runner.imagePullSecrets, kubewatch.imagePullSecrets, holmes.imagePullSecrets) overrides the global one for that component. Leaving global.imagePullSecrets empty keeps the previous behavior.

Verifying the Allowlist

After applying firewall rules, you can sanity-check connectivity from inside the runner pod:

kubectl exec -n <robusta-ns> deploy/robusta-runner -- \
  sh -c 'for host in api.robusta.dev relay.robusta.dev platform.robusta.dev; do
    echo "== $host =="; curl -sS -o /dev/null -w "%{http_code}\n" https://$host/ || true
  done'

A non-zero HTTP code (including 401/404) confirms TCP + TLS reach the host. Connection timeouts indicate the firewall is still blocking.

Copying Images to a Private Image Registry

If you are running the Robusta self-hosted platform (the robusta-platform Helm chart) in an environment that cannot pull from public registries (Docker Hub, us-central1-docker.pkg.dev, quay.io), mirror the images below to your internal registry and override the registry fields in your Helm values.

The list reflects the images pulled by the chart at the versions shipped in the current release. Image tags change between chart versions — re-check values.yaml of the chart version you are installing.

Images from the Robusta registry (default: us-central1-docker.pkg.dev/genuine-flight-317411/devel)

robusta-db:14.1.1            # Supabase Postgres 14 (default DB image)
robusta-db:15.0.0            # Supabase Postgres 15 (only if usePostgres15=true)
db-migration:0.0.66          # DB migration init Job
realtime:v2.96.0             # Robusta fork of supabase/realtime (JWT_REQUIRE_EXP)
platform-relay:0.22.0        # Relay (WebSocket + API)  — only if enableRelay=true
robusta-ui:0.2.87            # Platform UI              — only if enableRobustaUI=true
rbac-import:0.3.0            # Optional RBAC import CronJob (rbacImport.enabled)

Images from Docker Hub (controlled by dockerRegistry)

supabase/gotrue:v2.189.0
supabase/postgres-meta:v0.96.5
supabase/studio:2026.05.11-sha-5a5099a
postgrest/postgrest:v14.6
kong:3.9.1
postgres:15-alpine                  # realtime schema-init container
busybox:1.37                        # init containers for rest/meta/migration

Optional images (only if the corresponding feature is enabled)

quay.io/prometheuscommunity/postgres-exporter:v0.15.0   # monitoring.postgresExporter.enabled

After mirroring, point the chart at your registry by overriding the following values:

# Robusta-built images
robustaRegistry: my-registry.example.com/robusta

# Public images — value is used as a prefix, so include the trailing slash
dockerRegistry: my-registry.example.com/

# Subchart registries (robusta-ui and robusta-relay are dependencies)
robusta-ui:
  registry: my-registry.example.com/robusta
robusta-relay:
  registry: my-registry.example.com/robusta

# Monitoring image is a full path — override directly if enabled
monitoring:
  postgresExporter:
    image: my-registry.example.com/prometheuscommunity/postgres-exporter:v0.15.0

# If your registry requires auth
imagePullSecrets:
  - name: my-registry-secret

Tip

Override the registry, not the tags. The chart exposes per-image fields (dbImage, authImage, realtimeImage, migrationImage, etc.) but these are intended for internal use — they pin the exact tags that have been tested with the current chart version. If you pin them yourself, every chart upgrade will silently roll your images back to the tags you hard-coded, and you will need to bump each one by hand on every release.

For mirrored-registry setups, override only robustaRegistry / dockerRegistry (and the matching subchart registry fields). The chart will continue to use the image tags shipped with each version, just pulled from your private registry — so helm upgrade keeps working seamlessly. Your mirroring workflow only needs to re-pull the new tags from values.yaml before each upgrade.

Running Robusta in Air-Gapped or Offline Environments

Contact support@robusta.dev for self-hosted deployment options that work in fully air-gapped or offline environments (private image registry, on-prem platform, no SaaS dependency).