Stack services

Open-FDD runs as a small set of GHCR images composed per recipe. See Build recipes for which images each recipe pulls.

ghcr.io/bbartling/openfdd-central:${OPENFDD_IMAGE_TAG:-nightly}
ghcr.io/bbartling/openfdd-web
ghcr.io/bbartling/openfdd-fieldbus:${OPENFDD_IMAGE_TAG:-nightly}
ghcr.io/bbartling/openfdd-mqtt:${OPENFDD_IMAGE_TAG:-nightly}
ghcr.io/bbartling/openfdd-mcp:${OPENFDD_IMAGE_TAG:-nightly}

Containers

Container Image Role
central openfdd-central REST API (:8080), JWT auth, historian, DataFusion FDD engine, reports, MCP API surface
ui openfdd-web React vibe19 lab (:3000); talks to central REST for SQL FDD
fieldbus openfdd-fieldbus BACnet/IP poll (network_mode: host), publishes over MQTTS
mqtt openfdd-mqtt Mosquitto broker, MQTTS on :8883
mcp openfdd-mcp Slim Rust MCP server for external agents
┌──────────────────────┐        ┌──────────────────────────────┐
│ ui (React :3000) │───────▶│ central (:8080)              │
└──────────────────────┘  REST  │ JWT · historian · SQL FDD    │
                                 └──────────────────────────────┘
                                          ▲ MQTTS (8883)
                                          │
              ┌───────────────────────────┴───────────────┐
              │ mqtt (Mosquitto)                            │
              └───────────────────────────▲─────────────────┘
                                          │ MQTTS haystack kv
                                 ┌────────┴─────────┐
                                 │ fieldbus (BACnet)│
                                 └──────────────────┘

MCP server

openfdd-mcp is a slim Rust image that talks to central over OPENFDD_API_BASE (default http://central:8080):

docker run --rm -i \
  -e OPENFDD_API_BASE=http://central:8080 \
  ghcr.io/bbartling/openfdd-mcp:latest

See MCP & agents.

Workspace

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