• fix(bridge): replicate push-uplink config so every spoke node ships its own metrics to the hub
    Release / version (push) Canceled after 0s
    Release / frontend (push) Canceled after 0s
    Release / linux (amd64) (push) Canceled after 0s
    Release / linux (arm64) (push) Canceled after 0s
    Release / windows (push) Canceled after 0s
    Release / macos (push) Canceled after 0s
    Release / release (push) Canceled after 0s
    Build and Push Docker Image / build-and-push (push) Canceled after 0s

    LastSkywalker released this 2026-06-21 09:14:43 +03:00 | 123 commits to main since this release

    Confirmed cause of peer metrics not reaching the hub: metrics ride the
    off-Raft per-node stream (the topology bridge, which is leader-only, no longer
    carries them), so each spoke node must POST its OWN metrics to the hub. But the
    uplink config (hub seeds + shared secret) was persisted only to the local .env
    of the node where it was configured (SaveBridge → cv → .env, not replicated),
    so a peer like orangepi5-plus had bridge_enabled=false and never uplinked —
    only the configured node's own + the leader's connector metrics reached the hub.

    Replicate the push-uplink config through cluster_config so the whole spoke
    converges:

    • Replicator.SubmitConfigSet(key,value) writes a key into the replicated
      cluster_config (CmdConfigSet).
    • The cluster-config reconciler now also handles the bridge: the node with a
      local push uplink seeds bridge_shared_secret / bridge_remote_seeds /
      bridge_mode into cluster_config (idempotent, only while unset); every node
      adopts it and rebuilds its metric-stream bridge, so each ships its own
      metrics to the hub. Scoped to push mode — receive (hub) / both (legacy) keep
      per-node config. The topology bridge sender stays leader-gated, so followers
      don't double-ship the log.

    CmdConfigSet carrying the secret never reaches the hub: in push mode the bridge
    ships only uplinkTypes (host/topology), and the secret is seeded only in push
    mode — so it stays inside the spoke (both-mode config-sync is unchanged).

    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
    Claude-Session: https://claude.ai/code/session_01U3LvJu9qZfspPr21TW9ptv

    Downloads