Run it your way
One command for a single machine, a manifest set for a cluster, or a tarball for a site with no path to a registry — all three from the same images.
Customers get the deployment bundle from the licensing portal's Downloads page, not by cloning this repository — an air-gapped tarball with every image embedded, or a lighter compose bundle that pulls its images from the registry using the credentials in your licence e-mail. Extract it and, optionally, set a hostname and TLS mode in .env — the default is localhost with a self-signed certificate. With the air-gapped tarball:
tar -xzf dsh-stack-0.1.0-airgap.tar.gz && cd dsh-stack-0.1.0-airgap
for t in images/*.tar; do docker load -i "$t"; done
docker compose up -d --wait
docker compose logs control-plane | grep -A6 'FIRST-BOOT ADMIN'The whole stack self-hosts with one command; an air-gap bundle ships every image.
One operator CLI covers status, backup, upgrade and restore. The backup includes the key-encryption key, so guard the archive like a credential:
./dsh-stack status
./dsh-stack backup # includes the KEK — guard the archive like a key
./dsh-stack upgrade 0.2.0
./dsh-stack restore <archive>The same images deploy from a manifest set — a namespace, a secret and an apply:
export KUBECONFIG=~/.kube/dsh-k3s.yaml
kubectl create ns advisor
kubectl -n advisor create secret generic advisor-secrets \
--from-literal=secret_key="$(openssl rand -hex 32)" \
--from-literal=kek.b64="$(openssl rand -base64 32)" \
--from-literal=db_password="$(openssl rand -hex 32)" \
--from-literal=gateway_token="$(openssl rand -hex 32)" \
--from-literal=admin_password="$(openssl rand -base64 24 | tr -d '/+=' | cut -c1-20)"
kubectl -n advisor apply -f deploy/k3s/advisor/
kubectl -n advisor rollout status deploy/advisorA self-hosted deployment brings its own model the same way a hosted one does.
Bring your own model — OpenAI-compatible endpoints, Ollama, Anthropic, or Cloudflare AI Gateway / Workers AI — with keys envelope-encrypted at rest.
The public URLs the control plane hands to agents, and the ones it uses for the identity-provider callback, are changed from the console's Settings page — not by redeploying.
A guided enrollment wizard, and a site view that shows exactly where data is allowed to cross the boundary, are part of the hosted control plane rather than of a self-hosted install.
Run it your way
Request a demo