Skip to main content

Firewall and Air-Gapped Deployment

This document covers every external network dependency that CCX has at runtime. Use it to build firewall allowlists or to plan what must be mirrored or proxied when operating in a restricted or air-gapped environment.

There are two distinct planes with different requirements:

  • Control plane – the Kubernetes cluster running CCX services (helm-ccx, helm-ccxdeps, clustercontrol).
  • Data plane – the cloud VMs (database nodes) that CCX provisions on your cloud provider.

1. Container Image Registries

All container images must be reachable when Kubernetes pulls them. In an air-gapped environment, mirror every registry below to an internal registry and override the image: values in your Helm values files accordingly.

helm-ccx images

RegistryUsed by
eu.gcr.io/brave-night-121210All CCX backend services (stores, runner, rest, auth, notify, billing, monitor, state-worker), cmon
europe-docker.pkg.dev/severalnines-public/clustercontrolccmgr, kuber-proxy
docker.io/severalninescmon exporter (severalnines/cmon_exporter-linux-amd64)
curlimages/curlccx-migrate-cloud-credentials init job (hardcoded in template)

helm-ccxdeps images

RegistryUsed by
docker.io/bitnamilegacyKeycloak (bitnamilegacy/keycloak)
docker.io/bitnamikubectl init container in mysql-innodb-patch job (bitnami/kubectl:latest)
docker.io/mysqlmysql exporter init container (mysql:8.4)
docker.io/prometheuscommunitypostgres-exporter (prometheuscommunity/postgres-exporter:v0.15.0)

helm-ccxdeps chart repositories (Helm pull time)

These are only required when running helm dependency update or helm install for the first time. They are not needed at runtime, but must be accessible during CI/CD or the initial pull.

Repository URLChart
https://opensource.zalando.com/postgres-operator/charts/postgres-operatorpostgres-operator
https://kubernetes.github.io/ingress-nginxingress-nginx
https://nats-io.github.io/k8s/helm/charts/nats
https://kubernetes-sigs.github.io/external-dns/external-dns (optional)
https://mysql.github.io/mysql-operator/mysql-operator / mysql-innodbcluster (optional)
https://severalnines.github.io/helm-charts/ccx-monitoring
oci://registry-1.docker.io/bitnamichartskeycloak
oci://quay.io/jetstack/chartscert-manager (optional)

clustercontrol images

RegistryUsed by
docker.io/severalninescmon, cmon-sd, cmon exporter
europe-docker.pkg.dev/severalnines-public/clustercontrolccmgr, kuber-proxy

2. License Server

CCX needs to push a valid ClusterControl (cmon) license on startup.

EndpointProtocol/PortDirectionPurpose
severalnines.com/service/lic.phpHTTPS / 443outbound from control planeTrial license auto-fetch on first user registration (ccx-auth-service)

What happens without access:

  • If cmon.license is set in Helm values, the license is loaded from a Kubernetes Secret at startup via a startupProbe. No internet access is required for this path.
  • If cmon.license is not set, ccx-auth-service attempts to fetch a trial license from https://severalnines.com/service/lic.php when the first user registers. If the call fails, the error is logged but user registration still succeeds; however, cmon remains unlicensed and will enforce cluster/node count limits.

Recommendation for air-gapped environments: Always set cmon.license with a pre-obtained license key in your Helm values. This avoids any outbound call to the license server.

Note: helm-ccx stores the license as base64-encoded data in the secret (data: field). clustercontrol uses plaintext (stringData: field). Do not mix formats between charts.


3. Data Plane – Database Node Package Repositories

When CCX deploys a database cluster, it provisions cloud VMs and bootstraps them via cloud-init. The VMs themselves make outbound package installation calls. In a properly firewalled or air-gapped environment these must either be allowed through or mirrored via an internal APT proxy (e.g. Aptly, Nexus, or a simple apt-cacher-ng).

Always required (all clusters)

RepositoryURLPurpose
Severalnines s9s agenthttps://europe-apt.pkg.dev/projects/severalnines-publicccx agent packages

Per database vendor

VendorRepository URLPurpose
MariaDBhttp://dlm.mariadb.com/repo/mariadb-server/<version>/MariaDB server packages
Percona (MySQL 8.0 / PXC 8.0)http://repo.percona.com/ps-80/aptPercona Server 8.0
http://repo.percona.com/pxc-80/aptPercona XtraDB Cluster 8.0
http://repo.percona.com/pxb-80/aptPercona XtraBackup 8.0
http://repo.percona.com/telemetry/aptPercona telemetry agent
Percona (MySQL 8.4 / PXC 8.4)http://repo.percona.com/ps-84-lts/aptPercona Server 8.4 LTS
http://repo.percona.com/pxc-84-lts/aptPercona XtraDB Cluster 8.4 LTS
http://repo.percona.com/pxb-84-lts/aptPercona XtraBackup 8.4 LTS
http://repo.percona.com/telemetry/aptPercona telemetry agent
PostgreSQLhttp://apt.postgresql.org/pub/repos/aptPostgreSQL PGDG packages
All vendorshttps://packages.fluentbit.io/ubuntu/<release>Fluent Bit log forwarder

Standard Ubuntu package mirrors (e.g. archive.ubuntu.com) must also be reachable or mirrored for base dependencies installed by cloud-init.


4. Backup Storage (Cloud Provider S3 / Object Storage)

CCX stores datastore backups in S3-compatible object storage. The database nodes and the control plane both need to reach the backup endpoint.

EndpointDirectionPurpose
AWS S3 (s3.amazonaws.com / per-region endpoints)outbound from control plane and data plane VMsBackup upload and restore
Custom S3-compatible endpoint (configured per cloud in ccx.yaml)outboundAny S3-compatible store (MinIO, Zadara, Ceph, etc.)

For air-gapped environments, configure an internal S3-compatible object store (e.g. MinIO) and set the endpoint field in the backup storage configuration accordingly.


5. Notification Services (Optional)

These are only required if the corresponding notification channel is enabled.

ServiceEndpointProtocol/PortEnv varsDefault
SMTPConfigurableTCP / 25 or 587SMTP_HOST, SMTP_PORT, SMTP_USERNAME, SMTP_PASSWORDDisabled (ENABLE_EMAIL)
Slackhttps://hooks.slack.comHTTPS / 443SLACK_URL, SLACK_CHANNEL, ENABLE_SLACKDisabled
PagerDutyhttps://events.pagerduty.com/v2/enqueueHTTPS / 443PAGERDUTY_KEY, ENABLE_PAGERDUTYDisabled

All three default to disabled. Only open the corresponding firewall rules if you explicitly enable a channel.


6. Stripe Billing (Optional)

Stripe billing is disabled by default (ccx.services.billing.stripe: false). When enabled:

EndpointProtocol/PortDirectionPurpose
api.stripe.comHTTPS / 443outbound from ccx-billing-serviceSubscription and payment management
js.stripe.comHTTPS / 443browser → Stripe (client-side)Stripe payment UI elements (allowed in CSP via helm-ccxdeps nginx config)

In a fully air-gapped deployment, leave stripe: false.


7. Analytics / CDN (Optional, Browser-Side)

The following are browser-side calls and do not require server-side firewall rules. They are listed for completeness if you operate a restrictive client-side proxy or egress filter.

EndpointPurpose
https://severalnines.piwik.proCCmgr analytics (allowed in CSP in cmon MCC deployment)
https://st.s9s.ioStatic assets: logos, icons, email template images

These can be blocked on the client side without affecting backend functionality. If st.s9s.io is blocked, email notification images will not load.


8. Internal Service Communication (No External Access Required)

The following services communicate within the Kubernetes cluster and require no external firewall rules. They are listed to clarify what is in-cluster only.

ServicePortProtocol
cmon RPC API9501HTTPS (in-cluster)
cmon legacy API9500HTTPS (in-cluster)
cmon SSH proxy9511TCP (in-cluster)
cmon cloud9518TCP (in-cluster)
cmon exporter9954HTTP (in-cluster)
cmon-sd (service discovery)8080HTTP (in-cluster)
ccmgr19051HTTP (in-cluster)
kuber-proxy HTTP8081HTTP (in-cluster)
kuber-proxy gRPC50051gRPC (in-cluster)
ccx-stores gRPC20001 / 20002 / 20003gRPC (in-cluster)
ccx-stores listener18097HTTP (in-cluster)
ccx-rest-user18091HTTP (in-cluster)
Victoria Metrics / Prometheus9090HTTP (in-cluster)
Keycloak80 (internal)HTTP (in-cluster)
NATS JetStream4222TCP (in-cluster)
PostgreSQL (CCX DB)5432TCP (in-cluster)

9. Cloud Provider API Endpoints

CCX makes API calls to your cloud provider control plane to provision VMs, volumes, floating IPs, and security groups. These endpoints are defined in your cloud configuration and are provider-specific.

CloudAPI endpoint typeNotes
AWSec2.<region>.amazonaws.com, s3.<region>.amazonaws.comStandard AWS regional endpoints; private endpoints supported
OpenStackKeystone auth URL + Nova/Cinder/Neutron/GlanceFully configurable; can be internal
GCPcompute.googleapis.com, storage.googleapis.comStandard Google APIs
VMware / vCloud DirectorYour vCenter / VCD endpointFully on-premises
CloudStackYour CloudStack API endpointFully on-premises
ZadaraConfigurable endpoint in cloud configS3-compatible; can point to internal endpoint

For cloud providers that support private API endpoints (AWS PrivateLink, OpenStack internal endpoints), use those to eliminate internet access from the control plane to the cloud APIs.


10. External DNS (Optional)

External-DNS is included as an optional dependency in helm-ccxdeps (external-dns.enabled: false by default). When enabled, the external-dns controller makes API calls to your DNS provider.

CCX itself creates Kubernetes Service objects annotated with external-dns.alpha.kubernetes.io/* for the external-dns controller to consume. The controller then calls your DNS provider API. Which DNS provider endpoints need to be allowed depends entirely on your configured external-dns provider (Route53, Cloudflare, Azure DNS, etc.).


Summary Checklist

Use this as a quick reference when planning firewall rules or mirror lists.

Required for all deployments

  • Container image registries: eu.gcr.io, europe-docker.pkg.dev, docker.io (or internal mirrors)
  • cmon.license pre-set in Helm values (avoids license server call)
  • Data plane VMs can reach: europe-apt.pkg.dev + the relevant database vendor repository
  • Data plane VMs can reach: packages.fluentbit.io
  • Data plane VMs can reach your S3-compatible backup storage endpoint
  • Cloud provider API endpoints reachable from control plane

Required only if feature is enabled

  • severalnines.com/service/lic.php — only if cmon.license is not pre-set
  • SMTP host — only if ENABLE_EMAIL=true
  • hooks.slack.com — only if ENABLE_SLACK=true
  • events.pagerduty.com — only if ENABLE_PAGERDUTY=true
  • api.stripe.com — only if ccx.services.billing.stripe: true
  • DNS provider API endpoint — only if external-dns is enabled
  • Helm chart repositories — only at install/upgrade time, not at runtime