【Railway】Scala Playアプリのデプロイ

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

Railwayはこちら (←このリンクから登録すると20ドル分のクレジットがもらえます)

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. アプリケーションシークレットの設定
  2. データベースURLの設定
  3. 許可されるホストの設定
    • デフォルトでは、Playにはデフォルトの許可されるホストフィルターのリストが付属しています。これは、許可される有効なホストのリストです= ["localhost", ".local", "127.0.0.1"]。Railwayホストを許可するオプションを追加する必要があります [".up.railway.app"]
  4. sbt-native-packager sbtプラグインの追加
    • sbt update を実行して sbt-native-packager をインストールし、依存関係を更新します。

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-native-packager sbtプラグインを project/plugins.sbt に追加します

addSbtPlugin("com.github.sbt" % "sbt-native-packager" % "x.x.x")

application.conf ファイルに以下を追加します。

play.filters.hosts.allowed=[".up.railway.app"]

注: Railway提供のドメインは .up.railway.app で終わります。カスタムドメインを追加したら、許可されるホストを新しいURLに更新してください。

application.conf ファイルを開き、以下を追加して DATABASE_URL が環境変数から読み取られるようにします。

db.default.url="jdbc:${?DATABASE_URL}"

application.conf ファイルを開き、以下を追加してアプリのシークレットを設定します。

play.http.secret.key=${?APPLICATION_SECRET}

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

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

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

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

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

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

Railwayにデプロイ

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

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

CLIからデプロイ

  1. Railway CLIのインストール
    • CLIをインストールし、Railwayアカウントで認証します。
  2. Railwayプロジェクトの初期化
    • プロンプトに従ってプロジェクトに名前を付けます。
    • プロジェクトが作成されたら、提供されたリンクをクリックしてブラウザで表示します。
  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にアクセスして、アプリがライブで動作していることを確認してください!

Luminusアプリディレクトリで以下のコマンドを実行します。

railway init

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データベースが作成され、デプロイされます。
    • データベースがデプロイされたら、必要な環境変数を追加に戻ることができます。
  4. アプリサービスのデプロイ
    • Railwayプロジェクトキャンバスで Deploy をクリックして、変更を適用します。
  5. デプロイの確認
    • デプロイが完了したら、View logs に移動して、サーバーが正常に実行されていることを確認します。 注: デプロイプロセス中に、RailwayはScalaアプリであることを自動的に検出します。
  6. 公開URLの設定
    • 新しいサービスの「設定」タブのNetworkingセクションに移動します。
    • 「Generate Domain」をクリックして、アプリの公開URLを作成します。

Dockerfileの使用

  1. Playアプリのルートディレクトリに Dockerfile を作成します。
  2. CLIまたはGitHubからデプロイします。

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"]

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

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

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

次のステップ

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

Railwayはこちら (←このリンクから登録すると20ドル分のクレジットがもらえます)

Read more

リアルタイム投票アプリ5選【ライブ配信やイベントで】

リアルタイム投票アプリ5選【ライブ配信やイベントで】

ウェビナーやセミナー、社内研修を実施する際、「参加者が受け身になってしまう」「質問がなかなか出てこない」といった課題を感じたことはないでしょうか。 オンラインでの情報発信が当たり前になった今、一方的な配信だけでは参加者の満足度を高めることが難しくなっています。そこで注目されているのが、リアルタイムで参加者の意見を集約し、その場で結果を共有できる投票・質問ツールです。 本記事では、ライブ配信やイベント、研修などで活用できるリアルタイム投票アプリを5つ厳選してご紹介します。 リアルタイム投票でつながる参加者とイベント リアルタイム投票やQ&A機能を使うと、視聴者や参加者の意見を即座に集計・表示できます。講義や会議の進行を妨げず、参加者全員が自分の意見を簡単に表明できる仕組みです。 従来の挙手による質疑応答では、発言しづらいと感じる参加者も少なくありません。特にオンラインイベントでは、カメラがオンになっていることへの抵抗感や、大人数の前で質問することへのハードルが存在します。 しかし、スマートフォンから匿名で投票やコメントができる仕組みがあれば、参加者は気軽に自分の意見を伝えら

By 阿部 隼也
質問受付ツールの選び方とおすすめ5選を紹介

質問受付ツールの選び方とおすすめ5選を紹介

セミナーや講演会、社内研修などで「質問はありませんか?」と投げかけても、なかなか手が挙がらない経験はないでしょうか。参加者に有益な情報を提供しても、疑問や意見が共有されないまま終わってしまうのは、主催者にとっても参加者にとっても大きな機会損失です。 こうした課題を解決するために注目されているのが「質問受付ツール」です。参加者がスマートフォンから匿名で質問を投稿できるため、発言への抵抗感が下がり、活発なコミュニケーションが生まれます。 本記事では、質問受付ツールの基本機能から、実際に役立つおすすめツール5選、そして選定時に押さえておきたいポイントまで、実務に活かせる情報をまとめて解説します。 質問受付の現場課題 イベントやセミナーの運営で最も頭を悩ませる問題の一つが、参加者からの質問をいかに引き出すかという点です。質問タイムを設けても、会場がシーンと静まり返ってしまい、仕方なく「それでは時間になりましたので」と締めくくる光景は珍しくありません。 この背景には、日本特有の文化的要因も関係しています。大勢の前で発言することへの恥ずかしさ、自分の質問が的外れではないかという不安、他

By 阿部 隼也
オンラインセミナーアプリの選び方。参加者エンゲージメントを高めるポイント

オンラインセミナーアプリの選び方。参加者エンゲージメントを高めるポイント

近年、オンラインセミナーの活用が急速に広がっています。会場のコストや移動時間を気にすることなく、全国・世界中から参加者を集められる点は大きな魅力です。 しかし、せっかく開催しても 「参加者が途中で離脱してしまう」 「ただ見ているだけで反応が薄い」 といった課題を抱えている企業も少なくありません。 本記事では、参加者のエンゲージメントを高め、成果につながるオンラインセミナーアプリの選び方と、実務に役立つ具体的なポイントを解説します。 参加者とのつながりを生むオンライン環境の設計 オンラインセミナーにおける最大の課題は、画面越しの距離感です。会場で直接顔を合わせる機会がないからこそ、参加者が「ただ見ているだけ」にならないような仕組みが求められます。適切なツールと機能選びが、参加者のエンゲージメントを左右します。 従来のオフラインセミナーでは、会場の雰囲気や参加者同士の反応が自然と生まれましたが、オンラインではそうした「空気感」が伝わりにくくなります。だからこそ、双方向のコミュニケーション機能や、参加者の行動データを活用した設計が重要になるのです。 エンゲージメントを高

By 阿部 隼也
参加者の質問を効率的に管理!ZoomウェビナーQ&A機能の使い方を徹底解説

参加者の質問を効率的に管理!ZoomウェビナーQ&A機能の使い方を徹底解説

オンラインでのセミナーやイベントが日常化する中で、Zoomウェビナーを活用している企業が増えています。しかし、ウェビナーの開催で意外と頭を悩ませるのが「参加者からの質問をどう管理するか」という点ではないでしょうか。 セミナーが盛り上がり、次々と質問が寄せられるのは嬉しいことです。一方で、質問が多すぎて整理しきれない、どの質問に優先的に答えるべきか判断に迷う、といった課題も生じます。こうした問題を解決するために役立つのが、ZoomウェビナーのQ&A機能です。 本記事では、ZoomウェビナーのQ&A機能の基本的な使い方から、参加者の質問を効率的に管理する実践的なテクニックまで、詳しく解説していきます。 ZoomウェビナーのQ&A機能とは ZoomウェビナーのQ&A機能は、ウェビナー開催中に参加者が質問を投稿し、主催者側が回答を行うための専用機能です。この機能を使うことで、質問と回答がスレッド形式で整理され、効率的なコミュニケーションが可能になります。 チャット機能との違い Zoomには「チャット機能」もあるため、「Q&A機能とチャット機能の違いは何か」と疑問に思う方も多いで

By 阿部 隼也