Grandiflor Operator · Open source · MIT licensed
Magnolia CMS on Kubernetes,
from one custom resource.
A Kubernetes operator that provisions a Magnolia author instance, N public instances, and a dedicated PostgreSQL cluster for each — with backups, point-in-time restore and Gateway API routing wired in.
What it does
You describe the deployment once. The operator reconciles everything under it — and keeps reconciling as the spec changes.
You write
- One
Sitecustom resource - Image, instance count, storage
- Hostnames, backups, logging
The operator creates
- Author pod, PVC, ConfigMap, Services
- N public pods, each with its own PVC
- One PostgreSQL cluster per instance
HTTPRouteresources and health checks
Scale the public count up and new instances seed themselves from an existing one; scale it down and the operator reclaims the pods, volumes and databases that are no longer in the set.
What you get
A database per instance
Every author and public instance gets its own PostgreSQL cluster, managed by CloudNativePG — not a shared database with a schema per tenant.
Backups and point-in-time restore
Continuous WAL archiving to S3, GCS or Azure, scheduled base backups, and restore to a timestamp, an LSN, a transaction or a named restore point — also in place, where each restore gets an archive of its own and the one it came from stays intact.
Portable ingress
Standard Gateway API HTTPRoute resources, so any conformant controller works —
Istio, Envoy Gateway, NGINX Gateway Fabric, Contour. Tested on GKE's managed Gateway
and on Envoy Gateway.
Per-instance routing
Optionally give every public instance its own hostname, so you can reach and verify a single instance directly rather than through the shared load balancer.
Your containers alongside
Add init containers, sidecars, volumes, environment variables and config sources per role or across the whole deployment, without forking anything.
Logging you can configure
JSON or pattern console output and per-logger levels straight from the custom resource, so log shipping works without rebuilding an image.
Install
Each release publishes its manifests to the project's package registry. Requires Kubernetes 1.27+ with the CloudNativePG operator installed.
VERSION=1.4.0
BASE="https://gitlab.com/api/v4/projects/magnolia-hamburg-public%2Fgrandiflor-operator/packages/generic/manifests/${VERSION}"
# 1. The CRD. Server-side apply is required — the CRD embeds the
# core/v1 Container and Volume schemas and is well past the limit
# a client-side apply can annotate.
kubectl apply --server-side -f ${BASE}/sites.grandiflor.com-v1.yml
# 2. The operator itself.
kubectl create namespace grandiflor-operator
kubectl apply -n grandiflor-operator -f ${BASE}/kubernetes.yml
# 3. RBAC for the resources it manages.
curl -sSL ${BASE}/operator-rbac.yaml \
| sed "s/namespace: REPLACE_ME/namespace: grandiflor-operator/" \
| kubectl apply -f -
Site in the
grandiflor.com API group. Upgrading from a pre-rename release needs the
migration steps in the README, not a plain kubectl apply.
Site resource.
The repository ships a commented example covering every field, using the
Magnolia CE image
so it runs without a licence; the README documents the schema section by section —
start there.
HTTPRoute resources only, so the Gateway, its listeners and
its certificates are for you to apply. Worked samples ship with the project: one for
GKE's managed Gateway, one for
self-managed controllers such as
Envoy Gateway, and an optional
client-certificate setup that puts the author
behind mTLS.
What this is, and isn't
Worth being direct about, so nobody installs it expecting the wrong thing.
No licence needed to try it
The operator is MIT licensed, and Magnolia Community Edition runs on it unchanged — the public CE image needs no licence key or registry credentials. For the commercial DX editions you bring your own licence and webapp image.
An independent project
Not affiliated with, endorsed by, or sponsored by Magnolia International Ltd. Built and maintained for real deployments, and shared because it may be useful to others running the same stack.
Infrastructure stays yours
It emits HTTPRoute resources, never the Gateway, its TLS or its certificates.
That cluster-level infrastructure differs per cloud and stays under your control.