AIイノベーションズ
Railway/Guides

Scala Playアプリのデプロイ

このステップバイステップガイドで、RailwayにScala Playアプリをデプロイする方法を学びます。クイックセットアップ、データベース統合、ワンクリックデプロイ、その他のデプロイ戦略について説明します。

著者: AIイノベーションズ 阿部隼也X / Twitter

Railwayはこちら

Scala Playアプリのデプロイ

Playは、JavaおよびScala向けの高速で生産性の高いWebフレームワークです。軽量でステートレスなWebフレンドリーなアーキテクチャに基づいており、Pekko Streamsに基づいたリアクティブモデルのおかげで、高度にスケーラブルなアプリケーションの予測可能で最小限のリソース消費(CPU、メモリ、スレッド)を特徴としています。

このガイドでは、4つの方法でRailwayにScala Playアプリをデプロイする方法について説明します。

  1. テンプレートからのワンクリックデプロイ
  2. GitHubリポジトリから
  3. CLIを使用
  4. Dockerfileを使用

それでは、Playアプリを作成しましょう!

Playアプリの作成

注: PlayアプリがローカルまたはGitHubに既にある場合は、この手順をスキップして、PlayアプリをRailwayにデプロイに直接進むことができます。

新しいScala Playアプリを作成するには、お使いのマシンにJDKとsbtがインストールされていることを確認してください。

ターミナルで次のコマンドを実行して、新しいPlayアプリを作成します。

sbt new

テンプレートのリストが表示されます。playframework/play-scala-seed.g8 テンプレートを選択します。

  • helloworld という名前を付けます。
  • 組織名 com.railwayguide を付けます。
  • 残りはEnterキーを押して、play、scala、sbt scaffoldの最新バージョンを使用します。

helloworld ディレクトリに新しいScala Playアプリがプロビジョニングされます。

Scala Playビューの変更とデータベース構成の設定

ステップ1:インデックスファイルの変更

エディタでプロジェクトを開きます。app/views/index.scala.html ファイルに移動します。

次のように変更します。

@()

@main("Welcome to Play") {
  <h1>Welcome to Play!</h1>
  <h1>Hello World, Railway!</h1>
}

この変更により、新しい見出しが追加され、アプリをローカルで実行すると表示されます。

ステップ2:アプリをローカルで実行

  • 次に、アプリをローカルで実行して変更を確認します。ブラウザに新しいヘッダーが表示されるはずです。

ステップ3:PostgreSQLドライバーを依存関係として追加

Playには組み込みのデータベースドライバーが提供されていないため、PostgreSQL JDBCドライバーをプロジェクトに手動で追加する必要があります。

build.sbt に、次の依存関係を追加します。

libraryDependencies += "org.postgresql" % "postgresql" % "42.7.4" // 常に最新の安定バージョンを使用

ステップ4:application.confでのPostgreSQLの設定

次に、conf/application.conf でPostgreSQLデータベース接続を構成します。

# PostgreSQLを使用したデフォルトのデータベース構成
db.default.driver = org.postgresql.Driver
db.default.url = "jdbc:postgresql://username:[email protected]:5432/scala_play"  # 正しい資格情報に置き換えてください

usernamepassword をPostgreSQLの資格情報に置き換えてください。

ステップ5:プロジェクトの依存関係の更新

PostgreSQLドライバーと更新された依存関係をダウンロードするには、次を実行します。

sbt update

ステップ6:データベース移行ツール(Flyway)の追加

Playにはデータベース移行の組み込みサポートが含まれていないため、Flywayを使用します。

  1. Flywayプラグインのインストール:project/plugin.sbt を開き、Flywayプラグインを追加します。
addSbtPlugin("io.github.davidmweber" % "flyway-sbt" % "7.4.0")
  1. build.sbt でFlywayを構成する:Flywayを有効にし、build.sbt でデータベース接続を構成します。
name := """helloworld"""
organization := "com.railwayguide"
version := "1.0-SNAPSHOT"
executableScriptName := "main"

lazy val root = (project in file(".")).enablePlugins(PlayScala).enablePlugins(FlywayPlugin)

scalaVersion := "2.13.15"

libraryDependencies += guice
libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "7.0.1" % Test
libraryDependencies += "org.postgresql" % "postgresql" % "42.7.4" // 最新バージョン

flywayUrl := "jdbc:postgresql://127.0.0.1:5432/scala_play?user=<username>"  # 正しい資格情報に置き換えてください
flywayLocations := Seq("filesystem:src/main/resources/db/migration")

<username> をデータベースのユーザー名に置き換えます。

ステップ7:移行ファイルの作成

  1. 移行フォルダの作成:移行ファイルのフォルダ構造を作成します。
src/main/resources/db/migration
  1. 移行SQLファイルの作成src/main/resources/db/migration に、V1_0__create_employees_table.sql という名前のスキーマ移行ファイルを作成し、次の内容を記述します。
CREATE TABLE employee (
  id VARCHAR(20) PRIMARY KEY,
  first_name VARCHAR(30),
  last_name VARCHAR(30),
  email VARCHAR(30),
  admin BOOLEAN
);

ステップ8:データベース移行の実行

移行ファイルが配置されたら、次のコマンドでFlyway移行を実行します。

sbt flywayMigrate

これにより、移行が適用され、PostgreSQLデータベースにemployeeテーブルが作成されます。

psqlやPostgreSQLクライアントなどのデータベースツールを使用して、employeeテーブルが正常に作成されたことを確認します。

Playアプリをローカルで実行

次に、ターミナルで sbt run を実行してプロジェクトをビルドし、すべての依存関係をインストールして、埋め込みPekko HTTPサーバーを起動します。

ブラウザを開き、http://localhost:9000 にアクセスしてアプリを表示します。

Scala Playアプリをデプロイ用に準備する

  1. アプリケーションシークレットの設定
    • application.conf ファイルを開き、以下を追加してアプリのシークレットを設定します。
      play.http.secret.key=${?APPLICATION_SECRET}
  2. データベースURLの設定
    • application.conf ファイルを開き、以下を追加して DATABASE_URL が環境変数から読み取られるようにします。
      db.default.url="jdbc:${?DATABASE_URL}"
  3. 許可されるホストの設定
    • デフォルトでは、Playにはデフォルトの許可されるホストフィルターのリストが付属しています。これは、許可される有効なホストのリストです= ["localhost", ".local", "127.0.0.1"]。Railwayホストを許可するオプションを追加する必要があります [".up.railway.app"]
    • application.conf ファイルに以下を追加します。
      play.filters.hosts.allowed=[".up.railway.app"]
      注: Railway提供のドメインは .up.railway.app で終わります。カスタムドメインを追加したら、許可されるホストを新しいURLに更新してください。
  4. sbt-native-packager sbtプラグインの追加
    • sbt-native-packager sbtプラグインを project/plugins.sbt に追加します
      addSbtPlugin("com.github.sbt" % "sbt-native-packager" % "x.x.x")
    • build.sbtJavaAppPackaging プラグインを有効にし、executableScriptNamemain に設定します。build.sbt は次のようになります。
      name := """helloworld"""
      organization := "com.railwayguide"
      version := "1.0-SNAPSHOT"
      executableScriptName := "main"
      lazy val root = (project in file(".")).enablePlugins(PlayScala).enablePlugins(JavaAppPackaging).enablePlugins(FlywayPlugin)
      scalaVersion := "2.13.15"
      libraryDependencies += guice
      libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "7.0.1" % Test
      libraryDependencies += "org.postgresql" % "postgresql" % "42.7.4" // 常に最新の安定バージョンを使用
      flywayUrl := sys.env.getOrElse("DATABASE_URL", "jdbc:postgresql://127.0.0.1:5432/scala_play?user=username")
      flywayLocations := Seq("filesystem:src/main/resources/db/migration")
    • sbt update を実行して sbt-native-packager をインストールし、依存関係を更新します。

これで、Railwayにデプロイする準備が整いました!

PlayアプリをRailwayにデプロイする

Railwayは、セットアップと好みに応じて、Scalaアプリをデプロイする複数の方法を提供します。

テンプレートからのワンクリックデプロイ

最速で始めたい場合は、ワンクリックデプロイオプションが最適です。

下のボタンをクリックして開始します。

Railwayにデプロイ

デプロイ後はテンプレートから Eject して、GitHub アカウントにリポジトリのコピーを作成することを強くおすすめします。

注: コミュニティによって作成されたさまざまなScalaアプリテンプレートから選択することもできます。

CLIからデプロイ

  1. Railway CLIのインストール
    • CLIをインストールし、Railwayアカウントで認証します。
  2. Railwayプロジェクトの初期化
    • Luminusアプリディレクトリで以下のコマンドを実行します。
      railway init
    • プロンプトに従ってプロジェクトに名前を付けます。
    • プロジェクトが作成されたら、提供されたリンクをクリックしてブラウザで表示します。
  3. Postgresデータベースサービスの追加
    • railway add -d postgres を実行します。
    • Enter を押してプロジェクトに追加します。
    • データベースサービスがRailwayプロジェクトに追加されます。
  4. サービスと環境変数の追加
    • railway add を実行します。
    • オプションのリストから Empty Service を選択します。
    • Enter a service name プロンプトで app-service と入力します。
    • Enter a variable プロンプトで APPLICATION_SECRET=<generated-app-secret> と入力します。ここで、<generated-app-secret> は、ターミナルで playGenerateSecret を実行して生成されたシークレットです。
    • Enter a variable プロンプトで DATABASE_URL=${{Postgres.DATABASE_URL}} と入力します。
  5. アプリケーションのデプロイ
    • railway up を実行してアプリをデプロイします。
      • このコマンドは、アプリのファイルをスキャン、圧縮し、Railwayにアップロードします。ターミナルにはリアルタイムのデプロイログが表示されます。
    • デプロイが完了したら、アプリサービスのドメインを生成に進むことができます。
  6. 公開URLの設定
    • railway domain を実行して、アプリの公開URLを生成します。
    • 新しいURLにアクセスして、アプリがライブで動作していることを確認してください!

GitHubリポジトリからデプロイ

Scala PlayアプリをGitHubから直接Railwayにデプロイするには、以下の手順に従ってください。

  1. Railwayで新しいプロジェクトを作成
    • Railwayにアクセスして、新しいプロジェクトを作成します。
  2. GitHubからデプロイ
    • Deploy from GitHub repo を選択し、リポジトリを選択します。
      • RailwayアカウントがまだGitHubにリンクされていない場合は、リンクするように求められます。
  3. 環境変数の追加とデータベースサービスのプロビジョニング
    • Add Variables をクリックしますが、まだ何も追加しないでください。まず、次の手順に進んでください。
    • Railwayプロジェクトキャンバスを右クリックするか、Create ボタンをクリックし、Database を選択して Add PostgreSQL を選択します。
      • これにより、プロジェクト用に新しいPostgreSQLデータベースが作成され、デプロイされます。
    • データベースがデプロイされたら、必要な環境変数を追加に戻ることができます。
      • DATABASE_URL:値を ${{Postgres.DATABASE_URL}} に設定します(これは新しいPostgresデータベースのURLを参照します)。サービス変数の参照について詳しくはこちら
      • APPLICATION_SECRET:値を生成されたアプリシークレットに設定します。
  4. アプリサービスのデプロイ
    • Railwayプロジェクトキャンバスで Deploy をクリックして、変更を適用します。
  5. デプロイの確認
    • デプロイが完了したら、View logs に移動して、サーバーが正常に実行されていることを確認します。 注: デプロイプロセス中に、RailwayはScalaアプリであることを自動的に検出します。
  6. 公開URLの設定
    • 新しいサービスの「設定」タブのNetworkingセクションに移動します。
    • 「Generate Domain」をクリックして、アプリの公開URLを作成します。

Dockerfileの使用

  1. Playアプリのルートディレクトリに Dockerfile を作成します。
  2. Dockerfile に以下の内容を追加します。
    # Scala sbt公式イメージを使用
    # https://hub.docker.com/r/sbtscala/scala-sbt/tags
    FROM sbtscala/scala-sbt:eclipse-temurin-21.0.5_11_1.10.5_3.5.2
    # アプリディレクトリを作成して変更
    WORKDIR /app
    # ローカルコードをコンテナイメージにコピー
    COPY . ./
    # アプリのビルド
    RUN sbt stage
    # アプリの実行
    CMD ["./target/universal/stage/bin/main"]
  3. CLIまたはGitHubからデプロイします。

Railwayは Dockerfile を自動的に検出し、それを使用してアプリをビルドおよびデプロイします。

注: Railwayは、パブリックおよびプライベートのDockerイメージからのデプロイもサポートしています。

このガイドでは、Railwayの主なデプロイオプションについて説明しました。セットアップに適したアプローチを選択し、Scalaアプリをシームレスにデプロイし始めてください!

次のステップ

Railwayでのエクスペリエンスを最大限に活用するために、これらのリソースを調べてください。

Railwayはこちら

PR