Caddy Routing

Single config: /etc/caddy/Caddyfile. Every app is bound to 127.0.0.1 and
Caddy is the only public listener (:80, :443, admin :2019).

Domain → upstream map

Domain / path Upstream Container App
sportstlm.com, www 127.0.0.1:9000 sportstlm Main hub
sportstlm.com/livenba/* 127.0.0.1:8126 livenba NBA in-run
sportstlm.com/liveinrun2/* 127.0.0.1:9000 sportstlm (sidecar) in-run hub
sportstlm.com/ops/* 127.0.0.1:9600 opsd Ops dashboard (basic auth)
sportstlm.com/pz/api/predictz/ingest* 127.0.0.1:9600 opsd Predictz ingest (key-gated)
lottery.sportstlm.com 127.0.0.1:4422 lottery Lottery
racing.sportstlm.com 127.0.0.1:4433 racing Horse racing
ufc.sportstlm.com 127.0.0.1:8080 ufc UFC
snooker.sportstlm.com 127.0.0.1:8091 snooker Snooker
nba.sportstlm.com 127.0.0.1:8092 nba NBA
tennis.sportstlm.com 127.0.0.1:8093 tennis Tennis
nfl.sportstlm.com 127.0.0.1:8094 nfl NFL
nhl.sportstlm.com 127.0.0.1:8095 nhl NHL
mlb.sportstlm.com 127.0.0.1:8096 mlb MLB
badminton.sportstlm.com 127.0.0.1:8097 badminton Badminton

livenba is served under the main domain (/livenba/), not its own subdomain.
inlive2 has a Dockerfile/container but no Caddy route — it is Exited (see VPS/Containers).

Shared hardening (every site block)

Each site applies the same guards before proxying:

Special routes

Logs

Change discipline