NuxtのStatic Site Generationで作った個人デモ用サイトをQoveryにデプロイして動かす

# 概要

このエントリでは、個人デモ用サイトをQoveryにデプロイして動かしてみた話を紹介します。

## 想定読者

このエントリは、以下のニーズがある方を対象としています。

- 自分で書いたコードのデモを動かすサイトをどこかでホストしてほしい、というニーズがある
- サイトは（今時なので）HTTPSがいい
- Qoveryって何？という方

# TL;Dr;

以下ができました。

- （今（2021年10月）のところ無料の範囲で）JavaScriptで書いたコードの個人デモ用サイトを立ち上げる
- 独自ドメインでHTTPSでアクセス
- GitHubでコードを変更するとサイトも自動でビルドされて更新

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/705e8539-5193-936a-e25d-c8c0d9c8f21a.png)


# エントリの動機

別エントリ「[FizzBuzz を処理できるSchemeっぽい処理系をJavaScriptで書いてみる](https://qiita.com/hrkt/items/c469d598716ebe94d2ea)」で紹介したようなプログラムを書いているのですが、JavaScriptで書いていることもあり、WEB上でもお試しできるようにしたいと思っていました。

以下の理由で、[NuxtのStatic Site Generation](https://nuxtjs.org/docs/concepts/static-site-generation/)でデモサイトを作ることにしました。

- JavaScriptのコードを動かすだけなのでWEBサイトはクライアント側で完結するもので充分、だけどもしかするとAPIも書きたくなるかもしれないのでサーバ側も作れそうな構えにしておきたい
- 動かしたいコード以外は、何かのテンプレートを使ってでラクをしたい、それ以外もいろいろラクしたい
- Next.jsでもNuxt.jsでもStatic Site Generationができるので、ここは__使ったことがなかったNuxtを使ってみたい__

[Nuxtのサイトの「Integrations」 ](https://nuxtjs.org/integrations/)のページには、Nuxtで書いたものを動かす先の例として20個以上上がっていたりしますが、このエントリでは[Qoveryを使う場合の方法](https://nuxtjs.org/integrations/deployments/qovery/)に従って進めてみることにします。

## 補足

前述の理由だけだと、ファイルを置いておくだけの普通のホスティングサービス（例えばGitHub Pagesとか）お手軽なのではないか、という気もしますが、"サーバ側も作れそうな構えにしておきたい"といったあたりの理由でその方法はとりませんでした。現時点のデモだけでいうと、全然十分だったりはするんですが。


# 説明

基本的な流れは、前述のNuxtのサイトの[Qoveryを使う場合の方法](https://nuxtjs.org/integrations/deployments/qovery/)の通りです。記事執筆時点のページの一部を下記に引用します。


|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/d8a081a3-b0ff-3ec1-99d1-e2ed281ab649.png)|
|:---|

以下、上記サイトの流れに従って進めます。

## Qoveryにアカウントを作る

([Nuxtのサイトの記載はこちら](https://nuxtjs.org/integrations/deployments/qovery/#1-create-a-qovery-account))

筆者はQoveryのアカウントを持っていなかったため、新規にアカウントを作りました。

### GitHubアカウントと連携する

今回作っているサイトの資源はGitHubに格納してあるため、GitHub連携の方を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/2caa13a1-1142-919b-4535-e627f5242693.png)

### 認可する範囲を決める

記事執筆時点では、下記に引用するアクセス権が求められました。readはいいとしてwriteはちょっと。。。とも思いましたが、ここは勇気と好奇心をもってAuthorizeしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/0472943b-f6c1-b77e-c052-3788101497c1.png)

### プラン

Qoveryのアカウント作成時は、以下2つから選択できます。このエントリでは「Free Hosting」で進めます。

- Deploy on your cloud account
- Free Hosting

(補足：Deploy on your cloud accountの方は、ざっくり理解では、Herokuみたいな使い勝手で、バックエンドをAWSとかの自分の環境に置けちゃう感じ、です。アプリをいろいろな環境にデプロイ、という観点ではTerraform的でもあります。比較観点は、Qoveryのサイトにそれぞれ記述がありました。[vs Heroku](https://hub.qovery.com/docs/getting-started/qovery-vs-other/heroku/), [vs Terraform](https://hub.qovery.com/docs/getting-started/qovery-vs-other/terraform/) Terraformは、"vs"ではなくて、"on top of"に作ってあって、目線がAP開発者とかユーザ寄り、な感じです。[vs Netlify](https://hub.qovery.com/docs/getting-started/qovery-vs-other/netlify/)の観点で言うと、まあ似てるっちゃ似てるんですが、バックエンドを自分のAWSアカウントで作れるというところで違いが出てきそうです。)

"Free"なものの常ですが、いつまでも無料であることを保証するものではない、とのこと。
（このエントリは、2021年10月時点のものであることにご注意ください）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/6c7151b8-b77f-9224-db7e-d3ec5ff40f4e.png)

### Organizationの作成

アカウントを大きく分ける単位であるところの「Organization」を作ったら、アカウント作成はおしまいです。説明文を入れる程度の作業でした。

## Projectを作る

([Nuxtのサイトの記載はこちら](([Nextのサイトの記載はこちら](https://nuxtjs.org/integrations/deployments/qovery/#1-create-a-qovery-account))
))

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/019c3d41-8922-466d-1e6b-a64284c1d093.png)

「Create new project」を押して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/a15a32da-97d0-4025-b1c6-64df434c436b.png)

名前をつければおしまいです。

Projectの中には、Environmentを作り、その中にApplicationを作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/2edf3b72-90ee-4081-5b94-5c173a98adea.png)

「Create Environment」を押して名前を付けると、Environmentが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/8ba38453-61d5-ebdd-a914-9098509ca58c.png)

これで、Applicationをデプロイする準備ができました。

## Applicationをデプロイする

([Nextのサイトの記載はこちら](https://nuxtjs.org/integrations/deployments/qovery/#3-add-an-application))

### Applicationが格納されたリポジトリとブランチを選ぶ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/0bf05e37-4da3-d649-ee79-fe8f3688861f.png)

このエントリでは、「[hrkt/fbs-web](https://github.com/hrkt/fbs-web)」というリポジトリに格納されたWEBアプリ（で出力される静的サイト）を対象としています。

デプロイに使うビルドツールは、「[Buildpacks](https://buildpacks.io/)」または「[Dockerfile](https://www.docker.com/)」が選択できます。このエントリではDockerfileを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/9148e865-a10a-642b-c8b3-5d57b9f463a1.png)

## Dockerfile、Port

([Quveryのサイトにあったサンプル](https://hub.qovery.com/guides/tutorial/how-to-deploy-nuxtjs/#deploy-your-nuxtjs-app)を参考にしつつ)下記のようなDockerfileを書きました。2ステージのビルドにしてあり、ステージ1では、Nuxtで書いたWEBアプリを静的ファイルにgenerateします。ステージ2では、generateしたファイルを[Nginx](https://www.nginx.com/)のcontent-rootにコピーして、コンテナ起動時にNginxが起動するようにしています。

```Dockerfile
### STAGE 1: Build ###
FROM node:14-alpine as build

RUN mkdir -p /usr/src/nuxt-app
WORKDIR /usr/src/nuxt-app

RUN apk update && apk upgrade

COPY . /usr/src/nuxt-app
RUN npm install --silent

RUN npm run generate

### STAGE 2: NGINX ###
FROM nginx:stable-alpine

COPY --from=build /usr/src/nuxt-app/dist /usr/share/nginx/html

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/70302cb9-26fc-21d3-5cbb-ccccb37957ee.png)

コンテナの記述に合わせ、この設定でQoveryのサービス間に公開するポートを指定します。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/8cec27a8-9dbe-e5e2-bbdf-8574488d0cdb.png)

「Create」を押すと、Applicationの定義ができます。

### デプロイ前の設定

#### 公開ポート

アプリケーションからインターネットに公開するポートを設定します。
（注：エントリ執筆時点ではここがいまいちよくわかっていないのですが、"80"を指定しておくと、qoveryのリリバースプロキシでHTTPS側にリダイレクトしてくれる動きに見えます。フリーのホスティングならではの設定なのかもしれません。AWSに配備するときなどはまた違うのかも、と思いつつ、動いているのでこれで良しとしました。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/c0d69de6-abab-b491-4370-92e55cb287af.png)

#### カスタムドメインの設定

([Nuxtのサイトの記載はこちら](https://nuxtjs.org/integrations/deployments/qovery/#custom-domains))

Applicationを公開ポート付きでデプロイすると、デフォルトで「https://xxxxxx.qovery.io」のURLでインターネットからアクセスできるようになります。それに加えて、独自ドメイン名でのアクセスにも対応することができます。（独自ドメインのDNSの設定は、筆者はDNS業者側のサイトで実施しました。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/8419c991-aec2-ce90-6ea4-3146c32c4d21.png)

ApplicationにアクセスするためのURLは、Applicationの設定メニュー中の「Open」からも確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/7989aa64-94ad-cd1e-9cec-f7e154178298.png)

### デプロイ

#### 実行

ここまでの準備ができれば、あとはメニューの「ACTIONS」から「Deploy」を選べば、一連の作業が始まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/504b6fa0-f280-ecbd-4690-6405e440fc5f.png)

#### しばらく待つ

作ったデモアプリのビルドにはそれなりに時間がかかるので、ログを鑑賞したりコーヒーを取りに行ったりして待ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/9a7dab4f-a8fa-43df-9ccb-c494bb04b204.png)

#### カスタムドメインのさらにしばらく待つ

([Nuxtのサイトの記載はこちら](https://nuxtjs.org/integrations/deployments/qovery/#custom-domains))

カスタムドメイン側の設定もQoveryが実施してくれるので、反映までしばらく待ちます。
証明書は、Qoveryが、[Let's Encrypt](https://letsencrypt.org/)を使って作ってくれます。便利。

（注）このステップは、反映されるまで、気を長く待ちましょう。デプロイ直後、独自ドメイン用の証明書の更新が終わっていない状態でも独自ドメインからアクセスすることもでき（xxxx.qovery.io側では証明書は有効な情チア）ますが、ブラウザの見た目上「安全でないサイト」になる時期があります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/06c02a7c-40bc-e30b-5e24-027b8fab6c33.png)



# おわりに

本エントリでは、Nuxtで作った静的サイトをPaaSの"Qovery"でホスティングした手順について紹介しました。

少ない手間でデモサイトが作れたので、個人的には満足な試行でした。

## 参照先

- [Qovery](https://www.qovery.com/)
- [本エントリで使ったWEBサイトのGitHubリポジトリ](https://github.com/hrkt/fbs-web)
- [本エントリの結果として出来上がった個人デモサイト](https://fbs-web.beambitious.info/)