Handbook - Configuration

Image Customization

Customize CloudGrid service images and base images without weakening runtime boundaries.

On this page

CloudGrid releases publish one OCI image per deployable service. The official images are the supported production runtime artifacts; binary archives are convenience artifacts for inspection and direct service testing.

Service Images

ImageRuntime role
cloudgrid-bffPublic GraphQL, auth, health, and static frontend serving.
cloudgrid-otlp-collectorPublic OTLP HTTP/gRPC ingestion.
cloudgrid-storage-readPrivate telemetry query and live fanout service.
cloudgrid-storage-writePrivate JetStream persistence worker.
cloudgrid-control-planePrivate company, user, project, dashboard, alert, and retention control service.
cloudgrid-ai-eval-runnerOptional private AI evaluation runner.
cloudgrid-alert-evaluatorOptional private alert rule evaluator.
cloudgrid-storage-maintenancePrivate retention maintenance worker.

The BFF image is the only image that may contain built frontend assets. No image should contain .env, local credentials, test secrets, private keys, dependency caches, or SurrealDB credentials.

Production Image References

Production values should use digests:

global:
  imageRegistry: ghcr.io/cloudgrid-dev

bff:
  image:
    repository: cloudgrid-bff
    digest: sha256:<digest>
    pullPolicy: IfNotPresent

Semantic tags such as v1.0.0-beta are readable release identifiers, but production rollout values should pin the digest from release-values.yaml or release-manifest.json. Do not use latest for production.

Runtime Hardening Defaults

CloudGrid runtime images and Kubernetes values are expected to preserve:

  • numeric non-root UID/GID;
  • read-only root filesystem;
  • dropped Linux capabilities;
  • disabled privilege escalation;
  • owned service ports only;
  • health probes on /livez and /readyz where the service exposes them;
  • SurrealDB credentials mounted only into storage-owning services.

Custom Base Image Build Args

Official Dockerfiles support base image and runtime identity overrides:

Build argApplies toPurpose
CLOUDGRID_GO_BUILDER_IMAGEGo servicesBuilder image with the supported Go toolchain.
CLOUDGRID_GO_RUNTIME_IMAGEGo servicesMinimal runtime base for compiled Go binaries.
CLOUDGRID_BUN_BUILDER_IMAGEBFFBuilder image with Bun and Node-compatible tooling.
CLOUDGRID_BUN_RUNTIME_IMAGEBFFMinimal runtime base for the production BFF bundle.
CLOUDGRID_IMAGE_UIDall servicesNumeric runtime user ID.
CLOUDGRID_IMAGE_GIDall servicesNumeric runtime group ID.

Example:

docker buildx build \
  --file deploy/docker/cloudgrid-storage-read.Dockerfile \
  --build-arg CLOUDGRID_GO_BUILDER_IMAGE=registry.example.com/base/go:1.25 \
  --build-arg CLOUDGRID_GO_RUNTIME_IMAGE=registry.example.com/base/static-runtime:2026-05 \
  --build-arg CLOUDGRID_IMAGE_UID=10001 \
  --build-arg CLOUDGRID_IMAGE_GID=10001 \
  --tag registry.example.com/cloudgrid/cloudgrid-storage-read:v1.0.0-beta \
  .

Custom bases are supported only when they preserve the runtime contract:

  • CA certificates when outbound TLS is used;
  • executable service binary or BFF bundle entrypoint;
  • writable temporary directory only if the service explicitly requires one;
  • no shell requirement at runtime;
  • no baked credentials;
  • no added public ports.

Chart Overrides

Use image registry and repository overrides for custom registries:

global:
  imageRegistry: registry.example.com/cloudgrid

storageRead:
  image:
    repository: cloudgrid-storage-read
    digest: sha256:<mirrored-digest>

If your registry requires authentication, set pull secrets:

global:
  imagePullSecrets:
    - name: cloudgrid-registry

Validation

Run the static release validation after Dockerfile or chart image-shape changes:

bun run release:validate

For a complete release gate, run:

bun run verify

Next Step

For mirrored images and air-gapped installs, use Private registry and air-gapped installs.

Last updated .