After wrestling with WordPress — empty database backups, MySQL containers that wouldn’t start after a restart, and the constant drip of plugin update notifications — I decided enough was enough.

What was wrong with WordPress

The immediate trigger was trying to restore a site for a friend. The backup had two files: a .sql dump and a tar.gz of the WordPress files. Both were empty shells. The backup script had run successfully every night against volumes that were never actually populated.

Longer term, every WordPress install I run is a maintenance surface:

  • Core updates (security patches, roughly monthly)
  • Plugin updates (weekly, some with breaking changes)
  • Theme updates
  • MySQL container that needs its own backup strategy
  • PHP-FPM that can silently break if the container restarts in the wrong order

For a personal portfolio site that I might not touch for three months at a time, that’s a lot of overhead.

What Hugo is

Hugo is a static site generator — a single Go binary that takes a folder of Markdown files and compiles them into plain HTML, CSS, and JavaScript. The output is a folder. You point nginx at that folder. Done.

No database. No PHP. No runtime of any kind. A static HTML file served by nginx:alpine uses about 5 MB of RAM at idle, compared to ~250 MB for a WordPress stack.

The deployment pattern

My home server already runs a static nginx container for another site (99-names). Hugo fits the same pattern exactly:

services:
  mohamed-personal-site:
    image: nginx:alpine
    container_name: mohamed-personal-site
    volumes:
      - ./site/public:/usr/share/nginx/html:ro
    networks:
      - npm_net

Build with Hugo, output goes to site/public/, Nginx Proxy Manager routes mohamed.sirwalterlibrary.ddns.net to this container. Identical to what I already knew.

Backup is now just git

The entire site — content, configuration, theme — lives in a git repository. Backing up means git push. Restoring from scratch means git clone && hugo.

No more praying that the mysqldump captured something useful.

What I gave up

The WordPress admin dashboard. For now that’s fine — I’m the only person editing this site. If I ever want collaborators, I’ll look at Decap CMS or Pages CMS, both of which layer a web editor on top of a static site without adding a database.