Kubernetes with Helm
Rounds includes a first-party Helm chart in this repository at helm/rounds.
Basic install
helm upgrade --install rounds oci://ghcr.io/syntropize/charts/rounds \
--namespace observability \
--create-namespaceThis installs a private ClusterIP service, which is reachable from inside the cluster. For local evaluation, use kubectl port-forward; for shared access, configure Ingress or a load balancer.
Accessing Rounds
Local cluster / private ClusterIP
The default service type is ClusterIP. This is intentionally private to the cluster, so a local kind/minikube install needs a tunnel:
kubectl -n observability port-forward svc/rounds 3000:80Then open http://127.0.0.1:3000.
This is the same pattern many Helm charts use for quick local verification: install privately by default, then port-forward from your workstation. For shared access, use one of the options below instead.
LoadBalancer
Use this when your Kubernetes environment can provision external load balancers:
helm upgrade --install rounds oci://ghcr.io/syntropize/charts/rounds \
--namespace observability \
--create-namespace \
--set service.type=LoadBalancerWait for an external address:
kubectl -n observability get svc rounds --watchIngress
Use this when your cluster already has an Ingress controller such as nginx, Traefik, or a cloud provider ingress controller:
helm upgrade --install rounds oci://ghcr.io/syntropize/charts/rounds \
--namespace observability \
--create-namespace \
--set ingress.enabled=true \
--set ingress.className=nginx \
--set ingress.hosts[0].host=rounds.example.com \
--set env.CORS_ORIGINS=https://rounds.example.comPoint DNS for rounds.example.com at your Ingress controller.
Storage
The Helm chart can run with either local SQLite or external Postgres.
SQLite is the default for evaluation and small single-pod installs. The database file lives at /var/lib/syntropize/rounds.db inside the container and is stored on the chart's persistent volume claim when persistence.enabled=true. Do not run multiple Rounds replicas against the SQLite PVC.
For production Kubernetes and any multi-replica deployment, use Postgres. Set secretEnv.DATABASE_URL before the first Rounds pod starts:
helm install rounds oci://ghcr.io/syntropize/charts/rounds \
--namespace observability --create-namespace \
--set secretEnv.DATABASE_URL='postgresql://rounds:password@postgres.example.com:5432/rounds' \
--set env.DATABASE_SSL=trueWhen DATABASE_URL starts with postgres:// or postgresql://, Rounds uses Postgres for the full repository layer: auth, RBAC, settings, datasources, dashboards, investigations, alerts, notifications, chat, and feed data. Choose the backend at install time. The setup wizard stores application settings such as the LLM provider, but it cannot switch the database because the database must exist before the app can boot.
SQLite and Postgres are the supported backends today. The repository layer is abstracted so more SQL databases can be added later without changing the setup flow.
Common overrides
secretEnv.JWT_SECRET: explicit JWT secretsecretEnv.DATABASE_URL: Postgres connection string; enables the full Postgres repository backendsecretEnv.REDIS_URL: enable Redis-backed featurespersistence.enabled: keep local state on a PVCingress.enabled: expose the app through an Ingress controllerservice.type: set toLoadBalancerorNodePortwhen your cluster supports it
LLM credentials are configured in the web setup flow after first login.