Self Hosting Hugo

Why I Decided to Self-Host

I’ve been working on rockcampbell.com, and decided I wanted full control. That meant running Hugo on my own home server, behind Nginx Proxy Manager, using Docker — and pointing my domain directly to it.

What followed was a surprisingly long series of gotchas…


Building the Hugo Site

  • Used the PaperMod theme
  • Installed Hugo Extended manually (because the Arch repo version was too old)
  • Created my first post (and later deleted it)

Docker Setup

  • Used nginx:alpine to serve the public folder
  • Mounted the public/ folder using Docker Compose
  • Exposed it to Nginx Proxy Manager via the shared web network

Nginx Proxy Manager

  • Configured the domain rockcampbell.com
  • Issued SSL certificate via Let’s Encrypt
  • Initial requests worked, but subpages failed over HTTPS

Fix: The issue was a misconfigured baseURL in hugo.toml, and SSL wasn’t working until I reissued the cert.


DNS Issues

I forgot to update the A record from GitHub Pages to my home IP, which caused Let’s Encrypt cert issuance to fail.


Hugo Errors

  • Error: no existing content directory configured for this project
    Fixed by adding contentDir = "content" to hugo.toml.

Lessons Learned

  • Always double-check DNS before attempting SSL
  • If you get a 502 Bad Gateway from OpenResty, it’s probably a reverse proxy or Docker networking issue
  • Don’t trust the default hugo new behavior with new module-based sites — clarify your config

Final Setup

  • Hugo serves from /public
  • Docker container running on web network
  • Nginx Proxy Manager handles SSL + reverse proxy
  • rockcampbell.com is live and running from my home server