Installation
Synth is a licensed self-hosted application. Customer deployments run from the official Synth container image or the official Synth Helm chart.
Choose A Deployment Path
| Goal | Use |
|---|---|
| First single-VM proof of concept | Docker Compose POC kit |
| Repeatable team deployment | Kubernetes with the official Helm chart |
| Configuration-as-Code | Helm values plus CaSc |
| Direct image smoke test | Official Docker image with a persistent volume |
What You Receive
For a licensed evaluation or paid deployment, Synth provides:
- a signed Synth license key;
- access to the private Synth image registry;
- a registry pull key or equivalent pull credentials;
- a pinned official image reference or digest;
- for Kubernetes, the official private Helm chart and a starter values file;
- for Docker Compose POCs, a generated kit with
values.env,docker-compose.yml, and customer-facing runbooks.
Keep registry keys, provider keys, Git tokens, cookies, and license keys out of tickets, screenshots, transcripts, and support bundles.
Requirements
Docker Compose POC:
- Docker Engine with the Docker Compose plugin;
- an approved LLM provider key if this deployment will run model-assisted ingestion, linking, or lint;
- the signed Synth license included in
values.envor stored separately.
Kubernetes:
- Kubernetes 1.25 or newer;
kubectl;- Helm 3;
- persistent storage;
- HTTPS ingress for any shared or internet-facing install;
- Kubernetes Secrets for any provider keys, the license key, image pull credentials, and the browser session secret.
Docker Compose POC
Use this path for the fastest customer proof of concept on one VM:
tar -xzf synth-acme-poc-kit.tar.gz
cd synth-acme-poc-kit
cat secrets/gcp-artifact-registry-pull-key.json | docker login us-central1-docker.pkg.dev \
--username _json_key \
--password-stdin
${EDITOR:-vi} values.env
docker compose --env-file values.env config --quiet
docker compose --env-file values.env up -d
Open the SYNTH_PUBLIC_URL from values.env and create the first admin user in
the browser. The Compose POC stores product state in a named Docker volume and
persists the browser-session signing secret on first boot.
Stop the POC without deleting data:
docker compose --env-file values.env down
Direct Docker Image
When Synth provides an image reference directly, run it with a persistent volume and the same production environment variables used by Compose:
cat /secure/path/gcp-artifact-registry-pull-key.json | docker login us-central1-docker.pkg.dev \
--username _json_key \
--password-stdin
docker run --rm \
-p 8080:8000 \
-v synth-data:/var/lib/synth \
-e SYNTH_ENV=production \
-e SYNTH_PUBLIC_URL=http://127.0.0.1:8080 \
-e SYNTH_ALLOWED_HOSTS=127.0.0.1,localhost \
-e SYNTH_CORS_ORIGINS=http://127.0.0.1:8080 \
-e SYNTH_COOKIE_SECURE=0 \
-e SYNTH_LICENSE_KEY="$SYNTH_LICENSE_KEY" \
-e SYNTH_LICENSE_SERVER=https://license.synthkb.io \
-e OPENAI_API_KEY="$OPENAI_API_KEY" \
"$SYNTH_IMAGE"
Use Docker Compose for customer POCs unless your Synth contact specifically asks for a direct image smoke test.
Kubernetes With Helm
Use Kubernetes for team deployments and any install that should be repeatable.
The official chart runs one Synth app pod with a persistent volume mounted at
/var/lib/synth.
tar -xzf synth-acme-kubernetes-poc-kit.tar.gz
cd synth-acme-kubernetes-poc-kit
export SYNTH_NAMESPACE=synth
kubectl create namespace "$SYNTH_NAMESPACE" --dry-run=client -o yaml | kubectl apply -f -
cat secrets/gcp-artifact-registry-pull-key.json | helm registry login us-central1-docker.pkg.dev \
--username _json_key \
--password-stdin
kubectl -n "$SYNTH_NAMESPACE" create secret docker-registry synth-registry-pull \
--docker-server=us-central1-docker.pkg.dev \
--docker-username=_json_key \
--docker-password="$(cat secrets/gcp-artifact-registry-pull-key.json)" \
--dry-run=client -o yaml | kubectl apply -f -
kubectl -n "$SYNTH_NAMESPACE" create secret generic synth-runtime-secrets \
--from-literal=SYNTH_JWT_SECRET="$(openssl rand -hex 32)" \
--from-literal=OPENAI_API_KEY="$OPENAI_API_KEY" \
--dry-run=client -o yaml | kubectl apply -f -
kubectl -n "$SYNTH_NAMESPACE" create secret generic synth-license \
--from-file=license-key=/secure/path/synth-license-key.txt \
--dry-run=client -o yaml | kubectl apply -f -
helm upgrade --install synth \
oci://us-central1-docker.pkg.dev/project-96337d0a-4d88-427b-af7/synth/charts/synth \
--namespace "$SYNTH_NAMESPACE" \
-f values.k8s.yaml \
--wait \
--timeout 10m
For the full values file and CaSc examples, see Helm + CaSc.
Data And Upgrades
Synth stores product state under /var/lib/synth inside the container.
- Docker Compose stores that path in the
synth_customer_datanamed volume. - Kubernetes stores that path on the configured PVC.
- Do not delete the Docker volume or Kubernetes PVC unless you intentionally want to wipe the installation.
- Apply upgrades by replacing the image digest or chart version supplied by
Synth, then restarting Compose or running
helm upgrade.
Verify
Docker Compose:
set -a
. ./values.env
set +a
curl -fsS "$SYNTH_PUBLIC_URL/health"
curl -fsS "$SYNTH_PUBLIC_URL/health.version"
Kubernetes:
kubectl -n "$SYNTH_NAMESPACE" rollout status deploy/synth --timeout=10m
kubectl -n "$SYNTH_NAMESPACE" get deploy,svc,ingress,pvc
curl -fsS https://synth.example.com/health
After health checks pass, create the first admin user, create a Project, add knowledge, create a read-only agent key, and verify search plus an exact page read. Add or confirm a provider only when you also want an explicitly model-assisted ingestion, linking, or lint job.
Production Notes
- Put Synth behind HTTPS before exposing it outside a local POC.
- Set
SYNTH_PUBLIC_URLto the external origin so MCP and OAuth URLs are correct. - Keep provider keys and Git tokens in Docker/Kubernetes secrets, not in docs or source files.
- Use CaSc for repeatable global settings, project defaults, agents, and watchers.
- Create API keys with only the scopes each agent or automation needs.
Next: