oinume journal

Scratchpad of what I learned

HasuraをDokku上で動かす

VPS上にDokkuを構築したので、そこにHasuraを動かしてみるテスト。Hasuraとは簡単に言うとPostgreSQLのテーブルスキーマからGraphQLサーバーを構築してくれるミドルウェア。

前提として、Dokkuはすでに構築済みとする。(自分の場合はUbuntu 22.04 上にDokku 0.32.3を構築済み)

手順

まずは最初にhasuraという名前のアプリケーションを作成する

$ dokku apps:create hasura

次に、HasuraのためのPostgreSQL databaseを建てる。

$ dokku postgres:create hasura-db
       Waiting for container to be ready
       Creating container database
       Securing connection to database
=====> Postgres container created: hasura-db
=====> hasura-db postgres service information
       Config dir:          /var/lib/dokku/services/postgres/hasura-db/data
       Config options:
       Data dir:            /var/lib/dokku/services/postgres/hasura-db/data
       Dsn:                 postgres://postgres:<redacted>@dokku-postgres-hasura-db:5432/hasura_db
       Exposed ports:       -
       Id:                  272a6f8b722310887317b3d7e10821ed3cfcc88dae7911945c10590be338c09c
       Internal ip:         172.17.0.4
       Initial network:
       Links:               -
       Post create network:
       Post start network:
       Service root:        /var/lib/dokku/services/postgres/hasura-db
       Status:              running
       Version:             postgres:15.4

上で構築したhasura-dbをhasuraアプリケーションにリンクする。ただし、この時点ではまだhasuraはアプリケーションの設定がされていないのでApp image (dokku/hasura:latest) not foundのエラーが出るけどOK。

$ dokku postgres:link hasura-db hasura
-----> Setting config vars
       DATABASE_URL:  postgres://postgres:<redacted>@dokku-postgres-hasura-db:5432/hasura_db
-----> Restarting app hasura
 !     App image (dokku/hasura:latest) not found

次にhasura向けの環境変数を設定する。HASURA_GRAPHQL_DATABASE_URLで指定するDSNは上のコマンドで得られたDATABASE_URLをコピーしてくる。また、your_admin_secretはパスワードみたいなものなので、ランダム文字列にするのが良い。

$ dokku config:set hasura \
 HASURA_GRAPHQL_DATABASE_URL="postgres://postgres:<redacted>@dokku-postgres-hasura-db:5432/hasura_db" \
 HASURA_GRAPHQL_ADMIN_SECRET="your_admin_secret" \
 HASURA_GRAPHQL_ENABLE_CONSOLE="true" \
 HASURA_GRAPHQL_SERVER_PORT=5000

次にhasuraアプリケーションのためのdocker imageをpullしてくる。

$ docker pull hasura/graphql-engine:v2.36.1
FAIL

上のコマンドを実行するユーザーがdockerグループに所属していないと権限がなくてpullできないので、自分の場合はdokkuユーザーになってpullした。

$ sudo su - dokku
$ docker pull hasura/graphql-engine:v2.36.1

そして最後に dokku git:from-imageコマンドでhasuraアプリケーションにpullしてきたimageを指定してアプリケーションとしてデプロイする。

$ dokku git:from-image hasura hasura/graphql-engine:v2.36.1

これで http://hasura.<your_dokku_domain>/ のURLにアクセスするとHasura Consoleが表示されるはず。もしエラー画面が出ている場合は、/var/log/nginx/hasura-error.log を見てみると何かヒントがあるかもしれない。

ハマった点

Dokku上のコンテナのlisten portはデフォルトだと5000になるということを知らずに、環境変数HASURA_GRAPHQL_SERVER_PORTを指定していなかったため、Hasuraはデフォルトの8080でlistenしていてDokkuのNginxからDocker containerへのproxyがうまくできていなかった。

そのため

We're sorry, but something went wrong. If you are the application owner check the logs for more information.

のエラーがずっと出ていたけど(スクショ)、解決方法がなかなかググっても出てこずにハマった。

DokkuのPort Managementのドキュメントに書いてはあるのだが、正直そんなの知らんわって思った。でもおかげでDokkuのport mappingの仕組みが理解できたので良かったけど。

成功したら...

以下のような画面が出るので、HASURA_GRAPHQL_ADMIN_SECRETの環境変数で指定したシークレットを入力するとめでたくHasuraのConsoleが見れるようになる。

※この記事を書き終わってHasura on Dokkuの構築自体に満足してしまい、肝心のアプリケーションの作成はまだできていない。