blogのバックエンドをWordPress@AWS-EC2からhugo@AWS-S3に切り替えました。
WordPressはバージョンアップやプラグインの更新が煩雑なのと MySQLのバックアップ・管理が手間だったので、 hugoに切り替えることでこれらが不要となり、かなり満足です。
hugoのセットアップとアップロードの手順をまとめておきます。
hugoのセットアップ
インストール
自分の生活環境はMacなんでhomebrew
でhugoをインストールしました。
1$ brew install hugo
サイトの作成
hugoをインストールすると、hugo
コマンドが利用できるようになります。
hugo new site <ディレクトリ名>
はサイトを構築するのに必要最低限の設定とディレクトリを作成します。
1$ hugo new site my_site
2Congratulations! Your new Hugo site is created in /path/to/my_site.
3
4Just a few more steps and you're ready to go:
5
61. Download a theme into the same-named folder.
7 Choose a theme from https://themes.gohugo.io/ or
8 create your own with the "hugo new theme <THEMENAME>" command.
92. Perhaps you want to add some content. You can add single files
10 with "hugo new <SECTIONNAME>/<FILENAME>.<FORMAT>".
113. Start the built-in live server via "hugo server".
12
13Visit https://gohugo.io/ for quickstart guide and full documentation.
テーマの適用
hugoはかなり多くのテーマがあるので、Hugo Themesから好みのテーマをピックアップしました。 自分はuBloggerにしています。
適用方法はテーマのインストール手順の通り、以下を実行。
terminfo1$ cd /path/to/my_site
2$ git submodule add https://github.com/upagge/uBlogger.git themes/uBlogger
適用はこれだけなんで、かなり簡単です。
基本設定
hugoで生成したサイトの設定ファイルは、ディレクトリ直下のconfig.tomlです。 詳細な設定内容はこちらを参照してください。
最終的に、こんな感じに落ち着きました。
toml 1baseURL = "https://blog.ohr486.net/"
2languageCode = "ja"
3title = "ohr486's blog"
4
5# この設定を入れないと、サマリが長くなりすぎてしまう
6# CJK=Chinese,Japanese,Koreanの略らしい、しらなかった
7hasCJKLanguage = true
8
9# テーマ
10theme = "uBlogger"
11
12[params]
13 # uBloggerのバージョン、gitのsubmoduleでインストールしたので対象のタグに合わせている
14 version = "2.0.X"
15
16 [params.page]
17 # SNSボタンはTwitterとFacebookを指定
18 [params.page.share]
19 enable = true
20 Twitter = true
21 Facebook = true
22
23# ヘッダに記事一覧、タグ、カテゴリメニューを追加
24[menu]
25 [[menu.main]]
26 identifier = "posts"
27 name = "Posts"
28 url = "/posts/"
29 weight = 1
30 [[menu.main]]
31 identifier = "tags"
32 name = "Tags"
33 url = "/tags/"
34 weight = 2
35 [[menu.main]]
36 identifier = "categories"
37 name = "Categories"
38 url = "/categories/"
39 weight = 3
40
41[markup]
42 [markup.highlight]
43 codeFences = true
44 guessSyntax = true
45 # uBloggerのテーマを利用する際は必ずnoClassesをfalseにする必要があります
46 noClasses = false
記事の作成
記事を追加する場合はhugoコマンドを使って以下の様に実行します。
terminfo1$ hugo new <ディレクトリ名>/<記事名>.md
このコマンドでcontent配下の指定したディレクトリにmdファイルが作成されます。
自分は設定ファイルで記事のパスを/posts/
としているのでディレクトリ名はposts
にしました。
ローカルサーバーの起動
作成した記事は、hugo server
で起動したテストサーバーで確認できます。
よく利用するオプションは以下です。
オプション | 効果 |
---|---|
-w | ファイルの変更を自動検知 |
-D | ドラフト記事(draft=true)も対象にしてページを作成 |
–disableFastRender | キャッシュを無効化 |
-F | 未来の日付のページも作成 |
以下の様にテストサーバーを起動して、http://localhost:1313
にアクセスするとサイトが確認できます。
1$ hugo server -w -D --disableFastRender -F
コンテンツ生成
テストサーバーで問題なければhugo
コマンドで静的なHTMLファイルを出力できます。
1$ hugo
2Start building sites …
3
4 | EN
5-------------------+-----
6 Pages | 7
7 Paginator pages | 0
8 Non-page files | 0
9 Static files | 88
10 Processed images | 0
11 Aliases | 1
12 Sitemaps | 1
13 Cleaned | 0
14
15Total in 160 ms
デフォルトだとカレント直下のpublic
ディレクトリが生成され、そこにファイルが出力されます。
1$ ls public
2404.html categories css img index.html index.xml js lib page sitemap.xml tags
AWSのセットアップ
ホスティング&デプロイ
hugoで生成したコンテンツのホスティング方法は、公式サイトのHosting&Deploymentにまとまっています。
Netlifyにホスティングするのがおすすめらしいのですが、
自分はAWSのS3
を使ってホスティングする事にしました。
S3のセットアップ
当然ですがS3のバケットを作成する必要があります。
自分はterraformでプライベートのAWSのリソースを管理しているので
s3のtfファイル
を作ってterraform plan & apply
でバケットを作成しました。
deployment
deploymentの設定はconfig.toml
に以下の様に記載しました。
1[deployment]
2 [[deployment.targets]]
3 name = "blog.ohr486.net"
4 URL = "s3://<作成したバケット名>?region=ap-northeast-1"
5
6 [[deployment.matchers]]
7 pattern = "^.+\\.(js|css|svg|ttf)$"
8 cacheControl = "max-age=31536000, no-transform, public"
9 gzip = true
10
11 [[deployment.matchers]]
12 pattern = "^.+\\.(png|jpg)$"
13 cacheControl = "max-age=31536000, no-transform, public"
14 gzip = false
15
16 [[deployment.matchers]]
17 pattern = "^sitemap\\.xml$"
18 contentType = "application/xml"
19 gzip = true
20
21 [[deployment.matchers]]
22 pattern = "^.+\\.(html|xml|json)$"
23 gzip = true
deployment設定を記載したら、
terminfo1$ hugo deploy --dryRun
でdryRun、
terminfo1$ hugo deploy
でデプロイできます。
注意点ですが、作成した記事がドラフト(draft: true
)の場合、当然deploy対象にならないので、
ドラフト状態を解除(draft: false
)しておく必要があります。
コンテンツ生成してdeployした結果は以下。
terminfo 1$ hugo
2Start building sites …
3
4 | EN
5-------------------+-----
6 Pages | 16
7 Paginator pages | 0
8 Non-page files | 0
9 Static files | 88
10 Processed images | 0
11 Aliases | 5
12 Sitemaps | 1
13 Cleaned | 0
14
15Total in 156 ms
16$ hugo deploy
17Deploying to target "blog.ohr486.net" (s3://blog.ohr486.net?region=ap-northeast-1)
18Identified 108 file(s) to upload, totaling 3.0 MB, and 0 file(s) to delete.
19Success!
20Success!
まとめ
WordPressからhugoに切り替えました。 使ってみた感想としては、かなり軽量でコンテンツのジェネレートがちょっぱやなので快適です。 CI化やコメント機能の追加等まだまだやる事は残ってるのですが、一旦記事をポストできるところまでできたので終了。