Skip to content

Installation

Quick start (60 seconds)

=== "Kubernetes / Helm (OCI)"

```bash
helm install ruptura oci://ghcr.io/benfradjselim/charts/ruptura \
  --namespace ruptura-system \
  --create-namespace \
  --set apiKey=$(openssl rand -hex 32) \
  --set ui.enabled=true \
  --set ui.service.type=NodePort \
  --set ui.nodePort=31469 \
  --set service.type=NodePort \
  --set otlpNodePort=31470
```

Verify:

```bash
kubectl get pods -n ruptura-system
# NAME                             READY   STATUS    RESTARTS   AGE
# ruptura-engine-xxx               1/1     Running   0          30s
# ruptura-ui-xxx                   1/1     Running   0          30s

curl http://<node-ip>:31468/api/v2/health
# {"status":"ok","version":"7.1.0",...}
```

| Endpoint | URL |
|----------|-----|
| Dashboard | `http://<node-ip>:31469/` |
| Engine API | `http://<node-ip>:31468/api/v2/health` |
| OTLP ingest | `http://<node-ip>:31470/api/v2/write` |

=== "Docker"

```bash
docker run -d --name ruptura \
  -p 8080:8080 -p 4317:4317 \
  -v ruptura-data:/var/lib/ruptura/data \
  -e RUPTURA_API_KEY=$(openssl rand -hex 32) \
  ghcr.io/benfradjselim/ruptura:v7.1.0
curl http://localhost:8080/api/v2/health
```

!!! warning "API key required"
As of v7.1.0, `RUPTURA_API_KEY` is required in production. The server will reject all API calls with 503 if no key is set. The `helm install` command above sets it automatically via `--set apiKey`.

!!! note "Dashboard in Docker" In Docker mode, deploy the UI container separately or use kubectl port-forward for the full dashboard experience. The engine API is available at port 8080.

=== "ruptura-ctl (CLI)"

```bash
curl -Lo ruptura-ctl \
  https://github.com/benfradjselim/ruptura/releases/latest/download/ruptura-ctl-linux-amd64
chmod +x ruptura-ctl && sudo mv ruptura-ctl /usr/local/bin/
export RUPTURA_URL=http://<node-ip>:31468
export RUPTURA_API_KEY=<your-api-key>
ruptura-ctl status
```

ruptura-ctl

ruptura-ctl v1.0.0 is the command-line interface for Ruptura. It connects to the Ruptura REST API from your workstation, a CI pipeline, or from inside the cluster.

Install

=== "Linux amd64"

```bash
curl -Lo ruptura-ctl \
  https://github.com/benfradjselim/ruptura/releases/latest/download/ruptura-ctl-linux-amd64
chmod +x ruptura-ctl && sudo mv ruptura-ctl /usr/local/bin/
ruptura-ctl version
# ruptura-ctl v1.2.0
```

=== "Linux arm64"

```bash
curl -Lo ruptura-ctl \
  https://github.com/benfradjselim/ruptura/releases/latest/download/ruptura-ctl-linux-arm64
chmod +x ruptura-ctl && sudo mv ruptura-ctl /usr/local/bin/
```

=== "macOS (Apple Silicon)"

```bash
curl -Lo ruptura-ctl \
  https://github.com/benfradjselim/ruptura/releases/latest/download/ruptura-ctl-darwin-arm64
chmod +x ruptura-ctl && sudo mv ruptura-ctl /usr/local/bin/
```

=== "macOS (Intel)"

```bash
curl -Lo ruptura-ctl \
  https://github.com/benfradjselim/ruptura/releases/latest/download/ruptura-ctl-darwin-amd64
chmod +x ruptura-ctl && sudo mv ruptura-ctl /usr/local/bin/
```

=== "Go install"

```bash
go install github.com/benfradjselim/ruptura/cmd/ruptura-ctl@latest
```

=== "Build from source"

```bash
git clone https://github.com/benfradjselim/ruptura.git
cd ruptura/workdir
go build -o ruptura-ctl ./cmd/ruptura-ctl
sudo mv ruptura-ctl /usr/local/bin/
```

Configure

export RUPTURA_URL=http://<node-ip>:31468    # engine NodePort
export RUPTURA_API_KEY=<your-api-key>

ruptura-ctl version          # ruptura-ctl v1.2.0
ruptura-ctl health           # server version, uptime, ingest stats
ruptura-ctl status           # live workload health table
ruptura-ctl get workloads    # all workloads with KPI breakdown

Install as a kubectl plugin:

sudo cp ruptura-ctl /usr/local/bin/kubectl-ruptura
kubectl ruptura status

Kubernetes (Helm)

helm install ruptura oci://ghcr.io/benfradjselim/charts/ruptura \
  --namespace ruptura-system \
  --create-namespace \
  --set apiKey=$(openssl rand -hex 32) \
  --set ui.enabled=true \
  --set ui.service.type=NodePort \
  --set ui.nodePort=31469 \
  --set service.type=NodePort \
  --set otlpNodePort=31470 \
  --set resources.limits.memory=512Mi \
  --set persistence.size=10Gi

Common options

Flag Default Description
--set apiKey=<key> required API bearer token
--set ui.enabled=true false Deploy the Svelte dashboard pod
--set ui.service.type=NodePort ClusterIP Expose dashboard via NodePort
--set ui.nodePort=31469 auto NodePort for the dashboard
--set service.type=NodePort ClusterIP Expose engine API via NodePort
--set otlpNodePort=31470 31470 NodePort for OTLP ingest
--set resources.limits.memory=512Mi 512Mi Engine memory limit
--set-string goMemLimit="400MiB" "400MiB" Go GC soft limit — ~85% of memory limit
--set persistence.size=10Gi 10Gi PVC size for BadgerDB storage
--set image.tag=v7.1.0 latest Pin to specific version
--set serviceMonitor.enabled=true false Prometheus Operator scrape
--set edition=autopilot community Enable Tier-1 auto-execution

Upgrade

helm upgrade ruptura oci://ghcr.io/benfradjselim/charts/ruptura \
  --namespace ruptura-system \
  --reuse-values \
  --set image.tag=v7.1.0

Verify

kubectl get pods -n ruptura-system
kubectl logs -n ruptura-system -l app.kubernetes.io/name=ruptura --tail=20

curl http://<node-ip>:31468/api/v2/health
# {"status":"ok","version":"7.1.0","edition":"community",...}

Kubernetes (Operator / CRD)

If you have the Ruptura Operator installed (via OLM or manually):

apiVersion: ruptura.io/v1alpha1
kind: RupturaInstance
metadata:
  name: ruptura
  namespace: ruptura-system
spec:
  edition: community        # community | autopilot
  storageSize: 10Gi
  apiKeyRef: ruptura-secret # Secret with key 'api-key'
kubectl apply -f ruptura-instance.yaml
kubectl get rupturainstance -n ruptura-system -w

See Operator → for full CRD reference and OLM setup.


Docker

docker run -d --name ruptura \
  -p 8080:8080 \
  -p 4317:4317 \
  -v ruptura-data:/var/lib/ruptura/data \
  -e RUPTURA_API_KEY=$(openssl rand -hex 32) \
  ghcr.io/benfradjselim/ruptura:v7.1.0
Port Purpose
8080 REST API · Prometheus self-metrics
4317 OTLP ingest — metrics, logs, traces (JSON over HTTP)

Build from source

git clone https://github.com/benfradjselim/ruptura.git
cd ruptura/workdir
go build -o ruptura ./cmd/ruptura
./ruptura --port=8080 --otlp-port=4317 \
          --api-key=$(openssl rand -hex 32) \
          --storage=/tmp/ruptura-data

Run tests:

go test -race -timeout=120s ./...

Build the UI:

cd ruptura/ui
npm install
npm run build
# Output: ui/dist/  (served by the ruptura-ui container)

Sending telemetry

Prometheus remote_write

The host label must equal the workload key (namespace/Kind/name) so the pipeline can index correctly:

# prometheus.yml
remote_write:
  - url: http://<node-ip>:31470/api/v2/write
    authorization:
      credentials: <your-api-key>

Or send JSON directly:

curl -X POST http://<node-ip>:31470/api/v2/write \
  -H "Content-Type: application/json" \
  -d '{
    "timeseries": [{
      "Labels": [
        {"Name": "__name__",   "Value": "cpu_percent"},
        {"Name": "host",       "Value": "default/Deployment/my-app"},
        {"Name": "namespace",  "Value": "default"},
        {"Name": "deployment", "Value": "my-app"}
      ],
      "Samples": [{"Value": 72.5, "Timestamp": 1234567890000}]
    }]
  }'

OTLP / OpenTelemetry Collector

# otel-collector.yaml — exporters section
exporters:
  otlphttp/ruptura:
    endpoint: http://<node-ip>:31470
    encoding: json          # Ruptura accepts JSON only — no protobuf
    compression: none       # no gzip
    headers:
      Authorization: "Bearer <your-api-key>"

Ruptura reads k8s.namespace.name, k8s.deployment.name, etc. from OTLP resource attributes and groups signals by Kubernetes workload automatically.

!!! important "OTLP format constraints" Ruptura's OTLP endpoint accepts JSON only (no protobuf) and no compression (no gzip).

Workload simulator

Inject synthetic workloads with distinct failure profiles to test the system immediately:

python3 scripts/simulate.py [--host HOST] [--port PORT] [--interval SEC]
# Default target: http://<YOUR_NODE_IP>:31470

# Workloads injected every 5s:
#   gateway        — stable/healthy (CPU ~22%, err ~0.3%)
#   order-service  — slow-burn CPU stress (45→90% over 10 min)
#   payment-api    — error bursts every 2 min (8→43% error rate)
#   cache-worker   — traffic spikes every 3 min (up to 1350 rps)
#   ml-inference   — noisy/calibrating (high variance, new workload)

See Operations → Simulation → for full simulator documentation.


Direct curl (raw OTLP JSON)

# Send a log
curl -X POST http://<node-ip>:31470/otlp/v1/logs \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <api-key>" \
  -d '{
    "resourceLogs": [{
      "resource": {"attributes": [
        {"key": "service.name", "value": {"stringValue": "my-service"}},
        {"key": "k8s.namespace.name", "value": {"stringValue": "production"}},
        {"key": "k8s.deployment.name", "value": {"stringValue": "my-service"}}
      ]},
      "scopeLogs": [{"logRecords": [{
        "timeUnixNano": "1715780000000000000",
        "severityNumber": 17,
        "severityText": "ERROR",
        "body": {"stringValue": "payment timeout after 5000ms"}
      }]}]
    }]
  }'