Self-Hosting

Helm Charts Overview

The charts that make up a flex.plane deployment and how they fit together.

flex.plane is deployed to a Kubernetes management cluster using Helm charts. Each chart handles a distinct piece of the platform. The Proxmox compute nodes themselves do not run Kubernetes. They only need the flex.plane agent installed.

Understand the chart architecture

A complete deployment consists of these charts:

ChartPurposeDependencies
identityZitadel OIDC provider + PostgreSQL for authentication and user managementPostgreSQL (bundled or external)
flextenantThe orchestrator (GraphQL API) and portal (web UI)identity, Headscale
flexkubeManaged Kubernetes control planes (etcd, API server, controller manager, scheduler)flextenant
flexgatewayEdge gateway services, load balancer proxies, and service exposure to the Tailscale meshflextenant
konnectivity-agentNetwork proxy agent for managed Kubernetes clustersflexkube

The typical installation order:

  1. identity: set up authentication first. Everything else depends on OIDC tokens.
  2. flextenant: deploy the orchestrator and portal. This is the core of the platform.
  3. flexkube: deploy per managed Kubernetes cluster. One release per cluster.
  4. flexgateway: deploy per zone or per set of load balancers. One release per deployment target.
  5. konnectivity-agent: deploy on managed clusters for control plane connectivity.
The only required charts for a basic deployment are identity and flextenant. The other charts are deployed as you need their features (managed Kubernetes, load balancing, edge gateways).

Choose your registry

All flex.plane container images are hosted at:

ghcr.io/zeitlos/flex.plane

Individual images follow the pattern:

ghcr.io/zeitlos/flex.plane/<service>:<tag>

For example:

  • ghcr.io/zeitlos/flex.plane/orchestrator:abc1234
  • ghcr.io/zeitlos/flex.plane/portal:abc1234
  • ghcr.io/zeitlos/flex.plane/cloud-controller-manager:abc1234

If your cluster cannot reach ghcr.io directly, mirror the images to your internal registry and set the image.repository values in each chart accordingly.

Manage versions

Container images are tagged with the git commit hash from which they were built. There are no latest tags. Every deployment is pinned to a specific version.

Set the image tag in your Helm values:

# charts/flextenant/values.yaml
orchestrator:
  image:
    tag: "a1b2c3d"

portal:
  image:
    tag: "a1b2c3d"
Keep all flex.plane components on the same version. Mixing versions between the orchestrator, portal, and agents is not tested and may lead to unexpected behavior.

To check which version you are running, query the API:

{ tenant { version } }

This returns the git commit hash of the running orchestrator.