The pieces
To put a site online you need three things: files to serve, a web server program to serve them, and a domain name pointing at your address. We'll use Caddy because it fetches and renews HTTPS certificates entirely on its own — the part that used to be painful is now automatic.
Install Caddy
On Debian/Ubuntu this installs Caddy as a managed service that starts on boot.
Homebrew drops the caddy binary on your path. Run it directly, or have brew services keep it running in the background.
Run Caddy inside WSL2 with the Linux instructions, or grab the native caddy.exe from caddyserver.com if you specifically need it on the Windows host:
Serve a folder
Caddy is configured by one plain-text file called a Caddyfile. To serve a folder over HTTPS under your domain, that file is four lines — and it's identical on every OS:
root * /var/www/site
file_server
}
That's the whole thing. On first load Caddy contacts Let's Encrypt, proves it controls the domain, installs a certificate, and serves your site at https:// with the padlock. It renews forever, automatically.
Point the domain at your box
Buy a domain from any registrar (~$10–15/year). In its DNS settings, add an A record pointing at your public IP. If you host from home, two notes that apply regardless of OS:
- Home IPs change — a dynamic DNS client on the box updates the record automatically when yours does.
- You'll forward ports 80 (HTTP) and 443 (HTTPS) from your router to the box. Those are the two doors a website needs: 80 is where browsers land without https:// and where Let's Encrypt verifies your domain, 443 is where the encrypted site actually lives. Caddy needs both — or, to avoid opening your network at all, use a tunnel.
Host this very campaign
This landing page and guide are plain files. Drop them in your served folder and they're live — the whole point of building the campaign as static files is that anyone can mirror it on their own box in minutes.
Before you move on
- Caddy installed and running
- A domain with an A record pointing at your IP
- Ports forwarded, or a tunnel in place
- Your site loads over https:// with a valid certificate