Migrating from Rotom OG
RotomNG is the Go rewrite of the original Node.js Rotom ("Rotom OG"). Devices and Dragonite talk to it exactly as before — same websocket protocol, same default ports — so the migration is mostly about the config file. The HTTP API and the Prometheus metrics changed too, which matters if you built tooling or dashboards against them.
The full, field by field guide lives in the repo: RotomNG-Vs-OG.md (opens in a new tab).
Steps
-
Stop Rotom OG.
-
Install RotomNG. See Docker Setup or Standard Setup.
-
Convert your old config. The repo ships a conversion script that reads your old
config/local.jsonand writes the new TOML file:python3 configs/rotom-og-to-ng.py /path/to/Rotom/config/local.json configs/rotom-ng.tomlReview the result against the configuration reference.
-
Copy your job files (if you used jobs) into the
jobsdirectory and setjobs.enable = true. -
Start RotomNG and reconnect your devices.
Dragonite needs no changes. Its [rotom] section still points at the controller listener
(ws://HOST:7071) and the secret key still maps to controller_listener.secret.
Configuration
The config format changed from JSON (config/local.json) to TOML (configs/rotom-ng.toml).
Some highlights:
| Rotom OG | RotomNG |
|---|---|
deviceListener.port | device_listener.address (":7070") |
controllerListener.port | controller_listener.address (":7071") |
client.port / client.host | http_listener.address (":7072") |
| (n/a) | http_listener.secret — optional API authentication |
| (n/a) | prometheus.enable — metrics are now opt-in |
HTTP API
- Authentication — OG had none. NG supports an optional
X-Rotom-Secretheader on all/apiendpoints, configured withhttp_listener.secret. - Methods — device actions and job execution moved from
POSTtoPUT. - Metrics —
GET /metricsmoved toGET /api/metricsand must be enabled withprometheus.enable = true. - Field names — all JSON fields are now
snake_case(OG usedcamelCase), andGET /api/statusnests workers under their device. - Removed —
GET /api/getPublicIp(public IP is now on the device object) andPOST /api/ptcLogin. - Jobs —
GET /api/job/listbecameGET /api/job, job execution becamePUT /api/job/:jobId/runwith device IDs in the JSON body, andGET /api/job/statusbecameGET /api/job-instance.
The complete endpoint list is in RotomNG-API.md (opens in a new tab).
Prometheus metrics
All metrics moved to the rotom_ng namespace (configurable via prometheus.namespace), and
the Node.js runtime metrics (nodejs_*, process_*) were replaced by Go runtime metrics
(rotom_ng_go_*, rotom_ng_process_*). Renamed metrics:
| Rotom OG | RotomNG |
|---|---|
rotom_devices_alive | rotom_ng_devices_connected (adds an origin label) |
rotom_devices_total | rotom_ng_devices_total (adds an origin label) |
rotom_workers_total | rotom_ng_workers_connected |
rotom_workers_active | rotom_ng_workers_in_use |
rotom_device_memory_free | rotom_ng_device_memory_free |
rotom_device_memory_mitm | rotom_ng_device_memory_mitm |
rotom_device_memory_start | rotom_ng_device_memory_start |
NG also adds counters and histograms for device commands, registrations, connection accepts, worker requests/responses, controllers, RPCs and app lifecycle events. Existing Grafana dashboards built for Rotom OG will need their queries updated.
Web UI
OG had two pages (Status and Jobs). NG splits things up and adds detail:
| Page | Route | Notes |
|---|---|---|
| Status | / | Aggregated controller, device and worker metrics |
| Devices | /devices | New dedicated page, expandable rows, enable/disable toggles |
| Controllers | /controllers | New — controller monitoring, reconnect/disconnect |
| Workers | /workers | New — per-worker stats and request rates |
| Jobs | /jobs | Reload from disk, start/finish timestamps, clear instances |
Destructive actions (reboot, restart, disconnect) now ask for confirmation, and devices can be disabled so they are skipped for selection without disconnecting them.