Goal
Stand up the target relay (Icecast-KH + Liquidsoap) on the Hetzner box in parallel with NMS, behind a flag. The /test mount is the server-side test instance (req #2). Phase 2 of #164.
Tasks
Acceptance
curl https://<host>/status-json.xsl returns mount stats over HTTPS; /live and /test each accept a source with their own credentials; NMS still serves production untouched.
Depends on
Phase-0 spike (#164) — peak-listener count + NMS version pin.
Parent: #164 (Phase 2).
Goal
Stand up the target relay (Icecast-KH + Liquidsoap) on the Hetzner box in parallel with NMS, behind a flag. The
/testmount is the server-side test instance (req #2). Phase 2 of #164.Tasks
fallback(track_sensitive=false, [live, playlist, single])so dead air auto-fills. Applyblank.stripto the live branch ONLY; do NOT pairblank.stripwithmksafeon the same source (liquidsoap #3439/#3474) — make the whole fallback safe by ending the list with asingle./live(production) and/test(broadcaster-only preview), each with separate source credentials. This replaces the hardcodedstream-iokey and gives per-namespace auth.http://mount is blocked as mixed content. Terminate HTTPS at nginx/Caddy in front of Icecast. (Mandatory, not optional.)Acceptance
curl https://<host>/status-json.xslreturns mount stats over HTTPS;/liveand/testeach accept a source with their own credentials; NMS still serves production untouched.Depends on
Phase-0 spike (#164) — peak-listener count + NMS version pin.
Parent: #164 (Phase 2).