Documentation

Applications

The back office applications, databases, AI workloads and custom resources a Community Cloud runs, and how their credentials are handled.

How applications are deployed

The applications a Community Cloud runs live under k8s/apps/, and most of them in the cc-office namespace. Each one is split by what each piece is, so they can be applied in order and read one at a time:

Suffix What it is
.values.yaml Helm values for a chart, rather than a manifest
.database.yaml Its CloudNative-PG database — applied before the application that needs it
.storage.yaml Volumes or buckets — applied before anything that writes
.config.yaml Configuration and secrets
.cert.yaml Its certificate
.route.yaml The HTTPRoute that reaches it

Every file is a template rendered against cc.config.json, and every one is embedded in the installer:

apps
$ community-cloud list-embedded apps
$ community-cloud run-template embed://apps/twenty/Twenty.yaml cc.config.json

What they share

  • Databases are CloudNative-PG, never a chart's bundled one
  • Storage is TopoLVM through cc-local-ssd-fast
  • Certificates are cert-manager and Let's Encrypt
  • Ingress is the Gateway API, served by Cilium's Envoy, through a listener on the cluster Gateway
  • Domains come from values.domain.* in the configuration, so an instance is rehomed by changing one file

The applications

App What it is Namespace
Twenty Open-source CRM, deployed as a server and a worker cc-office
Authentik The identity provider everything else authenticates against cc-office
Mattermost Team chat, via the Mattermost operator cc-office
Headlamp A web UI for the cluster itself, with Community Cloud's own plugin —
Picoclaw An AI chatbot interface, designed to integrate with available MCP servers —

The shared namespace

k8s/apps/office/ holds what the cc-office applications share:

File What it is
Office.namespace.yaml The cc-office namespace, labelled so its listeners may attach to the cluster Gateway
Office.issuer.yaml A Let's Encrypt issuer scoped to the namespace
Office.database.yaml The shared CloudNative-PG cluster
Office.roles.yaml The database roles each application connects as
RedisStandalone.yaml Redis, for the applications that want a cache

Twenty CRM

File What it is
Twenty.yaml The server (port 3000) and worker deployments
Twenty.install.yaml The one-off database setup job
Twenty.database.yaml Its CloudNative-PG database
Twenty.storage.yaml An ObjectBucketClaim for uploads in Garage
Twenty.config.yaml Configuration and secrets
Twenty.cert.yaml Its certificate
Twenty.route.yaml The HTTPRoute that reaches it
Twenty.network.yaml Network policy

Authentik

Authentik's chart bundles its own PostgreSQL. Community Cloud turns that off and points it at CloudNative-PG instead — one way of running Postgres across the cluster is easier to back up, upgrade and reason about. Authentik is also the worked example of an application packaged as a plugin.

File What it is
Authentik.values.yaml Helm values
Authentik.database.yaml A CloudNative-PG database
Authentik.storage.yaml Media and template volumes
Authentik.config.yaml Configuration and secrets
Authentik.cert.yaml Its certificate

Mattermost

File What it is
Mattermost.yaml The installation
Mattermost.values.yaml Helm values for the operator
Mattermost.database.yaml Its CloudNative-PG database
Mattermost.storage.yaml Volumes for uploads

Headlamp

Headlamp.values.yaml holds its Helm values, and Headlamp.plugins.yaml the plugins it loads — including Community Cloud's own, built from cc-headlamp/ in the repository. Headlamp is available as a package:

"packages": { "headlamp": true }

Picoclaw

Picoclaw provides an AI chatbot interface, designed to integrate automatically with available MCP servers. The goal is full cluster control via chat — in particular, understanding issues at the cluster level and correlating different kinds of data.

picoclaw
$ community-cloud run-template embed://apps/picoclaw/Picoclaw.storage.yaml cc.config.json
$ community-cloud run-template embed://apps/picoclaw/Picoclaw.config.yaml cc.config.json
$ community-cloud run-template embed://apps/picoclaw/Picoclaw.deployment.yaml cc.config.json
$ community-cloud run-template embed://apps/picoclaw/Picoclaw.route.yaml cc.config.json

Databases

CloudNative-PG is used for every Postgres in the cluster, including the ones charts would otherwise bundle themselves.

Service Technology Namespace Storage
cc-postgres CloudNative-PG (PostgreSQL 18 + PostGIS 3.6) cc-office 30Gi cc-local-ssd-fast
postgis CloudNative-PG (PostgreSQL 18 + PostGIS 3.6) default 30Gi cc-local-ssd-fast
Redis Opstree operator (v7.0.15) cc-office 5Gi cc-local-ssd-fast
MariaDB Planned — —

Generated credentials

Some of what the cluster needs is a password that nothing outside the cluster has any reason to know — each application's database role, for instance. Those Secrets can't be checked into the repository next to the manifests that name them, so the installer invents them.

A package declares what it needs, and the credentials are created between its chart and the manifests that refer to them. Each becomes a kubernetes.io/basic-auth Secret with a three-word username and a five-word password, hyphen separated — about fifty-five bits, and a phrase survives being read down a telephone in a way a string of punctuation doesn't.

A password is created once and never rewritten. Running an install again doesn't rotate the credentials half the cluster is already using. Nothing records what was generated, either — it exists in the cluster and nowhere else:

kubectl
$ kubectl -n cc-office get secret twenty-crm \
-o jsonpath='{.data.password}' | base64 -d

To rotate one deliberately, change it in the Secret — or delete the Secret and install again for a fresh one. The database role's password follows within a few seconds, so anything holding a live connection will need restarting. That depends on the Secret carrying the cnpg.io/reload: "true" label, which is how CloudNative-PG knows to watch it.

AI inference

k8s/ai/vLLM/vllm-amd.yaml serves a Mistral-7B model with vLLM on AMD MI300 GPUs via ROCm, with host network and IPC, 8Gi of shared memory, and a Hugging Face token from the hf-token-secret Secret. It's exposed as a ClusterIP service on port 80, and its model weights live on the volume in vllm-amd-pvc.yaml.

It's scheduled onto nodes labelled node-role.kubernetes.io/worker-gpu, which the installer applies automatically to any node it finds a compute-capable GPU on.

vllm
$ community-cloud run-template embed://ai/vLLM/vllm-amd-pvc.yaml cc.config.json
$ community-cloud run-template embed://ai/vLLM/vllm-amd.yaml cc.config.json

Custom resources

Community Cloud defines two custom resources of its own, in k8s/crd/:

CRD Scope Purpose
Webapp Namespace An application with a domain, an image and storage — declaratively generating its deployment, service, PVC, database, HTTPRoute and certificate
Site Cluster A physical location and what runs there