In this post, I explain how I made my self-hosted services accessible from anywhere in the world using:
- Dynu for dynamic DNS updates
- Caddy for automatic HTTPS and reverse proxying
- Home router port forwarding to route public traffic into my server
π Problem
My home internet connection uses a dynamic IP address provided by Vodafone, which changes periodically. Without a static IP, itβs difficult to access self-hosted services like Jellyfin, Immich, or WordPress remotely. Also, I wanted HTTPS support without having to manually configure certificates.
π οΈ Solution Overview
- Register a domain and manage DNS via Dynu
- Install the Dynu IP Update Client on my server to keep the A record updated with my current public IP
- Use Caddy in Docker as a reverse proxy to handle subdomains and HTTPS automatically via Let’s Encrypt
- Configure my router to forward ports
80and443to the server’s internal IP
π Dynu Setup
- Create an account at dynu.com
- Add a domain (e.g.,
wallaceat.me) and enable Dynamic DNS - Install the Dynu client on your server:
sudo wget https://github.com/shibani/dynu-ip-update-client/releases/latest/download/dynu-ip-update-client-linux-amd64.deb
sudo dpkg -i dynu-ip-update-client-linux-amd64.deb
- Configure it with your Dynu API token or login credentials
- Ensure the service is running and enabled:
sudo systemctl enable --now dynu-ip-update-client.service
The client checks for public IP changes and updates your Dynu DNS record automatically.
β‘ Router Configuration
Log in to your home router and forward the following ports to your serverβs internal IP (e.g., 192.168.1.100):
| External Port | Internal IP | Internal Port | Protocol |
|---|---|---|---|
| 80 | 192.168.1.100 | 80 | TCP |
| 443 | 192.168.1.100 | 443 | TCP |
Now any request to http(s)://yourdomain.com is routed to the Caddy server inside your LAN.
π§ Caddy Configuration
The Caddyfile defines reverse proxy rules. Hereβs a simplified example:
wallaceat.me {
reverse_proxy wordpress:8080
}
photos.wallaceat.me {
reverse_proxy immich_server:2283
}
tv.wallaceat.me {
reverse_proxy jellyfin:8096
}
Caddy automatically issues and renews TLS certificates via Letβs Encrypt, making HTTPS seamless.
π‘ Testing Everything
- Visit
https://wallaceat.meand confirm the WordPress page loads - Check
https://tv.wallaceat.mefor Jellyfin - Verify Dynu logs to see if IP updates are working
- Confirm port 80/443 are open using
https://www.yougetsignal.com/tools/open-ports/
β Outcome
All self-hosted services are now available from anywhere, secured with HTTPS, using a reliable and automatic DNS + reverse proxy setup. The stack is stable, scalable, and doesnβt require paying for a static IP or managed DNS.
π§© Technologies Used
- Ubuntu Linux
- Docker & Docker Compose
- Caddy Server (v2)
- Dynu Dynamic DNS
- Vodafone Broadband (dynamic IP)
π¬ Final Thoughts
This setup is perfect for enthusiasts looking to self-host services and access them securely over the internet. With minimal cost and maintenance, you get a robust system thatβs entirely under your control.