> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kubox.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# kubox plane deployment reference

> The plane.yaml document a management plane is built from -- the -f file of kubox plane create

The `plane.yaml` document a management plane is built from -- the `-f` file of `kubox plane create`. Its shape is `internal/application/plane.Deployment`.

Every field, from `internal/application/plane.Deployment`'s `yaml` tags and doc comments. A field this document does not list is refused, so a misspelled name is caught rather than ignored.

## Deployment

Deployment is one management plane, as an operator describes it.

<ResponseField name="apiVersion" type="string" />

<ResponseField name="kind" type="string" />

<ResponseField name="metadata" type="Metadata">
  <Expandable title="Metadata">
    <ResponseField name="name" type="string">
      Name is what this plane is called. It becomes the cluster's name and the name its state is stored under, so it must not collide with another deployment that shares a state backend.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="spec" type="Spec">
  <Expandable title="Spec">
    <ResponseField name="capacity" type="Capacity">
      <Expandable title="Capacity">
        <ResponseField name="maxConcurrentBuilds" type="integer">
          MaxConcurrentBuilds is how many builds run at once.
        </ResponseField>

        <ResponseField name="profile" type="string">
          Profile names a shape: small, medium or large.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="database" type="Database">
      <Expandable title="Database">
        <ResponseField name="mode" type="string">
          Mode is "external" today and only external: the plane stores no data itself, so a managed database would have nowhere to live.
        </ResponseField>

        <ResponseField name="secret" type="string">
          Secret names the Kubernetes Secret holding the DSN.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="domain" type="Domain">
      <Expandable title="Domain">
        <ResponseField name="certificates" type="string">
          Certificates is production or staging. Empty is production, because a plane that nobody chose an answer for is one in service.
        </ResponseField>

        <ResponseField name="root" type="string">
          Root is the zone that must already be delegated, e.g. kubox.cloud.
        </ResponseField>

        <ResponseField name="subdomain" type="string">
          Subdomain is the label under it that this deployment owns.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="environment" type="string">
      Environment is what this deployment's resources are TAGGED as, which is what cost reports group by. Empty takes metadata.name.
    </ResponseField>

    <ResponseField name="identity" type="Identity">
      <Expandable title="Identity">
        <ResponseField name="issuer" type="string" />

        <ResponseField name="workload" type="WorkloadIdentity">
          Workload names the identity plane the plane's own workloads federate through. Required: without it the plane's pods have no identity of their own. The identity plane is created out of band, before any plane exists.

          <Expandable title="WorkloadIdentity">
            <ResponseField name="issuer" type="string">
              Issuer is the public OIDC issuer AWS validates the tokens against.
            </ResponseField>

            <ResponseField name="spireServer" type="string">
              SpireServer is what the agent on each node dials, as host:port.
            </ResponseField>

            <ResponseField name="trustBundleURL" type="string">
              TrustBundleURL is where an agent bootstraps the server's bundle from.
            </ResponseField>

            <ResponseField name="trustDomain" type="string">
              TrustDomain is the SPIFFE trust domain. Empty takes spec.domain.root, which is what it has always been for kubox.cloud.
            </ResponseField>
          </Expandable>
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="provider" type="Provider">
      <Expandable title="Provider">
        <ResponseField name="aws" type="AWSProvider">
          <Expandable title="AWSProvider">
            <ResponseField name="region" type="string" />
          </Expandable>
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="release" type="Release">
      <Expandable title="Release">
        <ResponseField name="appRepository" type="string">
          AppRepository is where a built cluster's apps come from. Empty takes the public one, which is right outside an air-gapped install.
        </ResponseField>

        <ResponseField name="publicRegistry" type="string">
          PublicRegistry is where the two PUBLIC images come from: kubox, which a build Job runs, and kubox-agent, which every built cluster runs. Anyone can pull them, so a customer's nodes need no credential and no registry extension to run the agent. Only kubox-plane, the licensed image, comes from Registry. Empty takes the default public registry; set it to mirror them somewhere else.
        </ResponseField>

        <ResponseField name="registry" type="string">
          Registry is where the OPERATOR image is pulled from -- an ECR host in production, because the plane's nodes authenticate to it with their instance role. Empty takes the public one.
        </ResponseField>

        <ResponseField name="version" type="string">
          Version is the image tag, e.g. v0.4.2. Required: a plane built from whatever `latest` meant that afternoon is a plane nobody can reproduce.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="state" type="State">
      <Expandable title="State">
        <ResponseField name="backend" type="string">
          Backend is the s3:// URL, required when Mode is external.
        </ResponseField>

        <ResponseField name="mode" type="string">
          Mode is "managed" -- kubox admin creates and owns the bucket -- or "external", where Backend names one that already exists.
        </ResponseField>

        <ResponseField name="project" type="string">
          Project is the name the plane's state is stored under, and it is also the path the state lives at within the backend. Empty derives it from metadata.name.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

## All types

Every type in the document, in the order the root reaches them. Each is also linked from the field that uses it above.

### Metadata

Metadata names the deployment.

<ResponseField name="name" type="string">
  Name is what this plane is called. It becomes the cluster's name and the name its state is stored under, so it must not collide with another deployment that shares a state backend.
</ResponseField>

### Spec

Spec is what an operator decides.

<ResponseField name="capacity" type="Capacity">
  See [Capacity](#capacity).
</ResponseField>

<ResponseField name="database" type="Database">
  See [Database](#database).
</ResponseField>

<ResponseField name="domain" type="Domain">
  See [Domain](#domain).
</ResponseField>

<ResponseField name="environment" type="string">
  Environment is what this deployment's resources are TAGGED as, which is what cost reports group by. Empty takes metadata.name.
</ResponseField>

<ResponseField name="identity" type="Identity">
  See [Identity](#identity).
</ResponseField>

<ResponseField name="provider" type="Provider">
  See [Provider](#provider).
</ResponseField>

<ResponseField name="release" type="Release">
  See [Release](#release).
</ResponseField>

<ResponseField name="state" type="State">
  See [State](#state).
</ResponseField>

### Capacity

Capacity is how big the plane is.

<ResponseField name="maxConcurrentBuilds" type="integer">
  MaxConcurrentBuilds is how many builds run at once.
</ResponseField>

<ResponseField name="profile" type="string">
  Profile names a shape: small, medium or large.
</ResponseField>

### Database

Database is the record store.

<ResponseField name="mode" type="string">
  Mode is "external" today and only external: the plane stores no data itself, so a managed database would have nowhere to live.
</ResponseField>

<ResponseField name="secret" type="string">
  Secret names the Kubernetes Secret holding the DSN.
</ResponseField>

### Domain

Domain is what the plane is reachable at.

<ResponseField name="certificates" type="string">
  Certificates is production or staging. Empty is production, because a plane that nobody chose an answer for is one in service.
</ResponseField>

<ResponseField name="root" type="string">
  Root is the zone that must already be delegated, e.g. kubox.cloud.
</ResponseField>

<ResponseField name="subdomain" type="string">
  Subdomain is the label under it that this deployment owns.
</ResponseField>

### Identity

Identity is who this plane trusts, and who vouches for it.

<ResponseField name="issuer" type="string" />

<ResponseField name="workload" type="WorkloadIdentity">
  Workload names the identity plane the plane's own workloads federate through. Required: without it the plane's pods have no identity of their own. The identity plane is created out of band, before any plane exists.
  See [WorkloadIdentity](#workloadidentity).
</ResponseField>

### Provider

Provider is where the plane runs.

<ResponseField name="aws" type="AWSProvider">
  See [AWSProvider](#awsprovider).
</ResponseField>

### Release

Release is what version to run, and where it comes from.

<ResponseField name="appRepository" type="string">
  AppRepository is where a built cluster's apps come from. Empty takes the public one, which is right outside an air-gapped install.
</ResponseField>

<ResponseField name="publicRegistry" type="string">
  PublicRegistry is where the two PUBLIC images come from: kubox, which a build Job runs, and kubox-agent, which every built cluster runs. Anyone can pull them, so a customer's nodes need no credential and no registry extension to run the agent. Only kubox-plane, the licensed image, comes from Registry. Empty takes the default public registry; set it to mirror them somewhere else.
</ResponseField>

<ResponseField name="registry" type="string">
  Registry is where the OPERATOR image is pulled from -- an ECR host in production, because the plane's nodes authenticate to it with their instance role. Empty takes the public one.
</ResponseField>

<ResponseField name="version" type="string">
  Version is the image tag, e.g. v0.4.2. Required: a plane built from whatever `latest` meant that afternoon is a plane nobody can reproduce.
</ResponseField>

### State

State is where the plane's infrastructure state is stored.

<ResponseField name="backend" type="string">
  Backend is the s3:// URL, required when Mode is external.
</ResponseField>

<ResponseField name="mode" type="string">
  Mode is "managed" -- kubox admin creates and owns the bucket -- or "external", where Backend names one that already exists.
</ResponseField>

<ResponseField name="project" type="string">
  Project is the name the plane's state is stored under, and it is also the path the state lives at within the backend. Empty derives it from metadata.name.
</ResponseField>

### WorkloadIdentity

WorkloadIdentity is the identity plane this deployment's pods attest to.

<ResponseField name="issuer" type="string">
  Issuer is the public OIDC issuer AWS validates the tokens against.
</ResponseField>

<ResponseField name="spireServer" type="string">
  SpireServer is what the agent on each node dials, as host:port.
</ResponseField>

<ResponseField name="trustBundleURL" type="string">
  TrustBundleURL is where an agent bootstraps the server's bundle from.
</ResponseField>

<ResponseField name="trustDomain" type="string">
  TrustDomain is the SPIFFE trust domain. Empty takes spec.domain.root, which is what it has always been for kubox.cloud.
</ResponseField>

### AWSProvider

AWSProvider is the AWS half.

<ResponseField name="region" type="string" />


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.