Caddy Reverse Proxy

Routes external traffic to internal services. The homelab runs two Caddy instances:

Instance Location Purpose
CT118 (workhorse/gpu01) caddy LXC on workhorse External reverse proxy — asslorde.com subdomains
CT124 (workhorse/gpu01) openclaw (this host) Hermes WebUI — /wiki/*, /division/*, /mai-pets*

CT124 Routes (openclaw — verified from live Caddyfile)

Path Target
/ Hermes WebUI (127.0.0.1:8787)
/division/* Division HQ SSE map server (127.0.0.1:8766) + static file server
/wiki/* Hyraxknot Division docmd static site (/root/workspace/wiki-site/dist)
/mai-pets* Mai’s Supply Closet Critters (static)

CT118 Routes (from hosts.yml backup, May 29 — NOT in current inventory)

⚠️ Out of date: The caddy_routes section was dropped from hosts.yml during the June 3 inventory sweep. The list below is from the May 29 backup and needs re-verification against CT118’s actual Caddyfile.

Domain Target Internal Notes
maplestory.asslorde.com 192.168.0.157:8484 No MapleStory v83 login
runescrape.asslorde.com 192.168.0.175:8888 No 2004scape rs-engine
sisters.asslorde.com 192.168.0.175:8899 No Sister competition dashboard
buns.asslorde.com 192.168.0.157:8080 No BunsMS web client
dev.buns.asslorde.com 192.168.0.157:8081 No BunsMS WASM dev
pelican.asslorde.com 192.168.0.73:8082 No Pelican Panel
gamer.asslorde.com 192.168.0.64:8081 No
gaming.asslorde.com 192.168.0.66:8082 No
gunz.asslorde.com 192.168.0.108:9990 No
rathena.asslorde.com 192.168.0.132 No
grafana.asslorde.com 192.168.0.95:3000 Yes
openwebui.asslorde.com 192.168.0.115:8080 Yes
sillytavern.asslorde.com 192.168.0.114:8000 Yes
ollama.asslorde.com 192.168.0.17:11434 Yes
status.asslorde.com 192.168.0.150:3001 Yes
romm.asslorde.com 192.168.0.177 Yes
pdm.asslorde.com 192.168.0.163 Yes
affine.asslorde.com 192.168.0.32:3010 Yes
acore.asslorde.com 192.168.0.69:8069 Yes
workflow.asslorde.com 192.168.0.110:5678 Yes n8n
resume.lab.asslorde.com 192.168.0.234:5173 Yes
qwentts.asslorde.com 192.168.0.17:8881 Yes Qwen3 TTS
kokorotts.asslorde.com 192.168.0.17:8880 Yes Kokoro TTS
parakeet.asslorde.com 192.168.0.17:5092 Yes Parakeet STT
nx.asslorde.com R2 NX assets proxy No Cloudflare R2

Critical Pitfall

Caddy routes and CT IPs in hosts.yml are independent values. When DHCP drift changes a CT’s IP, both must be updated separately:

  1. Update ip: field under the CT’s hosts: entry in hosts.yml
  2. Update caddy_routes target IPs (separate section!)
  3. Run python3 scripts/generate.py on admin01 to regenerate Caddyfile
  4. Deploy to CT118

Known issue: The caddy_routes section was lost during the Phase 2 inventory sweep (June 3). The generate.py script and ansible/playbooks/onboard.yml both reference caddy_routes — without it, no Caddyfile is generated for CT118.

Manual Deployment Fallback

scp generated-caddyfile admin01:/tmp/
pct push 118 /tmp/generated-caddyfile /etc/caddy/Caddyfile
pct exec 118 -- caddy validate --config /etc/caddy/Caddyfile
pct exec 118 -- caddy reload --config /etc/caddy/Caddyfile