Kubernetes (Helm)

Deploy Syntho on Kubernetes using Helm charts.

chevron-rightWhat Helm deployshashtag

This deployment typically includes:

  • Frontend (UI)

  • Backend

  • Core API

  • Ray (separate chart)

  • PostgreSQL (metadata, optional if you use an external DB)

  • Redis (optional if you use an external Redis)

chevron-rightRay sizing and storage (optional)hashtag

Ray capacity depends on your data size and throughput goals. If you didn’t get sizing guidance yet, ask Syntho Support.

Also ensure your cluster can provision shared (RWX) storage for Ray workers when the chart enables shared volumes.

If your StorageClass does not support ReadWriteMany, Ray pods can fail to schedule or start.

OpenShift / CRI-O note: some clusters default to low process limits. Ray can hit those limits when scaling.

Deploy

1

Prerequisites

Make sure you meet the prerequisites before deploying.

2

Get the Helm charts

Use the deployment-tools repository:

If you prefer release artifacts, use the deployment-tools releases matching the version that you are deploying:

  • https://github.com/syntho-ai/deployment-tools/releases

Download:

  • ray-helm-chart.tar.gz

  • syntho-ui-helm-chart.tar.gz

3

Create a namespace

kubectl create namespace syntho
4

Create an ImagePullSecret

kubectl create secret docker-registry syntho-cr-secret \
  --namespace syntho \
  --docker-server=<REGISTRY_HOST> \
  --docker-username=<USERNAME> \
  --docker-password=<PASSWORD>

In both charts, reference it:

imagePullSecrets:
  - name: syntho-cr-secret
circle-info

If image pulls fail later, rotate the secret. Registry credentials can expire.

5

Deploy Ray

Ray provides distributed execution for heavy jobs.

Minimal settings in your Ray values file (commonly helm/ray/values.yaml):

Use a specific <version-number> for production. Avoid latest unless Syntho tells you to.

SynthoLicense: <license-key>

kuberay-operator:
  imagePullSecrets:
    - name: syntho-cr-secret

ray-operator:
  imagePullSecrets:
    - name: syntho-cr-secret

ray-cluster:
  imagePullSecrets:
    - name: syntho-cr-secret
  image:
    tag: <version-number>

Deploy:

helm upgrade --install ray-cluster ./helm/ray/chart \
  --values helm/ray/values.yaml \
  --namespace syntho
circle-info

If your bundle uses a different values filename or path, use that path in --values.

circle-info

The Ray head service is typically ray-cluster-ray-head. Use it as ray_address in the Syntho chart.

chevron-rightRay troubleshooting (ArgoCD, permissions)hashtag

If Ray pods fail due to volume permissions, set a permissive security context:

6

Deploy Syntho

Edit your syntho-ui values file (commonly helm/syntho-ui/values.yaml).

circle-info

Production recommendation: use a hosted / managed PostgreSQL.

See Back up PostgreSQL.

Set images

Set image repositories and tags to the versions provided by Syntho.

Use a specific <version-number> for production. Avoid latest unless Syntho tells you to.

frontend:
  image:
    repository: synthoregistry.azurecr.io/syntho-core-frontend
    tag: <version-number>

backend:
  image:
    repository: synthoregistry.azurecr.io/syntho-core-backend
    tag: <version-number>

core:
  image:
    repository: synthoregistry.azurecr.io/syntho-core-api
    tag: <version-number>

Set license key

Set the license key in the Syntho chart values:

SynthoLicense: <license-key>

Use the same license key value as in helm/ray/values.yaml.

chevron-rightExample valueshashtag

Create an external PostgreSQL host and two databases (common setup):

  • Backend metadata DB

  • Core API metadata DB

Then configure the Syntho Helm values to use them and disable the embedded databases.

Common values:

Configure Redis

By default, the chart deploys Redis and exposes it as redis-svc.

If you use an external Redis, update these values:

backend:
  redis:
    host: redis-svc
    port: 6379
    db: 0

core:
  redis:
    host: redis-svc
    port: 6379
    db: 1
chevron-rightUsing the chart-managed PostgreSQL/Redis (optional)hashtag

Keep the embedded dependencies enabled if you don’t run external services.

Disable embedded PostgreSQL by setting database_enabled: false (as shown above).

Minimal example:

If you keep embedded PostgreSQL enabled, the in-cluster service is typically:

  • Host: database

  • Port: 5432

Frontend URL and Ingress:

frontend_url: <hostname>
frontend_protocol: https # or http

ingress:
  enabled: true
  className: nginx
  hosts:
    - host: <hostname>
      paths:
        - path: /
          pathType: Prefix

The Ingress also routes backend traffic using path-based routing (typically GET /api/*).

You don’t need a separate Ingress for the backend.

chevron-rightIngress annotations and TLS (nginx + cert-manager example)hashtag

Admin user:

backend:
  user:
    username: admin
    email: [email protected]
    password: <password>

Backend secret key:

backend:
  secret_key: <random-string>

Core API encryption key:

python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
core:
  secret_key: <fernet-key>

Ray address:

ray_address: ray-cluster-ray-head
chevron-rightUse externally managed Kubernetes Secrets (optional)hashtag

By default, the chart creates backend-secret and core-secret from your Helm values.

If you want to bring your own Secrets (for example via an external secrets manager), set:

  • backend.manualSecretName: <your-secret-name>

  • core.manualSecretName: <your-secret-name>

Create the Secrets in the same namespace.

Backend Secret must include:

Core Secret must include:

Deploy:

helm upgrade --install syntho-ui ./helm/syntho-ui \
  --values helm/syntho-ui/values.yaml \
  --namespace syntho
circle-info

If your bundle uses a different values filename or path, use that path in --values.

chevron-rightHTTPS and cookieshashtag

If TLS is terminated at a reverse proxy / load balancer / Ingress, Syntho must be configured for https.

If Syntho is configured for http, browsers can reject cookies.

Symptoms include login loops or sessions not sticking.

Fix:

  • Set the frontend protocol to https.

  • Disable secure cookies.

7

Verify deployment

Check pods:

kubectl get pods -n syntho

Open the UI at your frontend_url.

If pods are not Ready, check logs:

kubectl logs -n syntho <pod-name>
circle-info

If the UI doesn’t resolve, check DNS and the Ingress external address first.

If this does not work, see Troubleshooting.

8

Back up PostgreSQL

Back up PostgreSQL Syntho application databases before first use to validate the process.

Next steps

Last updated

Was this helpful?