Writeups on technical projects I've had to research, to hopefully help someone else out there!
I run a Docker server locally which hosts many services such as Plex for watching shows, and Home Assistant for home automation. Because they are both on the same host metal they share the same hostname, but just use different ports to access. For example to access Plex in a browser I would go to [hostname]:32400, whereas for Home Assistant I’d use [hostname]:8123.
This is all well and good, but means you need to bookmark or memorise the ports, and it’s not family friendly if I want someone to be able to access the services without pestering me.
There are guides on how to do this, most feature using a combination of a Raspberry Pi with PiHole + a reverse proxy, and having to update your router’s DHCP server to switch the DNS server for all clients to the PiHole. This fails my family-friendly test as if the Raspberry Pi ever goes down (because I tinkered, because there was a power cut and the Raspberry Pi didn’t come on by itself etc.), DNS goes down and I will start getting complaints that ‘the Internet is down’.
I run a Unifi-based network, which allows me to enter my own DNS records. This, in combination with a reverse proxy, is all you need to make this work. No Raspberry Pi or other hardware is required. This guide details how to do this as simply as possible. It might seem wordy but I hate guides where they assume you know where to find a specific button, so I’ve tried to be as prescriptive as possible.
If you don’t have a Unifi network, you might still be able to make use of this guide, except you will need to figure out for yourself how to edit DNS records for your network.
This guide is correct as of September 2025.
plex.home, it should take me to Plex. If I go to ha.home, it should take me to Home Assistant.This guide assumes that you want to use .home as the TLD for your services, such that you could have photos.home, plex.home and so on. You could use anything in theory, though I’d advise sticking to reserved TLDs like .home and .local in case you ‘collide’ with an actual web address. Note that although .home is a real, reserved TLD a lot of browsers don’t recognise it and assume you’re searching in the address bar. To resolve, make sure you type http:// before the URL. Or .local seems to be better supported, though personally I tend to avoid that one as a lot of services try to publsh their addresses as .local and again you could have a collision.
We’re going to set up a DNS ‘A record’, which tells Unifi how to translate a hostname into an IP, so that when you enter any .home address, you will be bounced to the proxy server.
Policy Engine > Policy Table:
Create New Policy.
DNS then enter the information as follows, then click Add:
Host (A).*.home (or your other chosen TLD like *.local).[the IP address you found in step 1].Auto.
Now if you go to any of the domains you set up, you’ll bounce to whatever’s hosted on that server at port 80, rather than where you’d hope. To get this working, we now need a reverse proxy.
This service packages up a proxy server in an idiot-proof UI, and runs on Docker. The steps are relatively simple:
docker-compose.yml file to remap the port. Don’t use 81 as Nginx Proxy Manager uses it. We will fix this later so you don’t have to worry that it’s not on the default port. For example, I have the ‘Homepage’ app set up on port 80, so I edited the docker-compose.yml file to remap the port to 82:
docker-compose.yml and it’ll work out of the box. Personally in addition I gave the service a name so it’s easier to find when doing a docker ps, and used real volumes over a bind mount. If you don’t know what that means, ignore me.home.home or any other .home address, you should get a holding page:
This assumes you have Nginx Proxy Manager running on the same instance as your other services like Plex. If not, go to whatever the IP or hostname is of the instance you installed it on, and you’ll get the same page.
Now we get into the last main step, of creating the proxy hosts so that everything redirects:
home.home:81. You should see a login screen like this:
admin@example.com and the password as changeme and press Sign In. You will immediately be asked to reset that login to something more secure - do so.Proxy Hosts:
Add Proxy Host:
Save:
plex.home (or whatever service you want to map to).http.home.home (or whatever you set up as your A record).32400 (or whatever the port number is for your service, this one’s the default port for Plex).
Now in a new browser tab, go to the URL you just created (note if you are following my example, your browser might helpfully redirect you to its search engine rather than navigate to your URL, in which case specifiy http:// at the start. Once you do this once, you should be fine in future). You should be at the homepage of your service!
Repeat steps 4 - 7 for any other domains you want to set up. You might for example want to set up proxy.home to bounce to Nginx itself so you don’t have to access it via a port, or if you had to change another service that was on port 80 to another port, now’s the time to redirect it using a new domain name, for example I switched my homepage instance to index.home.
Note some apps, like Home Assistant, don’t like reverse proxies out of the box, and need additional configuration. Some examples I’ve encountered are listed in the section below.
If you see this:

It means the reverse proxy has gone to the port you specified, but there’s nothing running there. Check you’ve specified the correct port, and that your service is running on it.
A number of applications misbehave unless for the proxy host you’ve set up, you enable websockets. As of writing these include:
To solve for these apps, complete the following:
Proxy Hosts screen where we set up all the domains.Edit:
Websockets Support and click Save:
An obscure one, but the fix might be helpful for other apps with a similar problem. Basically this is a Web UI that shows the status of the 3D printer. When you map it to a domain, for example centauri.home, you’ll notice the UI is blank, and the following error appears in the browser console: WebSocket connection to 'ws://centauri.home:3030/websocket' failed:.
Turning on Web Sockets support doesn’t seem to resolve this. To resolve, we need to create a ‘stream’ and also open up another port on the Docker instance:
Streams screen:
Add Stream button:
3030.[IP address of the printer].3030.Enabled.Disabled.
docker-compose.yml file for your Nginx Proxy Manager and add a mapping from port 3030, to port 3030:
Don’t forget to ‘down’ and ‘up’ the instance to make the change stick.
This should now be working fine. Do note this solution will forward any traffic sent to Nginx Proxy Manager on port 3030 to the 3D printer, so be aware in case you have another server that needs that port.
The home page will display, but you won’t be able to connect to any devices. Enable web sockets as per the guide above.
If you try to go to your configured Home Assistant domain, such as ha.home, you’ll be greeted with the error 400: Bad Request, and the following entry in your logs:

Note in my case the address range it’s complaining about is not that of my local network or client machine, I assume this is some internal IP mapping the reverse proxy is doing.
To resolve, we need to edit the configuration.yml file for Home Assistant, and change a setting in Nginx Proxy Manager.
configuration.yml according to your own Home Assistant configuration. For example as I am running HA Core, I have to SSH into the docker instance and edit it using VI.
If you try again, you’ll get a different error:

Follow on to the next section to resolve.
Follow the section above on the WebSockets fix, then you should now be able to go to ha.home and correctly see the Home Assistant homepage.
You will get a generic bad gateway error. Enable web sockets as per the guide above.
The site will appear to load, but quickly you’ll get a could not connect to server pop-up. Enable web sockets as per the guide above.
You get a very simple error of Unauthorized. A small change is required in the qBittorrent client:
Settings > WebUI> Security, uncheck Enable Cross-Site Request Forgery (CSRF) protection and click Save.
At first glance it might look like Zizbee2MQTT is working out of the box, but you’ll quickly see all your devices are missing!

To resolve, enable web sockets as per the guide above.