Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 78 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,78 @@
# installers
# ControlTheory Installers

Public install scripts for deploying the **ControlTheory agent** into your own
**Kubernetes** cluster or **Docker** host, so runtime telemetry flows into
[Dstl8](https://dstl8.ai).

> Served at **[install.controltheory.com](https://install.controltheory.com)** — this is the code behind the `curl … | bash` command Dstl8 gives you when you add a Kubernetes or Docker source.

## What is Dstl8?

**Dstl8** is continuous runtime feedback for developers. It distills, detects,
correlates, and explains problems across your full deployment chain —
Kubernetes, Docker, AWS, Vercel, Supabase, Railway, OpenTelemetry, and more —
so you stay out of debug rabbit holes. Powered by Möbius agents, an MCP server,
and the Dstl8 CLI, that context streams back into Claude Code, Cursor, and the
rest of your dev flow.

- Website — **[dstl8.ai](https://dstl8.ai)** · [controltheory.com](https://www.controltheory.com)
- Documentation — **[docs.controltheory.com](https://docs.controltheory.com/controltheory-documentation/dstl8-docs)**
- Dstl8 CLI — **[github.com/control-theory/dstl8](https://github.com/control-theory/dstl8)**

## Getting started

New to Dstl8? Start here — you don't need this repo to begin.

1. **Sign up** and grab the Dstl8 CLI:
```bash
brew install control-theory/dstl8/dstl8
dstl8 signup
```
2. **Add a source** so logs start flowing. The CLI wizard covers Kubernetes,
CloudWatch, Vercel, Supabase, OTLP, GitHub, and more:
```bash
dstl8 sources add kubernetes
```
3. **Connect your AI agent** over MCP:
```bash
dstl8 install claude-code
```

Full walkthrough in the [Dstl8 CLI repo](https://github.com/control-theory/dstl8)
and the [docs](https://docs.controltheory.com/controltheory-documentation/dstl8-docs).

## When to use these scripts

Some environments run an in-cluster/on-host agent to collect logs and events
directly from the source. That's what this repo installs:

| Platform | What it deploys |
|----------|-----------------|
| **Kubernetes** | Helm charts for the aigent DaemonSet (node log collection) and cluster agent (Kubernetes events) |
| **Docker** | The `controltheory/aigent` container, wired to the Docker socket and host logs |

The installer is driven by tokens and endpoints that Dstl8 generates for you.
The easiest path is to **add a Kubernetes or Docker source in the
[Dstl8 app](https://dstl8.ai)** — it hands you the exact `curl … | bash`
command, pre-filled, to paste into your terminal. See the
[installation docs](https://docs.controltheory.com/controltheory-documentation/dstl8-docs)
for details.


## Contributing

These scripts are published from this repo via GitHub Pages. Changes are tested
on `stage` and released through `main` — see [CONTRIBUTING.md](CONTRIBUTING.md)
for the branching and release workflow.

## Community & support

- 💬 [Discord](https://discord.gg/nRBUFYByta)
- 🐛 [Issues](https://github.com/control-theory/dstl8/issues)

## License

The installer scripts in this repository are MIT licensed. The ControlTheory
agent and Dstl8 binaries themselves are proprietary, owned by ControlTheory,
Inc., and governed by the
[ControlTheory Terms of Service](https://www.controltheory.com/terms-of-service/).
20 changes: 16 additions & 4 deletions scripts/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ set -e

# ControlTheory Agent Installation Script
# Version
VERSION="v1.4.5"
VERSION="v1.4.6"
# Supports both Docker and Kubernetes (Helm) installations
#
# Usage:
Expand All @@ -23,7 +23,7 @@ ORG_API_ENDPOINT=""
DATA_ENDPOINT=""
DATA_TLS=""
DOCKER_IMAGE="controltheory/aigent"
DOCKER_IMAGE_TAG="v1.3.33"
DOCKER_IMAGE_TAG="v1.3.35"

# Defaults
OPERATION="install"
Expand Down Expand Up @@ -434,6 +434,16 @@ quick_preflight_check() {
fi
}

ensure_namespace() {
# Helm 4's --create-namespace is a no-op on `upgrade --install` (it does not
# create the release namespace), so create it explicitly with kubectl.
# Idempotent: ignore if it already exists.
if $KUBECTL get namespace "$NAMESPACE" >/dev/null 2>&1; then
return 0
fi
$KUBECTL create namespace "$NAMESPACE"
}

k8s_install_ds() {
quick_preflight_check

Expand Down Expand Up @@ -470,7 +480,7 @@ k8s_install_ds() {
fi

run_step "AIgent DaemonSet" "$(printf '%-16s— node log collection' "$RELEASE_NAME_DS")" \
$HELM upgrade --install --create-namespace "$RELEASE_NAME_DS" "$AIGENT_DS_CHART" "${HELM_ARGS[@]}"
$HELM upgrade --install "$RELEASE_NAME_DS" "$AIGENT_DS_CHART" "${HELM_ARGS[@]}"
}

k8s_install_cluster() {
Expand Down Expand Up @@ -503,7 +513,7 @@ k8s_install_cluster() {
fi

run_step "Cluster Agent" "$(printf '%-16s— k8s events' "$RELEASE_NAME_CLUSTER")" \
$HELM upgrade --install --create-namespace "$RELEASE_NAME_CLUSTER" "$AIGENT_CLUSTER_CHART" "${HELM_ARGS[@]}"
$HELM upgrade --install "$RELEASE_NAME_CLUSTER" "$AIGENT_CLUSTER_CHART" "${HELM_ARGS[@]}"
}

k8s_uninstall_ds() {
Expand Down Expand Up @@ -569,6 +579,8 @@ k8s_install() {
run_step "Helm repo" "ct-helm (updated)" helm_repo_setup
fi

run_step "Namespace" "$(printf '%-16s— created if absent' "$NAMESPACE")" ensure_namespace

case "$TYPE" in
ds)
k8s_install_ds
Expand Down
Loading