Skip to main content
  1. Posts/

Building This Blog: Hugo + Azure Static Web Apps

·627 words·3 mins

Every homelab journey needs a place to live. Mine starts here.

I recently picked up three Intel NUCs — each running an AMD Ryzen 7430U with 32GB of RAM and a 512GB SSD — with the goal of building a proper Kubernetes cluster at home. I want to learn, self-host things I actually use, and document the whole thing so others can follow along (or at least avoid my mistakes).

Before I start flashing Talos Linux and configuring PXE boots, I figured I needed somewhere to write things down. So: this blog.

My homelab — three NUCs ready to become a Kubernetes cluster

Why Hugo + Azure Static Web Apps? #

I wanted something:

  • Fast — no server, no database, just static files on a CDN
  • Automated — push to git, site updates. No manual deploys
  • Secure — no backend attack surface, HTTPS out of the box

Hugo fits that perfectly. It’s a static site generator written in Go — single binary, no Node.js dependency hell, builds in milliseconds. Azure Static Web Apps has a free tier that integrates directly with GitHub: every push to main triggers a build and deploy automatically via GitHub Actions.

The Setup #

The stack is simple:

  • Hugo — static site generator with the Congo theme
  • GitHub — source of truth, version control
  • Azure Static Web Apps — free hosting, global CDN, automatic HTTPS, CI/CD via GitHub Actions

The deploy token lives in GitHub Secrets — never in the repository. The public/ build output is never committed either; Azure builds it fresh on every deploy.

Custom Domain + DNS #

With the site running on Azure I wanted it on a proper domain, not the default azurestaticapps.net URL. I registered ricardojacobs.nl through TransIP — the go-to registrar for .nl domains in the Netherlands.

The DNS problem #

The first instinct was to manage DNS at TransIP directly. Azure Static Web Apps needs two things for a custom domain:

  • An ALIAS record at the apex (@) pointing to the Azure hostname
  • A CNAME for www

TransIP supports ALIAS records, but it rejected Azure’s hostname format with a validation error. After some digging, the cleaner solution was to move DNS management to Azure DNS — keeping everything in one place and using Azure’s native ALIAS support for Static Web Apps.

Setting up Azure DNS #

  1. Create a DNS Zone resource in Azure for your domain
  2. Azure provides 4 nameservers — update these at your registrar under Nameservers
  3. For .nl domains this goes through the SIDN registry, so allow up to an hour for propagation

Once the nameservers propagate, add the following records in the Azure DNS Zone:

TypeNameValue
A (Alias)@→ Azure Static Web App resource
CNAMEwwwyour-app.azurestaticapps.net

The A record with alias mode points directly to the Static Web App resource — Azure resolves the IP internally and handles changes automatically. No hardcoded IP addresses.

Adding the custom domain in Azure #

With DNS in Azure, go to Static Web App → Custom domains → + Add, choose Custom domain on Azure DNS, and Azure handles the ownership validation automatically. It then provisions a free SSL certificate via DigiCert — no manual certificate management needed, auto-renewed.

The whole domain + HTTPS setup took about an hour, most of which was waiting for the .nl nameserver delegation to propagate.

What’s Next #

This blog is step one of a longer journey. Here’s what I’m planning to document:

  • Talos Linux — immutable, API-driven OS for Kubernetes, installed via PXE boot
  • Kubernetes cluster — setting up a three-node cluster on bare metal NUCs
  • OpenBao — secret management (open-source fork of HashiCorp Vault)
  • Keycloak — SSO for all self-hosted services
  • Immich — self-hosted Google Photos alternative
  • Observability — metrics, logs, traces — the whole stack

If any of that sounds interesting, stick around. This is going to get hands-on quickly.