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の構築自体に満足してしまい、肝心のアプリケーションの作成はまだできていない。
