tsuemura / practical-guide-for-test-automation-support

2 stars 0 forks source link

Railway.appでのアプリケーションのデプロイについて #3

Closed bntoma closed 2 months ago

bntoma commented 2 months ago

初めまして。書籍を購入して、勉強させていただいております。

早速ですが 5-2-3 デプロイする までは手順通りに進めて、ローカル環境でのデプロイではうまく行っておりますが、 5-3-1 サンプルアプリケーションについて ウェブ画面を確認する のところに行きつきません。

とくに Railway.app は初めて触るため、恥ずかしいのですが、ウェブで調べた範囲で解決に至っておりません。 詳細な手順を示していただけると嬉しいです。

以下見当違いかもしれませんが、試してみたことを記しておきます:

デプロイしても、アプリのURLが不明であったので、設定の Networking > Public Networking > Generate Domain でurlを取得しました。 Networking-generate-domain

Networking-generate-domain2

これをクリックして、アプリケーションのページへは遷移したのですが、以下のようなエラーが出ます:

{"statusCode":500,"code":"42P01","error":"Internal Server Error","message":"relation \"session\" does not exist"}

PostgresのDBのマイグレーションの手順が抜けているのかなという印象です。

bntoma commented 2 months ago

追記です。 ビルドが成功しているかのように見えていたのですが、ログを追っていくとDBのマイグレーション実行時に、アドレス解決ができないとのエラーが出ていました。

12 0.874 > fastify-react-sample@1.0.0 build

12 0.874 > npm run db:migrate

12 0.874

12 1.155 npm

12 1.166

12 1.166 > fastify-react-sample@1.0.0 db:migrate

12 1.166 > node db/migrate.mjs

12 1.166

12 1.298 Error: getaddrinfo ENOTFOUND postgres.railway.internal

12 1.298 at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:109:26) {

12 1.298 errno: -3008,

12 1.298 code: 'ENOTFOUND',

12 1.298 syscall: 'getaddrinfo',

12 1.298 hostname: 'postgres.railway.internal'

これはこちらの設定ミスによるものか、他でも同様に起こっているのか、確認させていただきたいです。

bntoma commented 2 months ago

自己解決しました。 本書と異なる手順を踏んでいるのですが、以下の設定に内容を変更することで、デプロイ時におけるマイグレーションが成功し、無事webappを起動させることができました。 webapp 側の Variables の PGHOST、PGPORT を以下の画像のように、パブリック側の値を入れる必要がありました。

5-2-3_p102_variables

参考情報: Cannot access postgres.railway.internal and Rails build fails on migrate

6章以降の挙動に影響がないか心配なところではありますので、ご確認ください。

tsuemura commented 2 months ago

@bntoma

{"statusCode":500,"code":"42P01","error":"Internal Server Error","message":"relation "session" does not exist"}

こちらのエラーは、ご指摘の通りマイグレーションが走らなかったために起きています。 マイグレーション処理は、Webappがビルドされる際に実行されます。

https://github.com/tsuemura/fastify-webapp-sample/blob/main/package.json#L10

マイグレーションが走らなかった理由については、ご共有頂いた内容から推察するに、 WebappがPostgresサービスに接続できなかったためではないかと考えられます。

Webapp側のPGHOST及びPGPORTを設定することで上手く行ったとのことでしたが、Railwayにはサービス間でホスト名やポート番号などを参照するための変数が用意されており、これらを Variables に設定した上で再デプロイするとマイグレーションが走るはずです。

image

書籍ではp.101~102 「環境変数をセットする」で説明しています。一度ご確認頂けますと幸いです。

tsuemura commented 2 months ago

@bntoma

デプロイしても、アプリのURLが不明であったので、設定の Networking > Public Networking > Generate Domain でurlを取得しました。

こちら、記載漏れのようです。大変失礼しました。

tsuemura commented 2 months ago

@bntoma

度々すみません。こちらでも現象が再現しました。確認しています。

bntoma commented 2 months ago

先の書き込みで示しましたリンク内に:

参考情報: Cannot access postgres.railway.internal and Rails build fails on migrate

Railwayの公式ドキュメントが参照されています:

言葉通りに受け取ると、ビルドフェーズにおいてプライベートネットワークが利用できない制限があるのではないかと推察します。

tsuemura commented 2 months ago

@bntoma ありがとうございます。恐らくおっしゃるとおりで、プライベートドメイン postgres.railway.internal はビルド中は使えないはずです。

ただ、以前は(少なくとも2024年6月ごろに確認した時点では) ${{Postgres.PGHOST}} という環境変数がパブリックドメイン ***.***.rlwy.net に変換されていたのですが、新たにデプロイしたものからはプライベートドメイン postgres.railway.internal に変換されるようになっているようなんですね。 そのせいでビルド中のマイグレーションに失敗してしまっているようです。

ワークアラウンドとしては、ご提案いただいたものが有効です。かつ、この状態でも6章以降の内容には差し障りありません。 https://github.com/tsuemura/practical-guide-for-test-automation-support/issues/3#issuecomment-2272407471

ただし、6章ではRailwayの environment 機能を使ってステージング環境(テスト用の環境)を作りますので、そちらでも同様の操作をする必要があります。

この件はRailwayのコミュニティでも聞いてみています。 https://help.railway.app/questions/an-actual-value-of-postgres-pghost-933b8b65

tsuemura commented 2 months ago

Railwayから回答があり、やはり最近(2024/7/19)に変更があったということでした。 https://railway.app/changelog/2024-07-19-database-private-networking

回避方法は2つあり、1つはRailwayの新しいBuilderを使って頂くことです。これにより、ビルド中にも Private Network が使えるようになるとのことです。

image

もう一つの方法は、ビルドではなくデプロイの際にマイグレーションをすることです。おそらくこちらのほうが本書の読者の皆さまにとってはシンプルになるはずなので、対応予定です。

bntoma commented 2 months ago

お調べいただきありがとうございました。

ytak-sagit commented 2 months ago

@tsuemura
初めまして!issue は close 済ですが、情報共有のためコメントを残させて頂きます。
当 issue の事象が同じく発生しましたが、記載頂いている「新しい Builder を使う」方法で、
無事デプロイまで完了し、サンプルアプリ画面も確認できました!

回避方法は2つあり、1つはRailwayの新しいBuilderを使って頂くことです。これにより、ビルド中にも Private Network が使えるようになるとのことです。