Opinionated, batteries-included Docker Compose stack to build your Unified Namespace with UMH Core. One command and you're running.
Community starter kit. For production deployments, enterprise support, and professional services, contact the UMH team directly.
Official docs and configuration reference: docs.umh.app
git clone https://github.com/SheetMetalConnect/UMH-Core-Stack.git
cd UMH-Core-Stack
cp .env.example .env
# Edit .env — paste your AUTH_TOKEN from https://management.umh.app
docker compose up -d
docker compose ps| Service | Port | Purpose |
|---|---|---|
| UMH Core | (internal) | Industrial data hub with embedded Redpanda |
| TimescaleDB | 5432 | Time-series database (PostgreSQL 17) |
| Grafana | 3000 | Dashboards and visualization |
| HiveMQ CE | 1883 | Local MQTT broker |
| Node-RED | 1880 | Flow-based data integration |
| Portainer | 9000 | Container management UI |
| NGINX | 80/443 | Reverse proxy |
Default credentials are admin / changeme (Grafana) and postgres / changeme (TimescaleDB). Change these before production use.
Data does not persist to TimescaleDB automatically. You need a DataFlow:
- Open Management Console -> your instance -> Data Flows -> Stand-alone
- Click Add, paste the contents of
examples/databridges/flows/historian.yaml - Deploy
See data flowing end-to-end with the MetalFab UNS Simulator:
docker compose -f docker-compose.yaml -f examples/simulator/docker-compose.simulator.yaml up -dSimulator -> HiveMQ -> UMH Core -> historian -> TimescaleDB -> Grafana.
.
├── docker-compose.yaml # Full stack definition
├── .env.example # Environment template (start here)
├── nginx.conf # Reverse proxy config
├── configs/
│ ├── nodered/settings.js # Node-RED settings
│ ├── grafana/provisioning/ # Datasources + starter dashboards
│ └── timescaledb-init/ # Historian schema (runs on first boot)
├── examples/
│ ├── databridges/flows/ # DataFlow templates (historian, ERP, bridges)
│ ├── databridges/sql/ # ERP schema extensions
│ ├── simulator/ # MetalFab simulator overlay
│ ├── historian/ # Reference historian overlay
│ └── mcp/ # Standalone MCP server overlay
└── docs/
├── operations.md # Quick start and common commands
├── networking.md # Network architecture, ports, DNS
├── data-modeling.md # _raw vs data contracts, topic structure
├── historian.md # TimescaleDB setup, backup, sizing
├── integration-patterns.md # ERP integration patterns
└── troubleshooting.md # Common issues and fixes
Ready-to-use Benthos dataflows in examples/databridges/flows/:
| Template | Purpose |
|---|---|
historian.yaml |
_raw topics -> TimescaleDB |
mqtt_bridge.yaml |
External MQTT broker -> UNS |
opcua_bridge.yaml |
OPC-UA server -> UNS |
tasmota_bridge.yaml |
Tasmota IoT devices -> UNS |
erp_process.yaml |
ERP entity deduplication |
erp_to_timescale.yaml |
ERP persistence (UPSERT + history) |
See examples/databridges/README.md for the full list and usage instructions.
- Replace all
changemepasswords (grep -r "changeme" . --include="*.yaml" --include="*.example" --include="*.sh") - Set
AUTH_TOKENfrom Management Console - Configure TLS (place certs in
./certs, uncomment HTTPS block innginx.conf) - Restrict NGINX CORS headers (currently allows
*) - Set up database backups
- Tune
TS_TUNE_MEMORYandTS_TUNE_NUM_CPUSfor your hardware
| Guide | What it covers |
|---|---|
| Operations | Quick start, common commands, updating |
| Networking | Network architecture, ports, DNS, security |
| Data Modeling | _raw vs data contracts, topic structure |
| Historian | TimescaleDB schema, sizing, backup |
| Integration Patterns | ERP integration patterns |
| Troubleshooting | Common issues and quick fixes |
- UMH Documentation -- official guides and config reference
- Management Console -- cloud management for UMH instances
- UMH Core Repository -- open-source platform
- Benthos/Redpanda Connect -- dataflow processor docs
Contributions welcome. Before submitting:
- Test with a fresh
.envfrom.env.example - Verify:
docker compose up -d && docker compose ps - Validate:
docker compose config
This is a community deployment template supporting the UMH mission of making industrial data accessible. It does not modify or redistribute UMH source code.
All trademarks remain property of their respective owners.
Built by Van Enkhuizen Systems
