Featured image of post Hugo + Github Pages + Xserver Domainで独自ドメインに技術ブログを立てる

Hugo + Github Pages + Xserver Domainで独自ドメインに技術ブログを立てる

このブログの立ち上げの備忘録

はじめに

先日、学科の友人におすすめされて、独自ドメインを取得して技術ブログを立ち上げよう、と急に思い立ちました。 そこで、Hugoを使ってブログを構築し、Github PagesとXserver Domainを組み合わせて独自ドメインで公開する方法を試してみました。

Hugoとは

Hugoは、高速で柔軟な静的サイトジェネレーター(SSG)です。Markdownファイルから簡単にウェブサイトを生成でき、多くのテーマやプラグインが利用可能です。最大の特徴はその手軽さにあり、hugoコマンドでさまざまな操作が可能です。

作業環境

ブログ執筆には普段から酷使しているM2Macを使用しました。具体的な環境は以下の通りです。

  • MacBook Air (Apple M2, 2022)
  • macOS Sequoia 15.7.3
  • Homebrew 5.0.9
  • Hugo v0.154.3+extended+withdeploy

…いい加減macOS Venturaにアップデートしろよという話ですが、現在の環境が安定しているのと、そろそろ期末レポートや試験期間で忙しくなるので、しばらくはこのまま使い続ける予定です。

Hugoのインストール

今回はHomebrewを使ってHugoをインストールしました。ターミナルで以下のコマンドを実行します。

1
brew install hugo

インストールが完了したら、以下のコマンドでHugoのバージョンを確認します。

1
hugo version

新しいHugoサイトの作成

次に、新しいHugoサイトを作成します。ターミナルで以下のコマンドを実行します。

1
hugo new site <your-site-name>

<your-site-name>は任意のディレクトリ名に置き換えてください。これで、新しいHugoサイトのディレクトリが作成されます。この名前はGithubのリポジトリ名にも使いますが、外部には公開しないので、あまり気にしなくて大丈夫です。

サイトのディレクトリが作成されたら、そのディレクトリに移動します。

1
cd <your-site-name>

テーマの追加

Hugoには数多くのテーマが用意されています。今回はStackというテーマを使用します。テーマを追加するには、以下のコマンドを実行します。

1
2
git init # Gitリポジトリを作成
git submodule add https://github.com/rhazdon/hugo-theme-stack.git themes/stack # テーマをサブモジュールとして追加

実際のところ、git cloneすれば問題ないと言えば問題ないのですが、サブモジュールとして追加しておくと、テーマの更新があった場合に簡単に取り込むことができるので便利です。また、テーマを入れ替えたい時にも傷口が小さくて済みます。

次に、サイトの設定ファイルであるhugo.tomlを編集して、テーマを指定します。config/以下に分けて書く場合もあるようですが、今回はシンプルに一つのファイルにまとめておきます。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
baseURL = "https://<your-custom-domain>/" # 独自ドメインを設定
languageCode = "ja"
title = "My Tech Blog"
theme = "hugo-theme-stack" # フォルダ名と一致させる
copyright = "<your-name>" # フッターの著作権表記

# ページネーション(記事一覧の件数)
[pagination]
  pagerSize = 6

# ---------------------------------------------------------------------
# メニュー設定 (サイドバーのリンク)
# ---------------------------------------------------------------------
[[menu.main]]
  name = "Home"
  url = "/"
  weight = 1
  [menu.main.params]
    icon = "home" # アイコン名は https://icons.getbootstrap.com/ で確認可能

[[menu.main]]
  name = "Archives"
  url = "/archives/"
  weight = 2
  [menu.main.params]
    icon = "folder"

[[menu.main]]
  name = "GitHub"
  url = "https://github.com/<your-github-username>/"
  weight = 3
  [menu.main.params]
    icon = "brand-github"

[[menu.main]]
  name = "X (Twitter)"
  url = "https://x.com/" # XのURL
  weight = 4
  [menu.main.params]
    icon = "twitter"

# ---------------------------------------------------------------------
# Markdown設定 (数式・HTML・ハイライト)
# ---------------------------------------------------------------------
[markup]
  [markup.goldmark.renderer]
    unsafe = true # HTML埋め込み許可

  # 数式 ($$ ... $$) の設定
  [markup.goldmark.extensions.passthrough]
    enable = true
    [markup.goldmark.extensions.passthrough.delimiters]
      block = [['\[', '\]'], ['$$', '$$']]
      inline = [['\(', '\)'], ['$', '$']]

  [markup.highlight]
    noClasses = false
    codeFences = true
    guessSyntax = true
    lineNos = true
    style = "monokai" # コードの色テーマ(好きに変えられます)
    tabWidth = 4

# ---------------------------------------------------------------------
# Stack独自のパラメータ
# ---------------------------------------------------------------------
[params]
  customCSS = ["custom.css"]
  mainSections = ["post"]
  featuredImageField = "image"
  rssFullContent = true
  favicon = "./favicon/favicon.ico" # ★static/favicon.ico に画像を置いてください

  # 日付フォーマット
  [params.dateFormat]
    published = "2006/01/02"
    lastUpdated = "2006/01/02"

  # --- 左サイドバーの設定 ---
  [params.sidebar]
    emoji = ""
    subtitle = "技術のことについてつらつらと書いていきます"
    
    [params.sidebar.avatar]
      enabled = true
      local = true
      src = "img/icon.png" # ★static/img/icon.png に画像を置いてください

  # --- フッター ---
  [params.footer]
    since = 2025
    customText = "Made with Hugo & Stack"

  # --- 記事ページの設定 ---
  [params.article]
    math = true       # 数式ON
    toc = true        # 目次ON
    readingTime = true
    license = { enabled = true, default = "Licensed under CC BY 4.0" }

  # --- 右サイドバーのウィジェット ---
  [[params.widgets.homepage]]
    type = "search" # 検索窓

  [[params.widgets.homepage]]
    type = "archives" # アーカイブ
    [params.widgets.homepage.params]
      limit = 5

  [[params.widgets.homepage]]
    type = "categories" # カテゴリ
    [params.widgets.homepage.params]
      limit = 10

  [[params.widgets.homepage]]
    type = "tag-cloud" # タグクラウド
    [params.widgets.homepage.params]
      limit = 10

  # 記事ページには目次を表示
  [[params.widgets.page]]
    type = "toc"

以上になります。基本的にレイアウトや配色はhugo.tomlで設定できるので、CSSを直接編集する必要はあまりありません。

カラー設定の変更

Stackのデフォルトテーマは十分優れたデザイン性を持っていますが、今回は少し配色を変更したいと思い、カスタムCSSを追加しました。assets/scss/variables.scssというファイルが、’themes/hugo-theme-stack/‘ディレクトリ内にあります。これをコピーして、assets/scss/ディレクトリに貼り付けます。

中の変数を編集することで、テーマの配色を変更できます。ここからは沼なので、あまり深入りしないように注意しましょう。

Githubリポジトリの作成

Hugoサイトの準備が整ったら、次にGithubリポジトリを作成します。Githubのウェブサイトにアクセスし、新しいリポジトリを作成します。リポジトリ名はHugoサイトのディレクトリ名と一致させましょう。今回の記事ではGithubリポジトリを2つ使うので、このリポジトリをソースコード用と呼びます。

リポジトリを作成したら、ターミナルで以下のコマンドを実行して、ローカルのHugoサイトをGithubリポジトリにプッシュします。

1
2
3
4
5
git remote add origin <your-github-repo-url>
git branch -M main
git add .
git commit -m "Initial commit"
git push -u origin main

<your-github-repo-url>は、作成したGithubリポジトリのURLに置き換えてください。

独自ドメインの取得

今回はXserver Domainを使って独自ドメインを取得しました。Xserver Domainのウェブサイトにアクセスし、希望するドメイン名を検索して取得します。ドメインの取得が完了したら、次にGithub Pagesで使用するための設定を行います。

設定内容については、どのドメインを使いたいかによって異なります。

ルートドメインを使う場合

例えば、example.comを使いたい場合は、以下のDNSレコードを追加します。

タイプ名前TTL
A@185.199.108.1533600
A@185.199.109.1533600
A@185.199.110.1533600
A@185.199.111.1533600

サブドメインを使う場合

例えば、blog.example.comを使いたい場合は、以下のDNSレコードを追加します。

タイプ名前TTL
CNAMEblogusername.github.io.3600

usernameはGithubのユーザー名に置き換えてください。

ページ公開用のリポジトリの作成

次に、Github Pagesで公開するためのリポジトリを作成します。リポジトリ名は<your-github-username>.github.ioとします。このリポジトリを公開用と呼びます。

このリポジトリは、Hugoサイトの生成された静的ファイルを格納するために使用されます。公開用リポジトリを作成したら、次にローカルでHugoサイトをビルドし、生成されたファイルを公開用リポジトリにプッシュします。

1
2
3
4
5
6
7
8
hugo -D --destination ../<your-github-username>.github.io
cd ../<your-github-username>.github.io
git init
git remote add origin <your-github-io-repo-url>
git branch -M main
git add .
git commit -m "Initial commit"
git push -u origin main

<your-github-username>はGithubのユーザー名に、<your-github-io-repo-url>は公開用リポジトリのURLに置き換えてください。

Github Pagesの設定

最後に、Github Pagesの設定を行います。公開用リポジトリの設定ページにアクセスし、Pagesセクションで以下の設定を行います。

  • ソース: mainブランチ
  • フォルダ: / (root)
  • カスタムドメイン: 先ほど取得した独自ドメイン名(例: example.com または blog.example.com
  • Enforce HTTPS: チェックを入れる

DNSレコードの設定にはおよそ1日程度かかる場合があります。設定が反映されるまでしばらく待ちましょう。

## Github Actionsで自動デプロイ設定(おまけ)

Hugoサイトの更新を自動的にGithub Pagesに反映させるために、Github Actionsを設定します。ソースコード用リポジトリのルートディレクトリに.github/workflows/deploy.ymlというファイルを作成し、以下の内容を追加します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
name: github pages

on:
  push:
    branches:
      - main  # ソースコードがあるブランチ名(違えば変更してください)

jobs:
  deploy:
    runs-on: ubuntu-latest
    concurrency:
      group: ${{ github.workflow }}-${{ github.ref }}
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: recursive  # ★重要: Stackテーマを確実に持ってくる設定
          fetch-depth: 0

      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2
        with:
          hugo-version: 'latest' # ★重要: Stackは最新版が必要です
          extended: true         # ★重要: StackはSCSSを使うためextended版が必須です

      - name: Build
        run: hugo --minify

      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
          external_repository: <your-github-username>/<your-github-username>.github.io
          publish_branch: main   # ユーザーサイト(username.github.io)はmainブランチで公開されます
          publish_dir: ./public
          # CNAMEファイルも自動生成します
          # baseURLと合わせるため、ネイキッドドメイン(wwwなし)を推奨しますが
          # お好みで www.swimmy2611.com にしても動きます
          cname: <your-custom-domain>

<your-github-username>はGithubのユーザー名に、<your-custom-domain>は取得した独自ドメイン名に置き換えてください。

次に、公開用リポジトリにSSHデプロイキーを追加します。ターミナルで以下のコマンドを実行して、SSHキーを生成します。

1
ssh-keygen -t ed25519 -C "github-pages-deploy-key" -f gh-pages-deploy-key -N ""

これで、gh-pages-deploy-key(秘密鍵)とgh-pages-deploy-key.pub(公開鍵)の2つのファイルが生成されます。gh-pages-deploy-key.pubの内容をコピーし、公開用リポジトリの設定ページで「Deploy keys」セクションに移動して、新しいデプロイキーとして追加します。「Allow write access」にチェックを入れることを忘れないでください。

次に、gh-pages-deploy-keyの内容をコピーし、ソースコード用リポジトリの設定ページで「Secrets and variables」セクションに移動して、新しいシークレットとして追加します。名前はACTIONS_DEPLOY_KEYとします。

加えて、別のsshキーを作成し、公開鍵をソースコード用リポジトリのActionsに登録します。これについても同様に行います。

正常に設定が完了すれば、ソースコード用リポジトリにプッシュするたびに、自動的にHugoサイトがビルドされ、公開用リポジトリにデプロイされます。

おわりに

今回は備忘録として、今回このブログを立ち上げるまでに行った手順をまとめました。Hugoは非常に強力で柔軟なSSGであり、Github Pagesと組み合わせることで、簡単に独自ドメインでブログを公開できます。今後も技術的な内容を中心に記事を書いていく予定ですので、ぜひご期待ください。

出典

Made with Hugo & Stack
Hugo で構築されています。
テーマ StackJimmy によって設計されています。