This is how I do it. It works internally and externally, though it’s more than OP needs. :)
To add to what’s been said (in case it’s useful to others), it’s worth looking at SWAG and Authelia to do the proxying for services visible to the Internet. I run them in a Docker container and it does all the proxying, takes care of the SSL certificate and auto-renews it, and adds MFA to the services you run that support it (all browsing, MFA-aware apps, etc).
Another thing I like about SWAG’s setup is that you select which services/hostnames you want to expose, name them in the SUBDOMAINS environment variable in Docker (easy to remove one if you take a service down, for maintenance, etc), and then each has its own config file in Nginx’s proxy-confs directory that does the https://name.domain -> http://IP:port
redirection for that service (e.g. wordpress.subdomain.conf), assuming the traffic has met whatever MFA and geo-whitelisting stuff you have set up.
I also have Cloudflare protecting the traffic (proxying the domain’s A record and the wildcard CNAME) to my public address, which adds another layer.
deleted by creator