WordPressを捨ててHugoに移行し、VPSからFirebase Hostingにサクッとお引越しする


この記事はどのAdvent Calendarにも属していません。
完成後のページは[こちら]( https://hsy.me/)

# 背景
5年ほど前に当時の流行（？）に乗ってVPSを借りてLAMP環境を構築し、WordPressでブログをホスティングしていたのですが、大して更新もしないサイトのために年間1万円をかけることや（アップデートや最低限の対策をしているとはいえ）毎日のようにセキュリティホールを突こうとする攻撃が来ることに辟易していました。

またVPS自体もOSのアップデートのタイミングを逃してCentOS6のままだったり、そもそもVPSを使う理由も今となっては無くなってしまったので、契約更新をせずに表題のようなお引越し作戦をすることにしました。

なお、実行環境はmacOSで、既にhomebrew / Python / Golang / node.js等の環境がインストールされていることを前提としています。

# メリットがありそうな人
- WordPressの多機能さをオーバースペックに感じている人
- 手軽に安全かつ爆速なサイトを作りたい人
- 普段からMarkdownを使っていて、かつ物書きの環境（エディタやデバイスなど）にこだわりがある人

# 用語の概要
細かいことは適宜ググっていただいて…
## [Hugo](https://gohugo.io/)
- 静的サイトジェネレータ。Golang製。
- Markdownで記事を書いて、ビルドするとHTML形式のサイトが吐き出されるので、それをデプロイする。
    - エンジニア界隈でちょっと流行っているようで、NetlifyやGithub Pagesなどでホスティングしている人もいます
    - 後から気付いたけど公式リファレンスにもFirebaseでのホスティング方法が[書いてあった](https://gohugo.io/hosting-and-deployment/hosting-on-firebase/)
- コメント欄はDISQUSを使うなどの工夫は必要だが、カスタムは比較的容易でリファレンスもある程度充実しているので、使いたいものを付け足したり、自分で作る感じになります。

## [Firebase Hosting](https://firebase.google.com/products/hosting/?hl=ja)
- Firebaseは、一言で言えばGoogle謹製の簡単になんでも作れる環境（MBaaS）
    - 凝ったことをやろうとすると嵌まることもあるけど、シンプルなことや手軽に済ませたい時に役立つ
- Firebase HostingはFirebaseの中の機能の一つで、静的サイトをホスティングすることに特化したサービス
    - GCPのCloud Storageも静的サイトのホスティングに使えますが、独自ドメインのSSL接続に対応していないので、現状ではFirebase Hostingのほうが用途としては向いています
- すごく便利な機能
    - 自分で取ったドメインでも自動でSSL化してくれる（証明書自体はLet's Encryptによるもの）
    - SSDキャッシュやCDNによる配信で爆速になりそうな雰囲気
- 無料枠だと容量1GB、月間転送量10GBまで
    - 個人の~~たいしてPVもないような~~ブログやWebサイトのホスティングなら十分
    - 業務利用やアルファな方は$25/月の定額制や従量制のプランのご検討を

# 手順
## 元のWordPressコンテンツのMarkdownへの変換
今あるWordPressのコンテンツ（記事）をMarkdownに変換します。
[公式](https://gohugo.io/tools/migrations/#wordpress)ではWordPress to Hugo Exporterをおすすめしていますが、私の環境ではうまくエクスポートできなかったので[ExitWP for Hugo](https://github.com/wooni005/exitwp-for-hugo)を使用しました。Python環境が必要になります。

```bash
$ git clone https://github.com/wooni005/exitwp-for-hugo.git
$ mv path/to/(WordPressでエクスポートしたXMLファイル) exitwp-for-hugo/wordpress-xml/
$ cd exitwp-for-hugo/
$ pip2 install --upgrade -r pip_requirements.txt
$ brew install libyaml build-essential
$ python exitwp.py
```

ここでエクスポートされたファイルは拡張子が`.markdown`なので、必要に応じて`.md`にリネームします。

```bash
$ for filename in *.markdown; do mv $filename ${filename%.markdown}.md; done
```

## Hugoのインストール
Hugoをクローンしてサイトの初期設定を行います。homebrewでインストールする場合は`brew install hugo`、`go get`を利用する場合は下記のコマンドを使用します。

```bash
$ go get -v github.com/spf13/hugo
```

次にサイトをセットアップします。ここでは`hoge`という名前にします。これで、ディレクトリ配下に`hoge`というディレクトリが作成され、各種ディレクトリや必要なファイルが配置されます。

```bash
$ hugo new site hoge
Congratulations! Your new Hugo site is created in /path/to/hoge.

Just a few more steps and you\'re ready to go:

1. Download a theme into the same-named folder.
   Choose a theme from https://themes.gohugo.io/, or
   create your own with the "hugo new theme <THEMENAME>" command.
2. Perhaps you want to add some content. You can add single files
   with "hugo new <SECTIONNAME>/<FILENAME>.<FORMAT>".
3. Start the built-in live server via "hugo server".

Visit https://gohugo.io/ for quickstart guide and full documentation.

$ tree hoge
hoge
├── archetypes
│   └── default.md
├── config.toml
├── content
├── data
├── layouts
├── static
└── themes
```

## テーマのインストール
初期状態では何のテーマもインストールされていないので、[テーマ一覧](https://themes.gohugo.io/)を見て気に入ったテーマをクローンしてきます。私のサイトでは[hugo nuo](https://github.com/laozhu/hugo-nuo)をカスタムして使用しました。

```bash
$ cd hoge/themes
$ git clone https://github.com/laozhu/hugo-nuo
```

## config.tomlの編集
使用するテーマやプラグインなどにもよりますが、下記のような設定を記述します

```yaml
baseURL = "https://hsy.me"
languageCode = "ja"
DefaultContentLanguage = "ja"
publishdir = "public"  # 公開用ディレクトリ（この名前を推奨）
contentdir = "content" # コンテンツのディレクトリ
title = "ページタイトル"
canonifyurls = true # 絶対パス指定
hasCJKLanguage = true # 記事の要約を正しく機能させるために必要
googleAnalytics = "GoogleAnalyticsを使用する場合はここにコードを記述"
```

## 記事の移行
先にExitWP for Hugoで変換した記事を`hoge/content/`配下に移動します。

この時、元の画像などのコンテンツはWordPressでホスティングされているURLになっているので、`hoge/static/`配下に適宜ディレクトリを切った上で配置し、パスを書き換えます。
（正直、テンプレートのカスタムの次に面倒な作業でした）

## プレビュー&ビルド
記事の確認は簡易サーバ機能を使うと便利です。`-t`オプションで使用しているテンプレート名を指定し、`-w`オプションで変更を即時プレビューできるようにします。これを打った後、`http://localhost:1313/`でページを確認できます。

```bash
$ hugo server -t hugo-nuo -w
```

プレビュー結果に問題が無ければサイトをビルドします。`hugo`コマンドでサイトがビルドされ、配下に`public`フォルダが出力されます。テーマが複数フォルダ内にある場合や出力するテーマを指定する場合はプレビュー時のように`-t`オプションを使用します。

```bash
$ hugo
$ tree -L 1
.
├── archetypes
├── config.toml
├── content
├── data
├── layouts
├── public <- これが公開用ディレクトリ
├── static
└── themes
```

## Firebase Hostingのセットアップ
いよいよデプロイ作業に入ります…が、その前にプロジェクトのセットアップを行います。

[Firebaseコンソール](https://console.firebase.google.com/u/0/?hl=ja)に移動し、「プロジェクトを追加」をクリック

「プロジェクト名」に好きなプロジェクト名を入れ、「国/地域」で「日本」を選択
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/182576/712c0a9c-5d47-104b-0780-f1554db9c3dc.jpeg)

コンソールが出てきたら、左メニューの「Hosting」をクリック
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/182576/9fa3ca18-26a4-b830-71f7-f076a2ef61eb.jpeg)


Firebaseツールをインストールします。npmが必要な場合は先にnode.jsのインストールを実行してください。

```bash
$ npm install -g firebase-tools
```

Firebaseツールでログインします。

```bash
$ firebase login
? Allow Firebase to collect anonymous CLI usage and error reporting information? （エラー収集に同意するかどうかを尋ねてきます）

Visit this URL on any device to log in:
（ブラウザが開くと思いますが、開かなければここに表示されるURLを開いてログインします）

Waiting for authentication...

✔  Success! Logged in as (ログインしたアカウント)
```

Firebaseプロジェクトをセットアップします。`hoge`ディレクトリ配下から`firebase init`コマンドを実行します。

```bash
$ firebase init

     🔥🔥🔥🔥🔥🔥🔥🔥 🔥🔥🔥🔥 🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥 🔥🔥🔥🔥🔥🔥🔥🔥     🔥🔥🔥     🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥
     🔥🔥        🔥🔥  🔥🔥     🔥🔥 🔥🔥       🔥🔥     🔥🔥  🔥🔥   🔥🔥  🔥🔥       🔥🔥
     🔥🔥🔥🔥🔥🔥    🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥   🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥
     🔥🔥        🔥🔥  🔥🔥    🔥🔥  🔥🔥       🔥🔥     🔥🔥 🔥🔥     🔥🔥       🔥🔥 🔥🔥
     🔥🔥       🔥🔥🔥🔥 🔥🔥     🔥🔥 🔥🔥🔥🔥🔥🔥🔥🔥 🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥     🔥🔥  🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥

You\'re about to initialize a Firebase project in this directory:

  /path/to/hugo/hoge

? Which Firebase CLI features do you want to setup for this folder? Press Space to select features, then Enter to confirm your choices. Hosting:
 ◯ Database: Deploy Firebase Realtime Database Rules
 ◯ Firestore: Deploy rules and create indexes for Firestore
 ◯ Functions: Configure and deploy Cloud Functions
 ◯ Hosting: Configure and deploy Firebase Hosting sites <-これを選択（カーソルキーで移動してSpaceキーで決定後にEnter）
 ◯ Storage: Deploy Cloud Storage security rules

=== Project Setup

First, let\'s associate this project directory with a Firebase project.
You can create multiple project aliases by running firebase use --add,
but for now we\'ll just set up a default project.

? Select a default Firebase project for this directory:  (プロジェクト名/プロジェクトID)

=== Hosting Setup

Your public directory is the folder (relative to your project directory) that
will contain Hosting assets to be uploaded with firebase deploy. If you
have a build process for your assets, use your build\'s output directory.

? What do you want to use as your public directory? public <- 初期設定がpublicフォルダなので、このままでOK
? Configure as a single-page app (rewrite all urls to /index.html)? Yes <- これも「y」でOK
? File public/index.html already exists. Overwrite? No <- ビルド後の場合はNo
i  Skipping write of public/index.html

i  Writing configuration info to firebase.json...
i  Writing project information to .firebaserc...

✔  Firebase initialization complete!
```

## Firebase Hostingにデプロイ
デプロイはコマンド一発です。簡単ですね。

```bash
$ firebase deploy
```

デプロイ後は「https://（プロジェクトID）.firebaseapp.com/」でホスティングされます。

## 独自ドメインの設定
Hostingのコンソールで「ドメインを接続」をクリックし、設定したいドメイン名を入力します。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/182576/a78b9756-b95b-5630-2a41-8a9172dd5a39.jpeg)

次に進むと、初めてのセットアップの場合は所有者確認のために追加するTXTレコード名が表示されるので、手持ちのドメイン業者の管理画面を開いてTXTレコードを追加します。30分もしないくらいで所有権は確認されると思います。

所有権が確認されると、追加すべきFirebaseのAレコードのIPアドレス2個が表示されるので、TXTレコードと同様にドメインの管理画面からAレコードを追加します。
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/182576/490c86ad-33d7-f187-4dd6-2ca72a469273.jpeg)

Google側で検証が終わるとSSL証明書が適用され、SSL接続が有効になります（それまでは**「この接続ではプライバシーが保護されません」画面が表示されてしまう**ことに注意が必要です）。有効になるまでの時間は24〜48時間と言われていますが、だいたい半日くらいで適用されるような印象です。

# おわりに
WordPressからの記事インポートや修正、Hugoテーマのカスタムに時間がかかった以外はコマンドを数個叩くだけ、あるいはマウスでポチポチするだけで簡単に移行できるかと思います。

特に、キャッシュやCDN配信が無料で利用でき、さらに独自ドメイン下で無料かつ自動でSSL証明書のプロビジョニングがなされる点は、自力で設定して苦労したことのある人は特にメリットに感じられるのではないでしょうか。

今後はHugoテーマのカスタマイズやビルド環境の自動化などをしてみたいと思います。