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:
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.
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:
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.
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 |