Edge services

All production services run from one GHCR image with different SERVICE_MODE values:

ghcr.io/bbartling/openfdd-edge-rust:${OPENFDD_IMAGE_TAG:-nightly}

Service modes

Container SERVICE_MODE Role
openfdd-bridge bridge REST API, JWT auth, React dashboard, Modbus/JSON drivers, historian writes, DataFusion FDD, reports
openfdd-commission commission BACnet discover/poll/override scan (network_mode: host)
openfdd-haystack-gateway haystack-gateway Haystack read/nav/ops against a remote Haystack server
┌──────────────────────────────────────────────────────────────┐
│  openfdd-bridge (:8080)                                      │
│  REST · JWT · dashboard · historian · DataFusion · MCP APIs  │
└──────────────────────────────────────────────────────────────┘
         │ shared workspace volume
         ▼
┌─────────────────────────┐  ┌────────────────────────────────┐
│ openfdd-commission      │  │ openfdd-haystack-gateway       │
│ BACnet / Modbus poll    │  │ Haystack client (BAS / nHaystack) │
└─────────────────────────┘  └────────────────────────────────┘

Optional profiles

Profile Service Notes
caddy-http / caddy-tls Caddy reverse proxy TLS termination for LAN ingress
mcp-sidecar openfdd-mcp Optional stdio MCP for external agents (Codex, Cursor, OpenClaw, …)

MCP binary

The edge image bundles /usr/local/bin/openfdd-mcp. Run MCP without a sidecar:

docker run --rm -i \
  -v ~/open-fdd/workspace:/var/openfdd/workspace \
  --entrypoint openfdd-mcp \
  ghcr.io/bbartling/openfdd-edge-rust:latest

Workspace

All durable site state lives under workspace/ (bind-mounted). Never delete it.