Reverse proxy — overview
calit listens on plain HTTP on port 8080 inside its container. TLS is terminated by a reverse proxy in front of it. This is the standard, recommended deployment model.
Why the proxy configuration matters — secure login cookie
Section titled “Why the proxy configuration matters — secure login cookie”Required forwarded headers
Section titled “Required forwarded headers”Every proxy configuration must pass these headers to calit:
| Header | Purpose |
|---|---|
X-Forwarded-Proto | Tells calit the public scheme (https). Required for the secure cookie. |
X-Forwarded-For | Real client IP, used for rate limiting and logging. |
Host | Original request hostname, used to build redirect URLs. |
Set APP_BASE_URL
Section titled “Set APP_BASE_URL”Set the APP_BASE_URL environment variable to your public HTTPS URL, for example:
APP_BASE_URL=https://book.example.comcalit uses this value to build absolute links (booking confirmation emails, Google OAuth redirect URIs, etc.).
Hardening: restrict trusted proxies
Section titled “Hardening: restrict trusted proxies”proxy-address-forwarding=true instructs calit to trust forwarded headers from any source. If the container port (8080) is reachable directly — bypassing the proxy — a client could forge X-Forwarded-Proto: https and circumvent security checks.
To prevent this, restrict which upstream IPs are allowed to set forwarded headers:
QUARKUS_HTTP_PROXY_TRUSTED_PROXIES=<proxy CIDR>For example, if your proxy container is on the 172.20.0.0/16 Docker network:
QUARKUS_HTTP_PROXY_TRUSTED_PROXIES=172.20.0.0/16When the container port is not exposed to the public internet (the typical Docker Compose setup where only the proxy port is published), this is optional but still recommended.
WebSocket configuration
Section titled “WebSocket configuration”No WebSocket configuration is needed. calit ships no runtime WebSocket connections and no single-page-app — it is entirely server-rendered HTML.
Proxy-specific guides
Section titled “Proxy-specific guides”- Nginx Proxy Manager — GUI-based setup, good for homelab use
- nginx — manual server block
- Caddy — automatic TLS, minimal configuration
- Traefik — Docker-label-driven, integrates with docker-compose