-
POST /api/v1/register(local endpoint on Status Panel) — Triggered after install.sh completes- Accept
{ purchase_token, stack_id }from install script - Collect server fingerprint (hostname, IP, OS, CPU, RAM, disk)
- Call Stacker Server:
POST /api/v1/agents/register { purchase_token, server_fingerprint, stack_id } - Store returned
agent_id,deployment_hash,dashboard_urllocally - Begin heartbeat loop to Stacker Server
- Accept
- Local
stacker deploytrigger — After registration, Status Panel invokes Stacker CLI locallystacker deploy --from /opt/stacker/stacks/{stack_id}/(the downloaded archive)- Monitor deploy progress, report status back to Stacker Server via existing agent report endpoint
- No Install Service involved — fully local execution
- Provide web UI page at
http://localhost:{STATUS_PORT}/linkto connect Status Panel to TryDirect dashboard - Support unlinking from dashboard (agent continues to work standalone)
- Login-based linking flow (Entry Point C):
- User logs in with TryDirect email + password from Status Panel UI
- Status Panel calls Stacker:
POST /api/v1/agent/login { email, password }→ returnssession_token+ user's deployments - User selects a deployment from the list → Status Panel calls Stacker:
POST /api/v1/agent/link { session_token, deployment_id, server_fingerprint, capabilities } - Stacker validates session, checks user owns the deployment, issues
agent_id+agent_token - No purchase_token needed — user's identity is the trust anchor
purchase_tokenflow retained only for headless Entry Point B (curl one-liner)
- Add "Use Standalone" option for users without TryDirect account (skip linking entirely)
- "Deploy a Stack" page in Status Panel web UI
- Browse available stacks from marketplace API:
GET /api/v1/marketplace/stacks - User selects stack → Status Panel downloads archive + calls
stacker deploylocally - This enables Entry Point C: user installs Status Panel first, then deploys stacks from its UI
- Browse available stacks from marketplace API:
- Forward marketplace notifications (stack published, update available) from Stacker Server to Status Panel UI
- Show "Update Available" badge when a newer version of the deployed stack exists
Align build and runtime images so the compiled✅ Done — Dockerfiles usestatusbinary links against the same glibc version (or older) as production.clux/muslrust:stable→gcr.io/distroless/cc, musl avoids glibc drift.Add a musl-based build target and image variant to provide a statically linked binary that avoids glibc drift.✅ Done — CI buildsx86_64-unknown-linux-musltarget, releases musl binary.- Update CI to build/test using the production base image to prevent future GLIBC_x.y.z mismatches.
- Add a simple container start-up check that surfaces linker/runtime errors early in the pipeline.
- [status-auth-refresh] Refresh agent auth immediately on 401/403 and retry polling/report calls with backoff.
- Wire the retry path into the polling loop instead of waiting for the periodic refresh task.
- Define the Vault path/role contract for
status_panel_tokenand document failure handling.
- [status-alerting] Add outbound alert delivery for unhealthy containers, command failures, and host-level incidents.
- Webhook delivery with env-configured thresholds (
ALERT_WEBHOOK_URL, CPU/memory/disk thresholds). - Includes alert deduplication, severity escalation, and recovery notifications.
- Webhook delivery with env-configured thresholds (
- [status-command-provenance] Surface which control plane executed each action (
status_panelvscompose_agent).- Expose provenance in command reports, health metrics, and
/capabilities-driven diagnostics. - Publish and implement the separate token/cache schema for
compose_agent_token.
- Expose provenance in command reports, health metrics, and
- [status-ssl-renewal] Automate SSL certificate renewal for hosts that enable HTTPS.
- Add renewal scheduling, renewal result logging, and certificate reload without manual intervention.
- [status-volume-backups] Add scheduled backup and restore support for Docker volumes.
- Support policy-driven backups for stateful services, retention, restore validation, and signed metadata.
- Reuse existing backup/security primitives where possible instead of introducing a separate backup path.
- [status-login-linking] Complete the login-based dashboard linking flow and standalone mode.
- Finish the UI + daemon wiring for email/password linking to an owned deployment.
- Add "Use Standalone" so the panel is usable without a TryDirect account.
- [status-deploy-stack-ui] Build the local "Deploy a Stack" flow in Status Panel.
- Browse marketplace stacks, download the selected archive, and trigger local
stacker deploy. - Show deployment progress, update availability, and compatibility checks in the local UI.
- Browse marketplace stacks, download the selected archive, and trigger local
- Coordinate
status-deploy-stack-uiwith Stacker marketplace archive/download validation. - Coordinate
status-command-provenanceand future pipe execution with the Stacker control-plane roadmap.
Key principle: Agent polls Stacker; Stacker never pushes to the agent. Agent is responsible for adding HMAC headers on its outbound calls.
- Implement command handlers (
health,logs,restart) that execute locally when commands are dequeued. - Health: return container state, status enum (
ok|unhealthy|unknown), last heartbeat, optional CPU/mem metrics; fail closed if container unreachable. - Logs: support cursor + limit, streams stdout/stderr, redact secrets before returning, mark
truncatedflag. - Restart: restart container by app_code, then emit updated state in report payload; include errors array on failure.
- Reporting: call Stacker
POST /api/v1/agent/commands/reportwith HMAC headers (X-Agent-Id,X-Timestamp,X-Request-Id,X-Agent-Signature) signed using Vault token. - Wire agent to poll loop:
GET /api/v1/agent/commands/wait/{deployment_hash}with HMAC headers. - On 401/403, refresh token from Vault and retry with backoff (TokenProvider with Vault → env fallback, 10s cooldown).
- Ensure agent generates HMAC signature for every outbound request (wait + report + app status); no secrets expected from Stacker side.
- Ship a separate
compose-agentcontainer (Docker Compose + MCP Gateway) deployed alongside the Status Panel container; Service file should ensure it mounts the Docker socket while Status Panel does not. - Implement watchdog to restart only the compose container on failure/glibc mismatch without touching the Status Panel daemon; prove via integration test.
- Expose health metrics indicating which control plane executed each command (
status_panelvscompose_agent) so ops can track rollout and fallbacks. - Publish Vault secret schema:
secret/agent/{hash}/status_panel_tokenandsecret/agent/{hash}/compose_agent_token; refresh + cache them independently. - Add config flag to disable compose agent (legacy mode) and emit warning log so Blog receives
compose_agent=falsevia/capabilities.
Context: The Status Panel Agent now supports runtime field (runc/kata) on deploy_app and deploy_with_configs commands, detects Kata availability via docker info, injects runtime: per-service into compose YAML, and reports "kata" in /capabilities features when available.
- Add
runtimefield (string, optional, default"runc") toPOST /api/v1/agent/commands/enqueuepayload fordeploy_appanddeploy_with_configscommands. - Add
runtimefield to the deployment model/database so per-deployment runtime preference is persisted across redeploys and restarts. - Validate
runtimevalues on the Stacker side (runc,kata); reject unknown values with 422. - Read agent
/capabilitiesresponse and storekatafeature flag per agent; use this to prevent scheduling Kata deployments on agents that don't support it.
- Add
--runtime kata|runcflag tostacker deployCLI command; pass through to the agent command payload. - Show runtime selection option in the deployment UI (dropdown or toggle); default to
runc, showkataonly if agent capabilities include it. - Display effective runtime in deployment detail view (agent reports
"runtime"in deploy result body). - Show
kata_fallbackwarnings from agent result in the UI/CLI output so users know when Kata was unavailable.
- Allow per-deployment runtime preference in Vault (
secret/agent/{hash}/runtime_preference); agent can read this as a default when no explicitruntimeis in the command payload. - Support org-level policy: "all deployments must use Kata" — Stacker enforces this before enqueuing commands.
- Update compose J2 templates to optionally include
runtime:field per-service when Kata is requested (alternative to agent-side YAML injection for new deployments). - Document that
runtime:in compose YAML andruntimein command payload are complementary — agent-side injection is the fallback when templates don't include it.
- Create Ansible playbook for Kata setup: install
kata-containers, configuredaemon.jsonwith Kata runtime, validate KVM access. - Add Terraform module for provisioning Kata-ready bare-metal hosts (Hetzner, OVH) with KVM enabled.
- Document network constraints: Kata containers cannot use
network_mode: host; advisebridgeormacvlan.
- Add Prometheus metric
agent_deploy_runtime{runtime="kata|runc"}counter to track Kata adoption. - Log
kata_fallbackevents in agent audit trail for ops visibility. - Add dashboard widget showing Kata vs runc deployment distribution across fleet.