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.
Leave a Reply