Node CLI
The FrameWorks CLI provides commands for monitoring status, viewing logs, and managing the lifecycle of your edge services.
Status
Section titled “Status”frameworks edge status --dir /opt/frameworks-edgeShows:
- Health of the single
frameworks-edgecontainer in container mode, or systemd/launchd status in native mode - HTTPS health check against your configured domain
# All services, follow modeframeworks edge logs --follow --dir /opt/frameworks-edge
# Specific container (positional argument)frameworks edge logs helmsman --tail 100 --dir /opt/frameworks-edge
# Multiple optionsframeworks edge logs --follow --tail 50 --dir /opt/frameworks-edgeService names: mistserver, helmsman, caddy (the proxy service)
Updates
Section titled “Updates”Updating the CLI
Section titled “Updating the CLI”# Check for updatesframeworks update --check
# Update to the latest versionframeworks updateUpdating Edge Services
Section titled “Updating Edge Services”Update/restart the deployed edge services:
frameworks edge update --dir /opt/frameworks-edgeIn container mode this:
- Pulls a new edge image from the registry
- Recreates the
frameworks-edgecontainer - Preserves configuration, binaries, and data (named volumes; on Ansible-provisioned nodes hot storage is the
storage/directory next to the compose file)
In native mode, edge update restarts the native services. In both modes, day-to-day component convergence (Helmsman/MistServer/Caddy versions) is driven by the control plane’s release reconciler — edge update is the coarse image/service refresh, not the update mechanism.
Check current version:
frameworks versionCertificates
Section titled “Certificates”Check TLS status:
frameworks edge cert --dir /opt/frameworks-edgeShows certificate expiration and issuer. In token-provisioned edge deployments, Foghorn can push renewed TLS material through ConfigSeed and Helmsman reloads Caddy. If Caddy needs to reload local certificate state:
# Reload Caddy to pick up new certificatesframeworks edge cert --reload --dir /opt/frameworks-edgeOperational Mode
Section titled “Operational Mode”Use node mode when you want Foghorn to stop sending new traffic without fully stopping the services. This command talks to Helmsman’s local HTTP API: directly on native nodes, and by exec’ing into the frameworks-edge container on container nodes — no ports need to be exposed for it.
# Show current modeframeworks edge mode
# Stop new sessions and let existing work drainframeworks edge mode draining --reason maintenance
# Return to normal routingframeworks edge mode normalMode changes are requested through Helmsman and validated by Foghorn, which pushes the authoritative mode back through ConfigSeed.
Restarting Services
Section titled “Restarting Services”For container deployments:
cd /opt/frameworks-edge
# Restart the edge container (caddy/mistserver/helmsman run inside it)docker compose -f docker-compose.edge.yml restart edgeStopping the Node
Section titled “Stopping the Node”For container deployments, stop the stack:
docker compose -f docker-compose.edge.yml stopBring down the stack:
docker compose -f docker-compose.edge.yml downStart again:
docker compose -f docker-compose.edge.yml up -dDiagnostics
Section titled “Diagnostics”Full health check:
frameworks edge doctor --dir /opt/frameworks-edgeRuns:
- Host checks (ports, DNS, sysctls)
- Service status
- HTTPS reachability
- Remediation hints
Network diagnostics:
# Check connectivity to control planeframeworks context check
# Inspect Helmsman's gRPC connection to Foghorn (any dial errors land here)frameworks edge logs helmsman --tail 100Resource Usage
Section titled “Resource Usage”For container deployments (the single edge image), check what your node is using:
docker stats frameworks-edgeMistServer’s control interface binds loopback inside the container. On Linux (host networking) it is reachable from the host’s loopback; on macOS exec into the container:
# Linuxcurl http://localhost:4242/api/stats# macOSdocker exec frameworks-edge curl -s http://localhost:4242/api/statsHelmsman exposes Prometheus metrics when its local HTTP API is reachable:
curl http://localhost:18007/metricsConfiguration Changes
Section titled “Configuration Changes”Most config lives in .edge.env. After editing a container deployment:
cd /opt/frameworks-edge
# Apply changes by restartingdocker compose -f docker-compose.edge.yml restartChanges that require restart:
- Capability toggles
- Foghorn endpoints / enrollment token
- Storage configuration
Changes that take effect immediately:
- Most MistServer settings via its API
Backup and Recovery
Section titled “Backup and Recovery”What to backup (container mode): the whole project directory — it carries the node’s identity and secrets:
.edge.env- Configuration (node identity, domain, control-plane address).edge-enroll.env- Write-once enrollment token file.edge-secrets.env- MistServer API password (0600)pki/- Internal CA bundle for the Foghorn gRPC connectiontelemetry/- Telemetry token (when telemetry is enabled)docker-compose.edge.yml(ordocker-compose.ymlon Ansible-provisioned nodes)
The named volumes (frameworks_opt, frameworks_etc, caddy_etc,
caddy_data) hold binaries, certs, and the activated Caddyfile. You do not
need to back them up for identity: binaries reseed from the image and
converge via the release reconciler, and certs and stream config re-arrive
over ConfigSeed after the node reconnects.
Hot storage (DVR/clip artifacts) differs by setup: local edge init
renders use the edge_storage named volume, while Ansible-provisioned
nodes bind the storage/ directory next to the compose file (kept from the
earlier layout so migrated nodes retain their artifacts). Back it up — the
volume or the directory respectively — only if you must preserve local
DVR/clip artifacts across the move.
Recovery:
- Install Docker on the new host (container mode)
- Run
frameworks edge preflight - Restore the saved project directory (env files,
pki/,telemetry/, compose file) — do not re-runedge init, which would mint a new node identity and secrets - Start with
frameworks edge enroll --dir . - Certificates, stream config, and component versions converge from the control plane after enrollment
Common Tasks
Section titled “Common Tasks”Change node capacity
Section titled “Change node capacity”Edit .edge.env:
HELMSMAN_MAX_TRANSCODES=10Then restart the edge container:
docker compose -f docker-compose.edge.yml restart edgeDisable ingest temporarily
Section titled “Disable ingest temporarily”# Edit .edge.envHELMSMAN_CAP_INGEST=false
# Restartdocker compose -f docker-compose.edge.yml restart edgeFoghorn will stop routing new ingest to this node.
Check active streams
Section titled “Check active streams”curl http://localhost:4242/api/streamsOr via the dashboard under Nodes → [your node].
Clear hot storage
Section titled “Clear hot storage”Helmsman’s cleanup monitor and the control plane’s DVR reclaim already evict
by watermark; manual clearing is for emergencies. In container mode, hot
storage is mounted at /data/storage (the edge_storage named volume on
local edge init renders, the storage/ host directory on
Ansible-provisioned nodes):
# Check usagedocker exec frameworks-edge du -sh /data/storage
# Remove old artifacts (careful — bypasses Foghorn's segment accounting!)docker exec frameworks-edge find /data/storage -mtime +30 -deleteNative mode keeps hot storage at /var/lib/frameworks/edge-storage on the
host.
Automation
Section titled “Automation”For multiple nodes, consider:
- Ansible playbooks using the CLI commands
- Docker Swarm or Kubernetes (bring your own manifests)
- Custom scripts wrapping
frameworks edgecommands
Example health check script:
#!/bin/bashcd /opt/frameworks-edgeif ! docker compose -f docker-compose.edge.yml ps | grep -q "Up"; then echo "Containers not running, attempting restart" docker compose -f docker-compose.edge.yml up -dfi