After some more considering, I was able to solve this problem (I think) with tailscale and nginx.
Steps to recreate:
Install tailscale on DVR host (in my case, a mac mini). Untested with the integrated tailscale in the DVR, but I suspect it would work.
Install tailscale on VPS and join it to the network
Create an nginx config that looks something like this on the VPS host:
nginx.conf:
# nginx.conf
worker_processes auto;
events {
worker_connections 1024;
}
stream {
server {
listen 8089;
proxy_pass <channels DVR tailnet IP>:8089;
}
}
docker-compose.yml file that looks like this:
version: '3.9'
services:
nginx:
image: nginx:latest
container_name: nginx-stream
ports:
- "8089:8089" # Expose port 8089 on the host
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro # Mount the custom config file
restart: unless-stopped
docker compose up -d and then enter the tailnet IP of the VPS as an "at home" server manually and it all seems to work.