Time to complete: 1 hour typing, 12 hours waiting. See the source.

Tech stack

  • Google Domains
  • Hugo - blog engine
  • GitLab - CI, hosting, Let’s Encrypt


Buy your domain from Google Domains and create a DNS A record which points to GitLab’s IP address. Create a new project in GitLab using the Hugo template and call it yourusername.gitlab.io.

In the Pages configuration for your GitLab project add a new domain and select Let’s Encrypt. You’ll be instructed to add a special TXT DNS record to prove you own the domain so get back to Google Domains and add that.

In the CI section on GitLab trigger a build in Pipelines to create and deploy your static website to https://yourusername.gitlab.io.

Everything is in place, you just need to leave it for a few hours for the DNS records to propagate. But do be aware that your website might be inaccessible during this time.

Ghost export

I migrated my Ghost blog by exporting it as a JSON file and then using jekyll_ghost_importer to extract the posts. However, this doesn’t export the images – which wasn’t such a big deal for me – but it’s worth bearing in mind. This also creates posts with the Jekyll date prefix but you batch rename those on the command line.

Committing to GitLab

As Hugo is a static blog engine you might assume that you need to commit your generated site. But you’re wrong. You simply commit the source (markdown) then the live site is generated in the “public” directory and published by GitLab. In fact “/public” is explicitly ignored in .gitignore.

Creating new posts

On Linux you can use the Hugo command line tool to generate a new post.

hugo new post/yeah.md

But once you get used to it you can just create new markdown files in content/post, even using only the GitLab IDE if you like. Just add the following front matter at the top of the file, you can use a simplified YYYY-MM-DD date format too if you don’t care about the precise time.

title: Hugo Blog
subtitle: Create a blog like this
date: 2019-09-09
draft: false
  - tag1
  - tag2

Custom domains

If you’d like to access your blog from another domain you can add it via your Pages settings. You can also generate a Let’s Encrypt certificate.

In your DNS config, add a TXT record with the info from the Pages section in your GitLab repo.

The string will be something like:

DNS record name ..........................     DNS record text ...............................................
_gitlab-pages-verification-code.<newdoman> TXT gitlab-pages-verification-code=ba313925ceeca3fee58a1b5130ea8222

And then hit refresh until GitLab has managed to fetch the new text record from your website.

Site last built: Sat Mar 6 14:52:36 UTC 2021

Hugo version

Hugo Static Site Generator v0.56.3-F637A1EA linux/amd64 BuildDate: 2019-07-31T12:51:09Z


NAME=“Alpine Linux” ID=alpine VERSION_ID=3.11_alpha20190707 PRETTY_NAME=“Alpine Linux edge” HOME_URL=“https://alpinelinux.org/" BUG_REPORT_URL=“https://bugs.alpinelinux.org/"


Linux runner-ed2dce3a-project-16511878-concurrent-0 4.19.78-coreos #1 SMP Mon Oct 14 22:56:39 -00 2019 x86_64 Linux