MeilisearchをGoogle Compute Engineにデプロイして独自ドメインを設定する
はじめに
Firebaseで全文検索を実装するために調査していたところ、Meilisearchというオープンソースを見つけました。調べてみるとこのMeilisearchが良さそうだったため、Google Compute Engine上にデプロイし、独自ドメインを設定して動作確認してみました。その手順をメモします。 ちなみに、Meilisearchのリポジトリを見てみると、2022年9月時点でスター数も29kほどありかなりの人気でアップデートも頻繁で開発が活発に行われている印象です。JavascriptやPython、Ruby、さらにFlutter用のパッケージも公式で用意されています。
A lightning-fast search engine that fits effortlessly into your apps, websites, and workflow.
前提と環境
- 課金が有効になっているGoogleアカウントを持っていること
- ドメインを持っていること
以下の公式ドキュメントに従って作業します。
Using our GCP custom image, Meilisearch can be deployed on GCP in just a few minutes.
作業の流れ
作業の流れは以下のようになります。 Meilisearchが公式のGoogle Compute Engine用イメージを用意しているため、それを使用します。
Google Cloud Platformでの作業
- Meilisearch用のイメージをインポートする
- Meilisearchのインスタンスを作成する
ドメインプロバイダでの作業(独自ドメインを使用する場合のみ)
ドメインプロバイダで作成したインスタンスのIPと独自ドメインのレコードを登録しておきます。独自ドメインを使用しない場合はこの作業は不要です。
- Aレコードを設定する
Meilisearchインスタンス上での作業
Google Compute Engineで作成したMeilisearchインスタンスにSSH接続して、以下の作業をおこないます。
- Meilisearchの初期設定を行う
Google Cloud Platformでの作業
Meilisearch用のイメージをインポートする
Google Compute Engine用のMeilisearch公式イメージが用意されているためそれをインポートして使えるようにします。
以下のように、Compute Engineの左側のサイドメニュー内の「イメージ」をクリックし、表示されたページ内の「イメージを作成」をクリックします。
以下のようにイメージのインポート機能について「付与」をクリックします。
上記の「付与」をクリックして以下のように赤背景のメッセージが表示された場合は、メッセージの指示通りにCloud Buildを有効にしてから再度「付与」を実行します。(Cloud Buildの有効化方法は本記事の最後に補足として載せています。)
最終的には、以下の状態で「作成」をクリックします。以下の「仮想ディスクファイル」の部分に指定するファイル名(画像内のmeilisearch-image/meilisearch-v0.28.0-debian-10.vmdk
)は、本記事の「前提と環境」の中で記載したMeilisearchの公式ドキュメント内に記載されているものをコピー&ペーストして指定してください。
「作成」をクリックすると、以下の画面に遷移して、作成中状態になります。作成完了までおおよそ5、6分ほどかかりました。もしステータス欄のローディングアイコンが時間経過しても消えない場合は、一旦ブラウザのリロードでページ再読み込みしてみた方がいいかもしれません。
以上でMeilisearch用のイメージのインポートが完了です。
Meilisearchのインスタンスを作成する
インポートしたMeilisearchのイメージを使ってGoogle Compute Engineのインスタンスを作成します。
以下のように、Google Compute Engineのサイドメニューの「イメージ」のページを再度開いて、インポートしたMeilisearchのイメージをクリックします。私の場合はインポートしたイメージ名をmeilisearch-image-1
としたので、これをクリックします。
以下のような画面が表示されるので、「インスタンスを作成」をクリックします。
「インスタンスを作成」をクリックすると、以下のように作成するインスタンスの設定画面に遷移します。ここでは各自の状況に合わせて項目を設定します。
私は以下のようにしました。メモリが大きいほど検索に対する応答速度も速くなるようです。
次に同じページで以下のように「ブートディスク」という項目があるので、ここの「変更」をクリックします。
「変更」をクリックすると以下のようにブートディスクの設定パネルが展開するので、ここで
「カスタムイメージ」タブで「イメージ」部分に前節でインポートしたMeilisearchのイメージが指定されていることを確認して「選択」をクリックします。
「選択」をクリックするとパネルが閉じるので、最後に「ファイアウォール」部分の2つにチェックを入れて、「作成」をクリックします。
これでMeilisearch用のインスタンス作成が完了です。
なお、Meilisearch用のインスタンスが正常に作成できているかは自分のPCでcurl
コマンドを実行して確認できます。your_ip
部分は、作成したインスタンスの外部IPに置き換えてください。外部IPは、上記画像内のインスタンス名の並びに表示されていると思います。
$ curl http://your_ip/health
{"status":"available"}
上記のように{"status":"available"}
と表示されれば無事にMeilisearch用のインスタンス作成が完了し、稼働しています。
ドメインプロバイダでの作業(独自ドメインを使用する場合のみ)
Aレコードを設定する
続いて作成したMeilisearch用のインスタンスに独自ドメインを割り当てます。
私は今回Google Domainsで取得したnanolog.app
というドメインを使うため、以下のようにGoogle Domainsの管理画面からAレコードを追加しました。以下のAレコードを設定することで、search.nanolog.app
を使って今回作成したMeilisearchのインスタンスにアクセスできるようになります。34.100.200.300
は作成したMeilisearch用の外部IPに置き換えてください。
ドメインが反映されるまで少し時間がかかるかもしれませんが、自分のPCなどで以下のdig
コマンドを実行して反映されたかを確認できます。
$ dig A nanolog.app
もしくは以下のようにcurl
コマンドでドメイン設定の完了を確認できます。
$ curl -v http://search.nanolog.app/health
以下のようにレスポンスが帰ってくればOKです。
curl -v http://search.nanolog.app/health
* Trying 34.100.200.300:80...
* Connected to search.nanolog.app (34.100.200.300) port 80 (#0)
> GET /health HTTP/1.1
> Host: search.nanolog.app
> User-Agent: curl/7.77.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx/1.14.2
< Date: Thu, 01 Sep 2022 23:47:30 GMT
< Content-Type: application/json
< Content-Length: 22
< Connection: keep-alive
< vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers
< access-control-allow-origin: *
<
* Connection #0 to host search.nanolog.app left intact
{"status":"available"}%
以上でドメインの設定が完了です。
Meilisearch用インスタンス上での作業
Meilisearchの初期設定を行う
作成したMeiliserachインスタンスにSSH接続すると、以下のように表示されます。
(Google Compute EngineのインスタンスへのSSH接続方法はこちら)
このインスタンスをproduction
環境(本番環境)で使うか確認されるので、y
と入力してEnterを押します。
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Thank you for using Meilisearch.
This script will help you to set up some basic configuration.
Do you wish to use Meilisearch in a PRODUCTION environment [y/n]?y
すると以下のように表示されて次にMEILI_MASTER_KEY
(マスターキー)を自身で設定するかを確認されます。ここでは、n
にして自動生成します。
Do you wish to use Meilisearch in a PRODUCTION environment [y/n]? y
Meilisearch will be run in a PRODUCTION environment
MEILI_MASTER_KEY must be set for PRODUCTION
Front-end integrated dashboard will be disabled for PRODUCTION
Do you wish to specify your MEILI_MASTER_KEY (otherwise it will be generated) [y/n]?n
n
でEnterを押下すると以下のようにマスターキーが自動生成されます(以下のKSjeon19dn3Ls93nFNl349FNS93nkljasIk39fnsa
がマスターキー)。このマスターキーを使って、外部からのアクセス用のAPIキーを作成したり、削除したりするために使用します。マスターキーはどこにも公開しないよう慎重に扱う必要があります。
Do you wish to specify your MEILI_MASTER_KEY (otherwise it will be generated) [y/n]? n
Your MEILI_MASTER_KEY is KSjeon19dn3Ls93nFNl349FNS93nkljasIk39fnsa
You should keep it somewhere safe.
続いてドメインを設定するか確認されるので、ここではy
として設定を進めます。
Do you wish to setup a domain name [y/n]? y
What is your domain name?
の後に設定したい自身の独自ドメインを入力し、Enterを押下します。
What is your domain name? search.nanolog.app
続いてSSLの設定をするか確認されるのでy
でEnterを押下してSSLの設定を進めます。
Do you wish to setup ssl with certbot (free and automated HTTPS) [y/n]?y
以下のようにcertbot
によるSSL設定が開始されて完了します。
Do you wish to setup ssl with certbot (free and automated HTTPS) [y/n]? y
--- OK, now we will set up Meilisearch for you! ---
---------------------
Your MASTER KEY is set to KSjeon19dn3Ls93nFNl349FNS93nkljasIk39fnsa
Keep it somewhere SAFE!
---------------------
Ok! Cool we'll setup SSL with Certbot
Configuration is over. Thanks
-----------------------------------------------------------------
If you want to run this script again, run the following command:
meilisearch-setup
----------------------------------------------------------------
完了後に自分のPCから以下のようにcurl
を実行して以下のように表示されれば完了です。
curl -v https://search.nanolog.app/health
* Trying 34.100.200.300:443...
* Connected to search.nanolog.app (34.100.200.300) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/cert.pem
* CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-CHACHA20-POLY1305
* ALPN, server accepted to use http/1.1
* Server certificate:
* subject: CN=search.nanolog.app
* start date: Sep 1 23:18:02 2022 GMT
* expire date: Nov 30 23:18:01 2022 GMT
* subjectAltName: host "search.nanolog.app" matched cert's "search.nanolog.app"
* issuer: C=US; O=Let's Encrypt; CN=R3
* SSL certificate verify ok.
> GET /health HTTP/1.1
> Host: search.nanolog.app
> User-Agent: curl/7.77.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx/1.14.2
< Date: Fri, 02 Sep 2022 00:19:03 GMT
< Content-Type: application/json
< Content-Length: 22
< Connection: keep-alive
< vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers
< access-control-allow-origin: *
<
* Connection #0 to host search.nanolog.app left intact
{"status":"available"}%
以上でMeiliserach用のインスタンスに独自ドメインの割り当てとSSL設定が完了し、Meilisearchを使えるようになりました。 後は実際にWebサイトやスマートフォンアプリから作成したMeilisearchへリクエストを投げて使います。
なお、Meilisearchは初期状態では保護されておらず、誰からでもアクセスを受け付ける状態になっています。実際のサービスでは認証ユーザのみに使用許可したい場合が多いと思います。この場合は、別途APIキーを作成、設定する必要があります。 これについては以下に別途まとめました。
認証ユーザにのみMeilisearchの使用を許可して保護するためには、Meilisearchのマスターキーの設定とAPIキーの作成が必要になります。この手順をまとめます。
補足
Cloud Build を有効にする手順
Google Cloud Platformのサイドメニューの中にある「APIとサービス」→「ライブラリ」をクリックします。
以下のように「cloud build」と検索し、表示された「Cloud Build API」をクリックします。
以下のページが表示されるので、「有効にする」をクリックします。
以上でCloud Buildの有効化が完了です。もしCloud Build以外にも有効化が必要なサービスがあれば、同じ手順で有効化できると思います。
まとめ
全文検索のためにMeilisearchをGoogle Compute Engineにデプロイする手順をまとめました。Google Compute Engine以外にも、Digital OceanやAWS、Azureでのデプロイ手順も公式ドキュメントに記載されています。
関連記事
- 公開日:2022/09/11 更新日:2022/09/11
Google Compute EngineのインスタンスにSSH接続できなくなった時の対処方法
Google Compute EngineのインスタンスにSSH接続できていたのにSSHの設定ミスや原因不明でSSH接続できなくなった時の対処方法をメモします。自分のPCからだけでなく、Google Cloud Platform上での管理画面からもSSHできない場合にも有効です。
- 公開日:2022/09/09 更新日:2022/09/09
Meilisearchを認証ユーザのみ使用できるようAPIキーを設定する
認証ユーザにのみMeilisearchの使用を許可して保護するためには、Meilisearchのマスターキーの設定とAPIキーの作成が必要になります。この手順をまとめます。
- 公開日:2022/09/08 更新日:2022/09/08
Google Compute EngineのインスタンスにSSH接続する
Google Compute Engineのインスタンスにssh接続するための手順をまとめます。