Skip to content
DocumentationAPI ReferenceChangelog
Self-hostedTalon Studio v1.0.2-beta

Deployment Options

Talon Studio is software you run yourself: one container image and one /data volume, on a host you own, a rented VM, or a Kubernetes cluster. Every route ends in the same appliance.

Where it can run

Talon Studio ships as one appliance image. The product is identical wherever it runs — the routes below differ only in what you already have.

Docker Compose
On a Linux host you own: one compose file, one .env, one volume. The reference path — see Install.
A rented cloud VM
Paste a published cloud-init bootstrap into any VPS provider; it installs Docker, a firewall, Caddy for TLS and the appliance. See Cloud Hosting.
Terraform
Four published stacks: a VM on AWS or Azure (the same bootstrap), or EKS / AKS with managed Postgres and the Helm chart.
Kubernetes
The talon-studio Helm chart, version 0.3.7 — see below.
A managed container platform
Any platform that keeps one container running from the image and attaches a persistent disk at /data.
There is no hosted edition
Talon Labs does not run Talon Studio for anyone, and holds none of your detections, log samples or SIEM credentials. Every route on this page ends in your own appliance, in your own account.

Which one is right?

You have a Linux host — Docker Compose. It is the simplest thing that works, and everything else in these docs assumes it.
You have no hardware — a small cloud VM with the bootstrap. A 2 vCPU / 4 GB VM is enough, and costs a few euros a month at the cheaper providers.
Your policy says workloads run in a cluster — the Helm chart, or the Terraform Kubernetes stacks. For one appliance a cluster buys node repair and little else, at several times the cost.
You are air-gapped — any of the above. A Community key verifies offline; move the image across with docker save, and turn off the content sync and update check. Offline and air-gapped has the steps.
Nothing forks
Every route runs the identical image, so detections, Git history and the API are the same on all of them. Moving between them is moving the /data volume — plus the encryption key, if you set it yourself rather than letting the appliance generate it onto the volume.

What every option needs

A process that stays running. Content sync and the other background loops run inside the app between requests. A platform that freezes or scales the process to zero between requests — a serverless or function runtime — does not work.
A disk that survives a restart, mounted at /data. Without it every restart starts from an empty database and loses the detection repos with it. 20 GB is a comfortable start.
One instance per volume. No replicas: migrations take no lock.
TLS in front. The container serves plain HTTP on port 3000; terminate TLS at a proxy, load balancer or the platform's router.
Your Community key, from your Talon Labs account. The appliance shows only the key screen until it has one.

Kubernetes and Helm

The chart is served from a plain HTTPS Helm repository on this site — an index and a tarball, with no registry login. It is an advanced route: for a single appliance the Docker path is still the recommended one.

terminal
helm repo add talon https://www.talonlabs.dev/charts
helm repo update
helm install talon talon/talon-studio --version 0.3.7 \
--set config.nextauthUrl=https://talon.example.com \
--set secrets.licenseKey="$TALON_STUDIO_KEY" # your Community key
# ingress is off by default; reach it with a port-forward
kubectl port-forward svc/talon-talon-studio 3000:3000
# the first admin (talon / admin@talon.local) and its generated password
kubectl exec deploy/talon-talon-studio -- cat /data/secrets/initial-admin.txt
image.tag
Empty by default, which resolves to the chart's appVersion with a v prefix — v1.0.2-beta for chart 0.3.7. Set a tag, or image.digest, to pin a different release.
secrets.licenseKey
Your talstu_… Community key, applied at boot, so the pod comes up past the key screen. Left empty, the first admin pastes it after signing in. It lands in the chart's Secret as TALON_LICENSE_KEY.
config.licenseApiUrl
Where an Enterprise key activates and checks in: https://www.talonlabs.dev/api/license. A Community key never calls it. Empty means no licence call is ever made.
secrets.*
Left empty, each secret and the first-admin password is generated on first boot into /data/secrets. secrets.existingSecret names a Secret you manage instead.
persistence.data
A 20Gi ReadWriteOnce claim by default. Keep it: with an emptyDir the generated secrets and the embedded database are recreated on every pod start.
postgres.external
Set true with postgres.externalUrl (or a POSTGRES_URL key in your Secret) to use a managed database.
replicaCount
1. The chart refuses to render more, and deploys with the Recreate strategy so the old pod stops before the new one starts.
networkPolicy.enabled
Off by default. On, it allows ingress on the app port and egress to DNS, HTTPS and Postgres only.