Docker Compose stack for UMH Core with batteries-included configuration.
Official UMH: UMH Core (latest), TimescaleDB 2.24.0-pg17, Grafana 12.3.0 Addons: HiveMQ CE (MQTT), Node-RED, Portainer, NGINX
| Service | Port | Internal DNS |
|---|---|---|
| UMH Core | (internal) | umh:8080 |
| Grafana | 3000 | grafana:3000 |
| TimescaleDB | 5432 | timescaledb:5432 |
| HiveMQ MQTT | 1883 | hivemq:1883 |
| Node-RED | 1880 | nodered:1880 |
| Portainer | 9000 | portainer:9000 |
| NGINX | 80/443 | nginx:80 |
Database: umh | Schema in configs/timescaledb-init/
| Table | Type | Purpose |
|---|---|---|
asset |
table | Equipment metadata (ISA-95 hierarchy) |
tag |
hypertable | Numeric time-series (compressed after 7 days) |
tag_string |
hypertable | Text time-series |
Users: postgres (superuser), kafkatopostgresqlv2 (writer), grafanareader (read-only)
Data Contracts:
_raw-- No validation, simple key-value (default)_<model>_<version>-- Typed/validated (e.g.,_energy-monitor_v1)
Topic structure: umh.v1.<enterprise>.<site>.<area>.<line>.<workcell>.<origin_id>.<contract>.<tag>
Configuration:
dataFlow:-- Standalone processing pipelinesprotocolConverter:-- Template-based bridges with{{ .Variables }}- Use
uns:input/output (notkafka:)
max_in_flight: 20for database flows (matches PgBouncer pool),64for historian- Always add
?sslmode=disableto PostgreSQL DSN strings in Docker ${DB_DSN}env var for database connections in dataflows- Never commit
.env(contains AUTH_TOKEN and credentials)
Required in .env: AUTH_TOKEN, POSTGRES_PASSWORD, HISTORIAN_WRITER_PASSWORD, HISTORIAN_READER_PASSWORD, GF_ADMIN_PASSWORD