静的サイトジェネレータ「Hugo」でブログサイトを S3 + CloudFrontでホストするまで [第2回〜HugoにMainroadテーマ適用編〜]

静的サイトジェネレータ「Hugo」でブログサイトを S3 + CloudFrontでホストするまで [第2回〜HugoにMainroadテーマ適用編〜]
目次

ブログ構築シリーズ


静的サイトジェネレータ「Hugo」を使って当ブロブサイトを S3 + CloudFront の構成でホストすることができましたので、 構築~デプロイまでの流れをブログ構築シリーズとして全6回でご紹介していきます。 第2回はHugoにカスタムテーマを適用し、それっぽい見た目に整えていきます。  

1. 第1回〜Hugoの環境構築編〜 
2. 第2回〜HugoにMainroadテーマ適用編〜 ☆今回はこちらを紹介します
3. 第3回〜Hugoを S3 + CloudFront でホストする〜
4. 第4回〜HugoをGithub Action でS3にプッシュする〜
5. 第5回〜HugoをRoute53 + お名前.comで公開する〜
6. 第6回〜HugoのSEO対策〜

 

TL;DR


本記事でわかることは以下の通りです。

☆ Hugoでテーマを適用する方法
☆ テーマ自体の更新時に自サイトに自動的に反映させる方法

 

はじめに


Mainroad をHugoに適用します。 詳しいことはよくわからないが、技術文書の公開やブログのテーマとして人気のあるテーマだそう。 ただし、初期状態だと最低限の設定しかされていないため、見せ方は各々で設定してくれといった感じらしい。
とはいえ、「hugo mainroad」でググればたくさんブログサイトがヒットするので、設定のハードルはそこまで高くないと思います。 公式マニュアル も整備されているので読みやすかったです。

 

ちなみに筆者がmainroadを選択理由は↓です。

mainroadテーマを選択した理由

  • 記事ごとにタグ付け、カテゴリー分けが可能であること
  • 利用者ごとにカスタマイズできること
  • 使いやすい!!(執筆しやすい、構築しやすい) ←ほぼこれが決定打

前置きが長くなったが、本記事では 公式githubリポジトリ を使用してテーマを適用していく。

 

環境


$ cat /etc/redhat-release 
Red Hat Enterprise Linux release 9.0 (Plow)

$ arch
x86_64

$ hugo version
hugo v0.101.0-466fa43c16709b4483689930a4f9ac8add5c9f66+extended linux/amd64 BuildDate=2022-06-16T07:09:16Z VendorInfo=gohugoio

$ git --version
git version 2.31.1

 

1. テーマファイルをクローンする


プロジェクトサイトの構築は 前回の記事 で実施済みのため割愛。

プロジェクトのルートディレクトリで以下のコマンドを実行。

$ cd www # プロジェクトサイトディレクトリに移動
$ git clone https://github.com/vimux/mainroad.git themes/mainroad

また、大きな変更を加える予定はないけれどもテーマを追跡して更新したいという場合は、次のコマンドで git サブモジュールとして追加することもできる。

$ git submodule add https://github.com/vimux/mainroad.git themes/mainroad # themesディレクトリは以下にmainroadという名前でクローンする

 

2. config.tomlの編集


全ての設定項目を紹介することはできないので、細かい設定項目を参照したい人は こちら を参考にしてください。

参考までに私の環境のconfig.tomlファイルはこちら。

baseURL = 'https://technowanko.com/'
title = "technowanko"
DefaultContentLanguage = "ja" # 日本語化
languageCode = "ja-JP" # 日本語化
paginate = "15" # Number of posts per page
theme = "mainroad" # mainroadを使用する
summaryLength = "50" # 記事一覧画面で表示するサマリーの文字数
disqusShortname = "hoge" # Enable Disqus comments by entering your Disqus shortname
googleAnalytics = "" # Enable Google Analytics by entering your tracking id
enableRobotsTXT = false
# disableKinds = ["taxonomy","taxonomyTerm"]

[Author] # Used in authorbox
  name = "TECHNOWANKO"
  bio = "文系出身の駆け出しインフラエンジニアがいろんな技術に触れやってみたことを記録していくブログです"
  avatar = "img/avatar1.jpeg"

[Params]
  description = "文系出身の駆け出しインフラエンジニアが初学者にもわかりやすく技術を紹介します。" # Site description. Used in meta description
  copyright = "TECHNOWANKO.COM" # Footer copyright holder, otherwise will use site title
  opengraph = true
  twitter_cards = true 
  images = ['img/twitter_card.webp'] # the twitter_card image
  toc = true # Enable Table of Contents
  readmore = true 
  dateformat = "2006-01-02"
  authorbox = true
  pager = true
  post_meta = ["date", "categories"] # Order of post meta information
  mainSections = ["posts"]
  customCSS = ["css/custom.css"] # カスタムCSSファイルをインクルードする

[Params.logo]
  image =false 
  title = "technowanko"
  subtitle = "駆け出しインフラエンジニアの備忘録"

[Params.style.vars]
  highlightColor = "#e9967a" #e22d30

[Params.thumbnail]
  visibility = ["list", "post"] # サムネイルを表示するページを指定

[Params.sidebar] # サイドバーに表示する項目を設定する
  home = "right"
  list = "right"
  single = "right"
  # Enable widgets in given order
  widgets = ["search", "recent", "categories", "taglist", "social", "languages"]

[Params.widgets]
  recent_num = 5 # Set the number of articles in the "Recent articles" widget
  categories_counter = true # Enable counter for each category in "Categories" widget
  tags_counter = false # Enable counter for each tag in "Tags" widget

[Params.widgets.social]
  # Enable parts of social widget
  twitter = "r0_oo9"

[[Params.widgets.social.custom]]
  title = "Qiita"
  url = "https://qiita.com/Geeryo"


[[Menus.main]]
  Name = "TOP"
  URL = "/"
  WEIGHT = 1

[[Menus.main]]
  Name = "ALL"
  URL = "/categories/"
  WEIGHT = 2

[[Menus.main]]
  Name = "AWS"
  URL = "/categories/aws/"
  WEIGHT = 3

[[Menus.main]]
  Name = "docker"
  URL = "/categories/docker/"
  WEIGHT = 4

[[Menus.main]]
  Name = "program"
  URL = "/categories/program/"
  WEIGHT = 5

[[Menus.main]]
  Name = "hugo"
  URL = "/categories/hugo/"
  WEIGHT = 6

[[Menus.footer]]
  Name = "Privacy"
  URL = "/privacy/"
enableRobotsTXT = false

robots.txtの自動生成はほぼ意味がないので、自分で作成している。(というか記述しなくてよい。) robots.txtとはなにものかという方は こちら

robots.txt

User-agent: *
Disallow:
Sitemap: {{ .Site.BaseURL }}sitemap.xml

 

3. コメント機能を追加する


hugoにはデータベースの機能はないため、コメントを管理することができない。そこで、 disqus を使用することで楽勝でコメントシステムを導入することができる。

disqusの登録は こちら のブログ記事がわかりやすい。

登録完了後に払い出されるdisqusShortnameをconfig.tomlファイルに記載する。

disqusShortname = "hoge" # Enable Disqus comments by entering your Disqus shortname

Front Matterに以下を記載する。

comments: true # Enable Disqus comments for specific page

この設定をするだけで、本記事の末尾にあるようなコメント機能が表示される。

 

4. Front Matter の設定


hugo newコマンドで記事を生成する際に使用するテンプレートファイルを編集する。

$ hugo new posts/**.md

テンプレートファイルはプロジェクトルートディレクトリ配下の archetypes/default.md にある。 参考までに私の設定はこちら。

---
title: "{{ replace .Name "-" " " | title }}"
description: "** | technowanko.com 駆け出しエンジニアの備忘ブログ"
date: {{ .Date }}
tags:
  - ""
categories:
  - "aws"
  - "docker"
  - "hugo"
  - "program"
thumbnail: "img/thumbnails/aws.webp" # aws
# thumbnail: "img/thumbnails/Python-Symbol.webp" #python
# thumbnail: "img/thumbnails/golang_neo.webp" #go
# thumbnail: "img/thumbnails/docker.webp" #docker
# thumbnail: "img/thumbnails/hugo.webp" #hugo
images:
- img/twitter_card.webp # twitter card image
lead: "" # Lead text
comments: true # Enable Disqus comments for specific page
isCJKLanguage: true
draft: false # To be changed to false before build !!
---

こちらもより細かく設定したい方は、 こちら を参考にしてください。

 

5. 静的ファイルの生成


プロジェクトルートディレクトリで以下のコマンドを叩くだけで、HTMLやCSSなどの静的ファイルがpublicディレクトリとともにディレクトリ配下に作成される。

$ hugo

 

まとめ


今回は、ローカルで好みの設定にカスタマイズし、ローカルで静的ファイルを生成、表示した。
次回は、実際に静的ファイルをAWSのストレージサービスのS3とCDNサービスのCloudFrontを使用し、インターネット公開する手順を紹介する。

 

参考ドキュメント