I run a couple of self-hosted services:

I use Tailscale to be able to connect to my services through a secure network without having to expose my home network to internet directly.

I use Caddy to configure the network so that I can use subdomains to point to my Raspberry Pi’s Tailscale IP address and to then point those to the right ports at localhost.

In /etc/caddy/Caddyfile, I define the following

https://jellyfin.hamatti.org {
	reverse_proxy localhost:8096
}
 
https://paperless.hamatti.org {
	reverse_proxy localhost:12345
}

and in my domain provider’s DNS console, I point jellyfin.hamatti.org to the IP address from my Tailscale network.