Skip to content

Local kind quickstart

Bring the backplane up on your workstation in a kind cluster in a few minutes — to see the install plumbing work, poke /healthz, and iterate on values.

Placeholder authentication — meho login will not work here

This quickstart runs no real Keycloak and no real credential backend. The chart is pointed at placeholder URIs so its URI-validated fields resolve at install time; a throwaway in-cluster PostgreSQL is the only real dependency. The backplane boots, migrations run, health endpoints answer — but operator identity is faked: meho login will not complete end-to-end, and nothing credential-federated works. For a functional deploy, follow the install trail.

What this exercises (and what it cannot)

Works here Does not work here
Chart install / upgrade plumbing, values schema validation meho login, any authenticated CLI or API call
Pre-install migration Job against a real PostgreSQL Just-in-time credentials (no Vault / Google Secret Manager)
Startup contract: catalog registration, embedding model preload Agent (MCP) sessions — no tokens can be issued
/healthz, Pod lifecycle, probe behaviour /ready fully green — the identity checks have nothing real to check

Run it

# 1. A single-node kind cluster.
kind create cluster --name meho-dev

# 2. The mock prerequisites. values-kind.yaml documents them at the top
#    of the file: a copy-paste Namespace + Secret + Deployment + Service
#    manifest for a mock in-cluster PostgreSQL. Vault and Keycloak are
#    placeholder URIs only — nothing to deploy for them.
#    → https://github.com/evoila/meho/blob/main/deploy/values-examples/values-kind.yaml
#    One substitution when you paste it: use image pgvector/pgvector:pg16
#    (not postgres:16-alpine) — MEHO's migrations enable the pgvector
#    extension, which the stock alpine image does not ship.

# 3. Install the chart from its OCI artefact, pinning an immutable
#    image tag (a release tag, or sha-<git-sha> from a green CI run).
#    The overlay turns ingress off, so the chart has no hostname to
#    derive the /mcp audience from and refuses to render without one.
#    The placeholder below satisfies that guard; /mcp stays fail-closed.
helm install meho-dev oci://ghcr.io/evoila/meho-chart \
  --version <chart-version> \
  -n meho --create-namespace \
  -f https://raw.githubusercontent.com/evoila/meho/main/deploy/values-examples/values-kind.yaml \
  --set image.tag=<immutable-tag> \
  --set config.backplaneUrl=http://localhost:8000

# 4. Watch it come up and poke it.
kubectl wait --for=condition=Ready pod \
  -l app.kubernetes.io/name=meho -n meho --timeout=6m
kubectl port-forward -n meho svc/meho-dev 8000:8000 >/dev/null 2>&1 &
PF=$!
# Wait for the forward to bind rather than racing it.
for _ in $(seq 30); do
  curl -s -o /dev/null http://localhost:8000/healthz && break
  sleep 1
done
curl -fsS http://localhost:8000/healthz
kill "$PF"

The overlay disables ingress and NetworkPolicy (kind ships neither by default) and points the chart at the mock endpoints. The pgvector prerequisite from the install trail is satisfied differently here: the pgvector/pgvector:pg16 image ships the extension, and the mock's database user is a superuser, so the migration Job's CREATE EXTENSION succeeds on its own. If the migration Job instead fails with extension "vector" is not available, the mock is running a stock PostgreSQL image — swap it as noted in step 2.

When you outgrow it

The moment you want a real login, real credentials, or an agent session, you have outgrown the quickstart — go to the install trail. Nothing from the quickstart carries over; treat it as disposable (kind delete cluster --name meho-dev).