ドキュメント

§アプリケーションのデプロイ

開発モードでPlayアプリケーションを実行する方法を見てきましたが、`run`コマンドは本番モードでアプリケーションを実行するために使用すべきではありません。 `run`を使用すると、リクエストごとにPlayはsbtを使用してファイルが変更されたかどうかを確認し、アプリケーションのパフォーマンスに大きな影響を与える可能性があります。

本番モードでPlayアプリケーションをデプロイするには、いくつかの方法があります。推奨される方法である配布アーティファクトの作成から始めましょう。

§アプリケーションシークレット

本番モードでアプリケーションを実行する前に、アプリケーションシークレットを生成する必要があります。これを行う方法の詳細については、アプリケーションシークレットの設定を参照してください。以下の例では、`-Dplay.http.secret.key=ad31779d4ee49d5ad5162bf1429c32e2e9933f3b`の使用法が表示されます。本番環境にデプロイする際には、独自のシークレットを生成して使用する必要があります。

§JPAを使用したPlayのデプロイ

JPAを使用している場合は、JPAを使用したPlayのデプロイを参照してください。

§distタスクの使用

`dist`タスクは、sbtに依存することなくサーバーにデプロイできるアプリケーションのバイナリバージョンをビルドします。サーバーに必要なのはJavaインストールだけです。

Playコンソールで、単に`dist`と入力します

[my-first-app] $ dist

そして、次のようなものが表示されます

$ sbt
[info] Loading global plugins from /Users/play-developer/.sbt/1.0/plugins
[info] Loading project definition from /Users/play-developer/my-first-app/project
[info] Set current project to my-first-app (in build file:/Users/play-developer/my-first-app/)
[my-first-app] $ dist
[info] Packaging /Users/play-developer/my-first-app/target/scala-2.13/my-first-app_2.13-1.0-SNAPSHOT-sources.jar ...
[info] Done packaging.
[info] Wrote /Users/play-developer/my-first-app/target/scala-2.13/my-first-app_2.13-1.0-SNAPSHOT.pom
[info] Main Scala API documentation to /Users/play-developer/my-first-app/target/scala-2.13/api...
[info] Packaging /Users/play-developer/my-first-app/target/scala-2.13/my-first-app_2.13-1.0-SNAPSHOT-web-assets.jar ...
[info] Done packaging.
[info] Packaging /Users/play-developer/my-first-app/target/scala-2.13/my-first-app_2.13-1.0-SNAPSHOT.jar ...
[info] Done packaging.
model contains 21 documentable templates
[info] Main Scala API documentation successful.
[info] Packaging /Users/play-developer/my-first-app/target/scala-2.13/my-first-app_2.13-1.0-SNAPSHOT-javadoc.jar ...
[info] Done packaging.
[info] Packaging /Users/play-developer/my-first-app/target/scala-2.13/my-first-app_2.13-1.0-SNAPSHOT-sans-externalized.jar ...
[info] Done packaging.
[info]
[info] Your package is ready in /Users/play-developer/my-first-app/target/universal/my-first-app-1.0-SNAPSHOT.zip
[info]
[success] Total time: 5 s, completed Feb 6, 2017 2:08:44 PM
[my-first-app] $

これにより、アプリケーションの`target/universal`フォルダーに、アプリケーションを実行するために必要なすべてのJARファイルを含むZIPファイルが生成されます。

アプリケーションを実行するには、ターゲットサーバーでファイルを解凍し、`bin`ディレクトリにあるスクリプトを実行します。スクリプトの名前はアプリケーション名で、bashシェルスクリプトとWindowsの`.bat`スクリプトの2つのバージョンがあります。

$ unzip my-first-app-1.0.zip
$ my-first-app-1.0/bin/my-first-app -Dplay.http.secret.key=ad31779d4ee49d5ad5162bf1429c32e2e9933f3b

コマンドラインから、本番環境用の異なる設定ファイルを指定することもできます

$ my-first-app-1.0/bin/my-first-app -Dconfig.file=/full/path/to/conf/application-prod.conf

使用方法の詳細については、`-h`オプションを付けて起動スクリプトを呼び出してください。

Unixユーザーの場合、zipファイルはUnixファイルのパーミッションを保持しないため、ファイルが展開されると、起動スクリプトを実行可能ファイルとして設定する必要があります

$ chmod +x /path/to/bin/<project-name>

代わりに、tar.gzファイルを生成することもできます。Tarファイルはパーミッションを保持します。 `dist`タスクの代わりに、`Universal / packageZipTarball`タスクを呼び出します

sbt Universal / packageZipTarball

デフォルトでは、`dist`タスクは生成されたパッケージにAPIドキュメントを含めます。これが不要な場合は、`build.sbt`に次の行を追加します

Compile / doc / sources := Seq.empty

Compile / packageDoc / publishArtifact := false

サブプロジェクトを含むビルドの場合、上記のステートメントはすべてのサブプロジェクト定義に適用する必要があります。

§ネイティブパッカー

Playはsbt Native Packagerプラグインを使用します。ネイティブパッカープラグインは、zipファイルを作成する`dist`タスクを宣言します。 `dist`タスクを呼び出すことは、次のものを呼び出すことと直接同等です

[my-first-app] $ Universal / packageBin

以下を含む、他の多くのタイプのアーカイブを生成できます

詳細については、ネイティブパッカープラグインのドキュメントを参照してください。

§サーバー配布のビルド

sbt-native-packagerプラグインは、多くのアーキタイプを提供します。Playがデフォルトで使用するものは、Javaサーバーアーキタイプと呼ばれ、次の機能を有効にします

詳細については、Javaサーバーアプリケーションアーキタイプのドキュメントを参照してください。

§最小限のDebian設定

ビルドに次の設定を追加します

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

Linux / maintainer := "First Lastname <[email protected]>"

Linux / packageSummary := "My custom package summary"

packageDescription := "My longer package description"

次に、を使用してパッケージをビルドします

[my-first-app] $ Debian / packageBin

§最小限のRPM設定

ビルドに次の設定を追加します

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

Linux / maintainer := "First Lastname <[email protected]>"

Linux / packageSummary := "My custom package summary"

packageDescription := "My longer package description"

rpmRelease := "1"

rpmVendor := "example.com"

rpmUrl := Some("http://github.com/example/server")

rpmLicense := Some("Apache v2")

次に、を使用してパッケージをビルドします

[my-first-app] $ Rpm / packageBin

エラーログがいくつかあります。これは、rpmがstdoutではなくstderrにログを記録するためです。

§配布に additional ファイルを含める

プロジェクトの`dist`ディレクトリに含まれているものはすべて、ネイティブパッカーによってビルドされた配布に含まれます。Playでは、`dist`ディレクトリは、ネイティブパッカー独自のドキュメントで言及されている`src/universal`ディレクトリと同等であることに注意してください。

§Play PID設定

Playは独自のPIDを管理します。これは本番環境設定で説明されています。

Playは別のpidfileを使用するため、適切なパス(ここでは`packageName.value`)を提供する必要があります。pidファイルの名前は`play.pid`である必要があります。起動スクリプトにPIDファイルの配置場所を指示するには、`dist/conf`フォルダー内に`application.ini`ファイルを配置し、次の内容を追加します

s"-Dpidfile.path=/var/run/${packageName.value}/play.pid",
# Add all other startup settings here, too

詳細については、sbt-native-packagerのPlayに関するページを参照してください。

PlayがPIDを作成しないようにするには、プロパティを`/dev/null`に設定します

-Dpidfile.path=/dev/null

置換の完全なリストについては、Javaサーバーのカスタマイズに関するドキュメントJavaアプリケーションのカスタマイズに関するドキュメントをよく読んでください。

§Maven(またはIvy)リポジトリへの公開

アプリケーションをMavenリポジトリに公開することもできます。これは、アプリケーションを含むJARファイルと対応するPOMファイルの両方を公開します。

`build.sbt`ファイルで、公開するリポジトリを設定する必要があります

publishTo := Some(
  "My resolver".at("https://mycompany.com/repo")
)

credentials += Credentials(
  "Repo",
  "https://mycompany.com/repo",
  "admin",
  "admin123"
)

次に、Playコンソールで、`publish`タスクを使用します

[my-first-app] $ publish

リゾルバーと資格情報の定義の詳細については、sbtドキュメントを確認してください。

§本番サーバーをその場で実行する

状況によっては、完全な配布を作成したくない場合があります。実際には、プロジェクトのソースディレクトリからアプリケーションを実行したい場合があります。これには、サーバーにsbtがインストールされている必要があり、`stage`タスクを使用して実行できます。

$ sbt clean stage

そして、次のようなものが表示されます

$ sbt
[info] Loading global plugins from /Users/play-developer/.sbt/1.0/plugins
[info] Loading project definition from /Users/play-developer/my-first-app/project
[info] Set current project to my-first-app (in build file:/Users/play-developer/my-first-app/)
[my-first-app] $ stage
[info] Updating {file:/Users/play-developer/my-first-app/}root...
[info] Packaging /Users/play-developer/my-first-app/target/scala-2.13/my-first-app_2.13-1.0-SNAPSHOT-sources.jar ...
[info] Done packaging.
[info] Wrote /Users/play-developer/my-first-app/target/scala-2.13/my-first-app_2.13-1.0-SNAPSHOT.pom
[info] Resolving jline#jline;2.12.2 ...
[info] Done updating.
[info] Main Scala API documentation to /Users/play-developer/my-first-app/target/scala-2.13/api...
[info] Compiling 8 Scala sources and 1 Java source to /Users/play-developer/my-first-app/target/scala-2.13/classes...
[info] Packaging /Users/play-developer/my-first-app/target/scala-2.13/my-first-app_2.13-1.0-SNAPSHOT-web-assets.jar ...
[info] Done packaging.
model contains 21 documentable templates
[info] Main Scala API documentation successful.
[info] Packaging /Users/play-developer/my-first-app/target/scala-2.13/my-first-app_2.13-1.0-SNAPSHOT-javadoc.jar ...
[info] Done packaging.
[info] Packaging /Users/play-developer/my-first-app/target/scala-2.13/my-first-app_2.13-1.0-SNAPSHOT.jar ...
[info] Done packaging.
[info] Packaging /Users/play-developer/my-first-app/target/scala-2.13/my-first-app_2.13-1.0-SNAPSHOT-sans-externalized.jar ...
[info] Done packaging.
[success] Total time: 8 s, completed Feb 6, 2017 2:11:10 PM
[my-first-app] $

これは、アプリケーションをクリーンアップしてコンパイルし、必要な依存関係を取得して`target/universal/stage`ディレクトリにコピーします。また、`bin/<start>`スクリプトも作成します。ここで、`<start>`はプロジェクトの名前です。スクリプトはUnixスタイルのシステムでPlayサーバーを実行し、Windows用の対応する`bat`ファイルもあります。

たとえば、プロジェクトフォルダーからプロジェクト`my-first-app`のアプリケーションを起動するには、次のようにします

$ target/universal/stage/bin/my-first-app -Dplay.http.secret.key=ad31779d4ee49d5ad5162bf1429c32e2e9933f3b

コマンドラインから、本番環境用の異なる設定ファイルを指定することもできます

$ target/universal/stage/bin/my-first-app -Dconfig.file=/full/path/to/conf/application-prod.conf

§テストインスタンスの実行

Playは、本番モードでテストアプリケーションを実行するための便利なユーティリティを提供します。

**注:**これは本番環境での使用を意図したものではありません。

本番モードでアプリケーションを実行するには、`runProd`を実行します

[my-first-app] $ runProd

§sbtアセンブリプラグインの使用

公式にはサポートされていませんが、sbt assemblyプラグインを使用してPlayアプリケーションをパッケージ化して実行することができます。これにより、出力アーティファクトとして1つのjarファイルが生成され、javaコマンドを使用して直接実行できます。

これを使用するには、project/plugins.sbtファイルにプラグインへの依存関係を追加します。

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.1.4")

次に、build.sbtに次の設定を追加します。

assembly / mainClass := Some("play.core.server.ProdServerStart")
assembly / fullClasspath += Attributed.blank(PlayKeys.playPackageAssets.value)

assembly / assemblyMergeStrategy := {
  case manifest if manifest.contains("MANIFEST.MF") =>
    // We don't need manifest files since sbt-assembly will create
    // one with the given settings
    MergeStrategy.discard
  case referenceOverrides if referenceOverrides.contains("reference-overrides.conf") =>
    // Keep the content for all reference-overrides.conf files
    MergeStrategy.concat
  case x =>
    // For all the other files, use the default sbt-assembly merge strategy
    val oldStrategy = (assembly / assemblyMergeStrategy).value
    oldStrategy(x)
}

これで、sbt assemblyを実行してアーティファクトをビルドし、以下を実行してアプリケーションを実行できます。

$ java -Dplay.http.secret.key=ad31779d4ee49d5ad5162bf1429c32e2e9933f3b -jar target/scala-2.XX/<yourprojectname>-assembly-<version>.jar

もちろん、適切なプロジェクト名、バージョン、Scalaバージョンを置き換える必要があります。

次へ: 本番環境設定


このドキュメントに誤りを見つけましたか? このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。質問やアドバイスがあれば、コミュニティフォーラムにアクセスして、コミュニティとの会話を始めてください。