Hugo で blog サイトの作成: 環境構築編

目次

構築手順の概要

前回の投稿 の方針に従って、下記の手順で準備する。

  1. Windows PC 執筆環境
  2. GitHub 連携
  3. サイト公開

Windows PC 執筆環境

事前準備

執筆環境として、Visual Studio Code をインストールしておく。 最近では winget コマンドを使うことで簡単にインストールできる。

winget install Microsoft.VisualStudioCode
Hugo の執筆用に下記の拡張機能のインストールも推奨。

Hugo アプリのインストール

winget コマンドでインストール

winget install Hugo.Hugo.Extended

バージョンの確認

PS C:\> hugo version
hugo v0.135.0-f30603c47f5205e30ef83c70419f57d7eb7175ab+extended windows/amd64 BuildDate=2024-09-27T13:17:08Z VendorInfo=gohugoio

Hugo サイト (フォルダ) を作成

作業用フォルダに等に Hugo 用フォルダ構造を作成する。

mkdir "${env:USERPROFILE}\blog"
cd "${env:USERPROFILE}\blog"
hugo new site blog

成功した場合は Congratulations! と表示される。

Congratulations! Your new Hugo site was created in C:\Users\XXXX\blog.

Just a few more steps...

1. Change the current directory to C:\Users\XXXX\blog.
2. Create or install a theme:
   - Create a new theme with the command "hugo new theme <THEMENAME>"
   - Or, install a theme from https://themes.gohugo.io/
3. Edit hugo.toml, setting the "theme" property to the theme name.
4. Create new content with the command "hugo new content <SECTIONNAME>\<FILENAME>.<FORMAT>".
5. Start the embedded web server with the command "hugo server --buildDrafts".

See documentation at https://gohugo.io/.

初期状態のフォルダ構造 (Hugo 0.135.0時点)

公式ドキュメント: Directory structure

blog/            # Hugoサイトトップフォルダ
  |- archetypes/
  |- assets/
  |- content/    # 記事ファイル群の配置
  |- data/
  |- i18n/
  |- layouts/
  |- static/     # 静的ファイル (カスタムCSSや画像ファイル等)
  |- themes/     # Hugoテーマ配置フォルダ
  |- hugo.html   # 設定ファイル

ビルド後に追加されるフォルダ

サイト公開する際は、ビルド後に public 以下のみを Web サーバにコピーすればよい。

blog/
  |- public/     # Web公開用フォルダ Web
  |- resources/

git 初期設定

Hugo サイト全体を git 管理するため、初期化する。

cd "${env:USERPROFILE}\blog"
git init

コミットしないフォルダを指定するため、同じフォルダに .gitignore ファイルを作成し、中身を以下の通り書いておく

/public

git の初期設定も実行しておく。※ user変数は各自のものを入れる。

git config --global user.name "XXXXXXX"
git config --global user.email "[email protected]"
git config --global merge.ff "false"
git config --global push.default "simple"
git config --global pull.ff "only"

初回の空コミットをしておく

git commit --allow-empty -m "first commit"

Hugo テーマインストール

Hugo のテーマサイト からお好みのテーマを探し、Hugo サイトフォルダ配下に配置する。Git 管理にしたいので、下記のとおり subtree として展開する。

サンプルテーマの導入例

git remote add thenewdynamic-ananke https://github.com/theNewDynamic/gohugo-theme-ananke
git subtree add --prefix themes/ananke --squash thenewdynamic-ananke master

git submodule でテーマを展開すると紹介している hugo 構築記事もあるが、場合によってはテーマ構造に手を入れる必要があるため git subtree の方が向いている。

Hugo 設定ファイル

初期設定例: hugo.toml

baseURL = 'https://example.org/'
title = 'New Hugo サイト'
languageCode = 'ja_jp'           # 日本語対応
defaultContentLanguage = "ja"    # 日本語対応
theme = "ananke"                 # テーマ名を指定
hasCJKLanguage = true            # 日本語対応

[Params]
  date_format = "2006/01/02(Mon)"

Hugo設定ファイル補足

記事を書く

基本的に content フォルダ以下に *.md ファイルを書いていけば認識されるのだが、特に固定されたファイル配置パターンはないらしい。

保守性を考えて、本 blog では下記の構造で構成することにした。

blog/
  |- content/
    |- posts/
      |- YYYYMMDD-TOPIC1  # 記事1フォルダ
        |- index.md   # 記事1本体の MarkDown ファイル
        |- xxxxx.jpg  # 記事1に貼り付ける画像
        |- xxxxx.png  # 記事1に貼り付ける画像
      |- YYYYMMDD-TOPIC2  # 記事2フォルダ
        |- index.md   # 記事2本体の MarkDown ファイル
        |- xxxxx.jpg  # 記事2に貼り付ける画像
        |- xxxxx.png  # 記事2に貼り付ける画像
    |- privacy.md  # サイト全体で固定の記事など
  • 記事ごとにフォルダをわけることで、記事から参照される関連画像とひとまとめにしておく
  • フォルダ名に日付を入れることにより、記事の古い順にフォルダがソートされる
    • URL にも日付が含まれるため、記事の古さが明確になる
  • フォルダ名にトピック名を付記することで、URL 名だけでなんの記事か推測できるようにする
  • 1階層のみのフォルダとし、管理をシンプルにする
    • 記事をジャンル分けしたい場合は、タグ機能を利用する

記事フォルダを追加

記事を書き始める際は、hugo new で記事フォルダを構成する。

cd (BLOGトップフォルダ)
hugo new (記事フォルダ)/index.md

実行例:

cd "${env:USERPROFILE}\blog"
hugo new posts/20240818-test/index.md

テンプレートに従ってひな形の index.md が自動作成される。

記事の執筆

index.md は下記の構造になっている。(TOML構造の場合)

---
+++
(Front Matterセクション)
title = '20240818 Test'
date = 2024-08-18T19:59:42+09:00
draft = true
...
+++

(本文)

Front Matter セクションには記事ごとの固有情報を追記する。デフォルトは draft が true なので、下書き記事として認識され、public には配置されない。

本文は MarkDown 記法でエディタで記事を書いてゆく。

執筆用 PC で blog 表示テスト

hugo は簡易 Webサーバ機能を持っていて、下記のコマンドでプレビュー用に起動できる。

hugo -D server

同じ PC からは表示された URL をブラウザで開くと、リアルタイムに変更が反映 される。

例) http://localhost:1313/

別の端末のブラウザから見せたいときは、下記のようにアドレス 0.0.0.0 (IPv4) か :: (Ipv6) でバインドする。

hugo -D server --bind ::

GitHub 連携

筆者はあまり git を深く理解できていないので、以下の手順は不完全な可能性があります。

下記については別途準備しておく:

GitHub リポジトリに commit + Push

git remote add origin https://github.com/USERNAME/REPOSITORYNAME.git
git pull origin master
git push origin master

完了後、Github https://github.com/USERNAME/REPOSITORYNAME をブラウザを開いて、コードが登録されているか確認する。

サイト公開

Cloudflare とは

以前は Github + Netlify でサイト公開をしていたが、2024年9月に GitHub + Cloudflare Pages に移行した。主な理由は下記の通り。

  1. Cloudflare Pages は Free プランで CDN が利用でき、圧倒的高速化が図れる。
    1. Netlify は海外だったためか、ページ自体は軽いにもかかわらず、日本からの初回アクセスが若干遅かった印象。
    2. Netlify と Github の連携が若干分かりづらく、細かいエラーでデプロイが失敗することがあった。
    3. TLSサーバ証明書が無料 (Google Trust Service)
    4. HTTP/3 も対応
  2. Cloudflare Registrar に個人ドメインの DNS レジストラを委譲でき、原価で利用できる
    1. ムームードメインがここ数年毎年値上げしているため。(GMOに吸収されたせい?)
  3. Cloudflare DNS サービスで個人ドメインの公開 DNS ゾーンを登録でき、無料で利用できる。
    1. 以前は No-IP.com を使っていたが、ドル建て+円安の影響で価格上昇していた。
    2. 今のところ Cloudflare DNS は「レジストラ費用は原価で提供」のコンセプトらしい。

Cloudflare に魂を売る ですべてを構成することで、ワンストップで blob 構築が可能になる。ただし、Cloudflare registrar は .jp 等の一部 TLD には対応していない ので注意。

参考: Cloudflare TLD ポリシー (対応TLD一覧)

Cloudflare Pages へのデプロイ設定

下記の設定をあらかじめ進めておく。Cloudflare Pages で公開するためには、最低限 DNS サーバホストを Cloudflare に移管しておく必要がある。

  • Cloudflare アカウントの作成 (FreeプランでOK)
  • Cloudflare DNS に自分のドメインのゾーンをコピーまたは登録
  • Clounflare Registrar で、自分のドメインのレジストラを移管
    • こちらは必須ではないが、価格的な理由で実施した。

Cloudflare Docs > Pages > Framework guides > Hugo | Deploy with Cloudflare Pages に従って、GitHub リポジトリとの連携設定を入れる。

これにより GitHub に Commit + Push すると、自動的に Cloudflare Pages がフックされ、hugo でビルドされ、サイトが公開される。

注意点として、デフォルトの Hugo バージョンが古いため、必ず変数 HUGOVERSION を執筆環境と合わせておくこと。設定を忘れると、執筆環境では表示されるにもかかわらず、Cloudflare Pages 側でビルドエラーが発生し、いつまで経ってもサイトが更新されないことがある。

Cloudflare Pages 設定

サイト公開確認

GitHub → Cloudflare Pages ビルド連携が正常に完了すると、下記の一時 URLで確認することができる。

https://XXXXX.pages.dev/

blog サイト正式公開設定

Cloudflare Pages で対象サイトに「カスタムドメイン」を追加することで、DNS にも反映される。

Cloudflare Pages カスタムドメイン

Cloudflare DNS

TLSサーバ証明書の割り当て等もよろしくやってくれる。反映には少し時間がかかるが、デプロイ完了後、正規な URL でアクセスできることを確認する。

https://blog.yamk.net/

以上