Caddy Reverse Proxy
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_routessection was dropped fromhosts.ymlduring 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:
- Update
ip:field under the CT’shosts:entry inhosts.yml - Update
caddy_routestarget IPs (separate section!) - Run
python3 scripts/generate.pyon admin01 to regenerate Caddyfile - 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