# ~$ selfhostedops — Caddyfile
# Automatic HTTPS for every subdomain. Nothing to renew, ever.

{
	email {$ACME_EMAIL}
}

git.{$DOMAIN} {
	reverse_proxy forgejo:3000
}

wiki.{$DOMAIN} {
	reverse_proxy outline:3000
}

vault.{$DOMAIN} {
	reverse_proxy vaultwarden:80
}

status.{$DOMAIN} {
	reverse_proxy uptime-kuma:3001
}

# Push notifications (episode 6). Websockets and long polling pass through as-is.
ntfy.{$DOMAIN} {
	reverse_proxy ntfy:80
}

# n8n has no public route any more - it is reachable over the mesh only (episode 5)

# NetBird control plane (episode 5) - dashboard, API, gRPC, relay, built-in IdP
vpn.{$DOMAIN} {
	# Native gRPC (needs HTTP/2 cleartext to backend)
	@grpc header Content-Type application/grpc*
	reverse_proxy @grpc h2c://netbird-server:80

	# Combined server paths (relay, signal, management, OAuth2)
	@backend path /relay* /ws-proxy/* /api/* /oauth2/*
	reverse_proxy @backend netbird-server:80

	# Dashboard (everything else)
	reverse_proxy /* netbird-dashboard:80
}

