Skip to content

20260816 - Add retina-telemetry to the node stack - #30

Merged
Purple10101 merged 1 commit into
mainfrom
20260816-add-retina-telemetry
Aug 17, 2026
Merged

20260816 - Add retina-telemetry to the node stack#30
Purple10101 merged 1 commit into
mainfrom
20260816-add-retina-telemetry

Conversation

@Purple10101

Copy link
Copy Markdown
Collaborator

The node-side telemetry uplink, pinned like every other image via ${TELEMETRY_V:-v0.1.0}. One container per node, owning everything sent to api.retina.fm: registration, detection streaming, heartbeat and config sync.

Three things differ from every other service here

No depends_on. Everything else waits on config-merger. This one must keep reporting while the rest of the stack is crash-looping — that is the entire point of it — so gating it would leave it dead exactly when its telemetry matters most. It re-reads its inputs each cycle, so config appearing later needs no restart and no ordering constraint.

No docker socket. blah2 and ADS-B liveness are derived from the detection poll, which distinguishes down from wedged where container state cannot. Versions come from the image-tag env vars.

network_mode: host, to reach blah2_api on 127.0.0.1:3000. It binds no listening ports; every input is a poll or a file read, and there is no inbound path to it at all.

Mounts

Of four, only /data/retina-telemetry is writable — bearer token at 0600, status document at 0644, under /data so the token survives an OS update. Losing it means re-registering, which needs an operator to reactivate the node, because the server answers every registration refusal with the same opaque 403.

DISK_PATH=/data/mender rather than the default /data, which is not mounted here — only its subdirectories are. Without it statvfs measures the container's own overlay and reports a plausible, wrong disk_free_mb.

Requires retina-gui >= v0.7.0

The first version that persists the three consent records. Without them this service refuses to register — deliberately: a missing record means the owner was never shown that text, and nothing is ever synthesised. offworldlabs/owl-os#51 moves that pin.

Verified

  • docker compose config valid against real docker on a node; ${TELEMETRY_V:-v0.1.0} resolves to v0.1.0
  • This exact block ran on two nodes against production on 2026-08-15 — ret824685c9 and ret3773656d both registered, streamed, and held config version 1

Not tagged

Deliberate. This lands ahead of cutting a release; tagging is a separate decision.

🤖 Generated with Claude Code

The node-side telemetry uplink, pinned like every other image via
${TELEMETRY_V:-v0.1.0}. One container per node, owning everything sent to
api.retina.fm: registration, detection streaming, heartbeat and config sync.

Three things about this service differ from the rest of the file, and all three
are deliberate.

No depends_on. Every other service waits on config-merger. This one must keep
reporting while the rest of the stack is crash-looping — that is the entire
point of it — so gating it would leave it dead exactly when its telemetry
matters most. It re-reads its inputs on every cycle, so configuration that
appears later is picked up with no restart and no ordering constraint.

No docker socket. blah2 and ADS-B liveness are derived from the detection poll
instead, which distinguishes "down" from "wedged" where container state cannot,
and the versions in the heartbeat come from the image-tag env vars passed here.

network_mode: host, to reach blah2_api on 127.0.0.1:3000. It binds no listening
ports of its own; every input is a poll or a file read, and there is no inbound
path to it at all.

Of its four mounts only /data/retina-telemetry is writable. It holds the bearer
token at 0600 and the status document at 0644, and lives under /data so the
token survives an OS update — losing it means re-registering, which needs an
operator to reactivate the node, because the server answers every registration
refusal with the same opaque 403.

DISK_PATH is set to /data/mender rather than left at its default of /data,
which is not mounted here — only its subdirectories are. Without it statvfs
would measure the container's own overlay and report a plausible, wrong
disk_free_mb.

Requires retina-gui >= v0.7.0, the first version that persists the three
consent records. Without them the service refuses to register, deliberately and
by design: a missing record means the owner was never shown that text, and
nothing is ever synthesised. owl-os#51 moves that pin.

Not tagged — this lands ahead of cutting a release.
@Purple10101
Purple10101 merged commit fcc5f94 into main Aug 17, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant