{ auto_https off } # Main cell domain — no service-IP restriction needed http://pic0.dev, http://172.20.0.2:80 { handle /api/* { reverse_proxy cell-api:3000 } handle /calendar* { reverse_proxy cell-radicale:5232 } handle /files* { reverse_proxy cell-filegator:8080 } handle /webmail* { reverse_proxy cell-rainloop:8888 } handle { reverse_proxy cell-webui:80 } } # Per-service virtual IPs — each gets its own IP so iptables can target them http://calendar.dev, http://172.20.0.21:80 { reverse_proxy cell-radicale:5232 } http://files.dev, http://172.20.0.22:80 { reverse_proxy cell-filegator:8080 } http://mail.dev, http://webmail.dev, http://172.20.0.23:80 { reverse_proxy cell-rainloop:8888 } http://webdav.dev, http://172.20.0.24:80 { reverse_proxy cell-webdav:80 } http://api.dev { reverse_proxy cell-api:3000 } http://webui.dev { reverse_proxy cell-webui:80 } # Catch-all for direct IP / localhost :80 { handle /api/* { reverse_proxy cell-api:3000 } handle { reverse_proxy cell-webui:80 } }