Show a full mini-loop:
- Start local demo sequence.
- Publish KPI/decision history via HTTP API.
- Expose the API on a customer-facing DNS hostname through Cloudflare Tunnel.
- .NET SDK installed (
dotnet --version) - Optional Kubernetes context if showing cluster objects
- Cloudflare account with zone for your hostname
cloudflaredinstalled and authenticated
scripts/demo/run-demo-sequence.shExpected:
- Console shows whirl state transitions.
- Decision artifacts are appended to
code-two/run/logs/decision-log.jsonl.
In a second terminal:
scripts/demo/run-demo-api.shValidate locally:
curl -s http://127.0.0.1:8787/api/status
curl -s "http://127.0.0.1:8787/api/decisions?limit=5"Authenticate once (interactive browser flow):
cloudflared tunnel loginCreate tunnel config and DNS CNAME route:
scripts/cloudflare/setup-tunnel.sh bunnyhop-demo bunnyhop.work http://127.0.0.1:8787Expected:
- Tunnel exists in Cloudflare.
- DNS route for
bunnyhop.workexists. - Config file created at
~/.cloudflared/config-bunnyhop-demo.yml.
In a third terminal:
scripts/cloudflare/run-tunnel.sh bunnyhop-demoThen verify publicly:
curl -s https://bunnyhop.work/api/statusInstall monitoring stack:
scripts/demo/setup-monitoring.shRun demo API (for decision metrics scrape):
scripts/demo/run-demo-api.shOpen Grafana, Prometheus, and Kubernetes Dashboard:
scripts/demo/open-monitoring.shExpected:
- Grafana opens on
http://127.0.0.1:31000(admin/bunnyhop). - Dashboard
bunnyhop aiops overviewshows:- workload CPU trend
- anomaly window
- mitigation decision confidence
kubectl config current-context
kubectl get nodes
kubectl get pods -n aiopscloudflared tunnel createfails:- Re-run
cloudflared tunnel loginand ensure you selected the correct zone.
- Re-run
- Public hostname returns 404:
- Confirm
scripts/cloudflare/run-tunnel.shis still running. - Confirm ingress host in
~/.cloudflared/config-<tunnel-name>.ymlmatches DNS hostname.
- Confirm
- API has no data:
- Run
scripts/demo/run-demo-sequence.shfirst, then call/api/statusagain.
- Run