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