โ€น All docs / Install & self-host
๐Ÿš€
Self-host

Install Grown Workspace

Run your own instance on any Kubernetes cluster. One all-in-one Helm chart brings up the whole platform โ€” app, database, object storage and auth โ€” with no required operators, so it works on a laptop (kind), a Raspberry Pi 5 cluster, or a homelab.

What gets installed

The chart is self-contained โ€” it bundles everything Grown needs so a fresh cluster becomes a working workspace:

Everything is plain Kubernetes objects, arm64-friendly, with sensible defaults that come up out of the box on kind.

Method 1 โ€” Helm chart recommended

The simplest path. Requires a Kubernetes cluster and helm.

# clone the repo (the chart lives in deploy/helm/grown)
git clone https://github.com/grown-platform/grown.git
cd grown

# install everything into the "grown" namespace
helm install grown deploy/helm/grown \
  -n grown --create-namespace \
  --set domain=grown.example.com

That's it โ€” Postgres, MinIO, Zitadel (with the OIDC app provisioned) and grown all come up. Watch it with kubectl -n grown get pods -w; grown is ready when /healthz returns 200. The default admin is printed in the install notes.

Common values

ValueDefaultWhat it does
domainโ€”Public hostname (required).
ingress.typeingressingress (plain), httproute (Gateway API), or none.
auth.modebundledbundled Zitadel, or external against your own OIDC issuer.
adminEmailsโ€”Comma-separated super-admin allowlist.
storageClasscluster defaultPVC storage class (e.g. local-path, longhorn).
postgres.externalDsnโ€”Use an external/managed Postgres instead of the bundled one.
minio.external.endpointโ€”Use an external S3 (rustfs/MinIO/cloud) instead of the bundled one.
image.tagpinnedgrown image tag.
bolo.enabledfalseRun the Bolo multiplayer sidecar.

See values.yaml for the full list, and the chart README for production guidance.

Sign-in note. grown authenticates through Zitadel via OIDC. For browser login to work, Zitadel must be reachable from the browser at the issuer URL โ€” in production expose Zitadel on its own hostname (or point auth.mode=external at an already-exposed issuer). The app, /healthz and the OIDC client provisioning all work regardless; this only affects the interactive login redirect.

Method 2 โ€” Raw manifests (kubectl apply)

No Helm? Apply the pre-rendered all-in-one manifest.

# edit the hostname/values in the file first, then:
kubectl create namespace grown
kubectl apply -n grown -f deploy/manifests/grown.yaml

deploy/manifests/grown.yaml is rendered from the same chart. To customise it, re-render with your own values:

helm template grown deploy/helm/grown -n grown \
  --set domain=grown.example.com > my-grown.yaml
kubectl apply -n grown -f my-grown.yaml

Method 3 โ€” Local machine with kind

Try the whole platform on your laptop in a throwaway cluster. Requires kind, kubectl and helm (Docker/Podman under the hood). This is the exact path the chart is smoke-tested on.

kind create cluster --name grown

helm install grown deploy/helm/grown \
  -n grown --create-namespace \
  --set domain=grown.local --set ingress.type=none

# wait for grown, then reach it via a port-forward
kubectl -n grown rollout status deploy/grown
kubectl -n grown port-forward svc/grown 8080:8080
# open http://localhost:8080/healthz  -> 200
On a single-node kind cluster everything lands on one node, so the bundled Zitadel + its provisioning job share storage fine. grown may restart a couple of times while Zitadel finishes booting, then settles automatically. Tear down with kind delete cluster --name grown.

Method 4 โ€” Raspberry Pi 5 (16 GB) cluster

Grown runs well on a small arm64 Pi 5 cluster โ€” the app itself is a lightweight Go binary. Recommended: 3โ€“4ร— Pi 5 (16 GB) with NVMe (the M.2 HAT), not SD cards.

helm install grown deploy/helm/grown \
  -n grown --create-namespace \
  --set domain=grown.example.com \
  --set storageClass=longhorn \
  --set image.tag=<arm64-tag>

A single 16 GB Pi 5 can host core grown for a household; a 3โ€“4 node cluster comfortably runs grown plus heavier add-ons (mail, photos) for a small team.

๐ŸŒฑ

Stuck, or want a deploy guide for your setup?

Hit a snag installing, or want docs for a specific platform (k3s, Talos, a managed cloud)? Open an issue and we'll get it grown ๐ŸŒฑ.

Open an issue