Skip to content

[HARDENING] Satellite pipeline release-day resilience — fletcher probe depth, cold-start race, backoff tuning #1165

Description

@accius

Post-release tracking issue from the v26.6.0 deploy (2026-08-27). Prod is serving 25/40 satellites: all amateur birds resolved (AMSAT/SatNOGS fallbacks), but the 15 CelesTrak-only weather sats (GOES/METEOR/ELEKTRO/HIMAWARI/METOP/NOAA + SO-125) stay unresolved an hour after boot.

Diagnostics so far (all verified live)

  1. Health lies green: /api/health reports fletcher ok because health.js probes the service's /health — which is fine — while the actual TLE fetches through it fail. Health should probably probe a relay path, not just liveness.
  2. Env-name gap (fixed): health.js accepted FLETCHER_URL || TLE_FETCHER_URL but routing config read only the new name. Fixed in hotfix: honor legacy TLE_FETCHER_URL in fletcher routing #1164 (on main + Staging). Not today's trigger, but real.
  3. Co-deploy cold-start race: a push to main redeploys openhamclock-production AND fletcher simultaneously. Prod's satellite state machine starts fetching ~5 min after boot against a cold fletcher whose first relayed requests exceed prod's 20s timeout → httpStatusCode 0 → skipped, and retry spacing is long.
  4. Fletcher is slow even warm: 6–9s per relayed CelesTrak request via fletcher-production.up.railway.app, vs <1s hitting celestrak.org directly from a residential connection (HTTP 200, 30,167 bytes, 73 sats — upstream is healthy). Cold requests exceed 20s. Suspects: undici IPv6-first dialing on Railway egress (try pinning autoSelectFamily/family 4 in fletcher's fetch), or CelesTrak slow-walking fletcher's shared cloud egress IP.
  5. Warm-cache priming of fletcher's 10-min cache with the exact weather-group payload did NOT lead prod to recover within 30 min — so either the state machine's weather-group retry cadence is longer than that after early failures, or requests are failing for a reason not visible externally.

Next steps

  • Prod Railway logs for [Satellites] lines (needs Railway access): which state, what status codes, whether blockCelesTrakUntil engaged
  • Fletcher logs for inbound/upstream latency split
  • Consider: family-pinned fetch in fletcher, shorter warm-up (self-probe on boot), health probe through a relay path, faster weather-group retry after status-0
  • Verify weather sats return after the 120-min CelesTrak backoff window would expire (~2h post-boot) even with no changes

Filed as wrap-up so the diagnostic chain isn't lost; prod is degraded (weather sats only), amateur satellite tracking unaffected.

73, K0CJH

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    Status
    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions