Self-Hosting your services at home

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

  1. Register a domain and manage DNS via Dynu
  2. Install the Dynu IP Update Client on my server to keep the A record updated with my current public IP
  3. Use Caddy in Docker as a reverse proxy to handle subdomains and HTTPS automatically via Let’s Encrypt
  4. Configure my router to forward ports 80 and 443 to the server’s internal IP

🔗 Dynu Setup

  1. Create an account at dynu.com
  2. Add a domain (e.g., wallaceat.me) and enable Dynamic DNS
  3. 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
  1. Configure it with your Dynu API token or login credentials
  2. 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 PortInternal IPInternal PortProtocol
80192.168.1.10080TCP
443192.168.1.100443TCP

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.me and confirm the WordPress page loads
  • Check https://tv.wallaceat.me for 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.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *