§アプリケーションのデプロイ
開発モードで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
以下を含む、他の多くのタイプのアーカイブを生成できます
- tar.gz
- OS Xディスクイメージ
- Microsoft Installer(MSI)
- RPM
- Debianパッケージ
- RPM / DebianパッケージのSystem V / init.dおよびUpstartサービス
詳細については、ネイティブパッカープラグインのドキュメントを参照してください。
§サーバー配布のビルド
sbt-native-packagerプラグインは、多くのアーキタイプを提供します。Playがデフォルトで使用するものは、Javaサーバーアーキタイプと呼ばれ、次の機能を有効にします
- System VまたはUpstart起動スクリプト
- デフォルトフォルダー
詳細については、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バージョンを置き換える必要があります。
次へ: 本番環境設定
このドキュメントに誤りを見つけましたか? このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。質問やアドバイスがあれば、コミュニティフォーラムにアクセスして、コミュニティとの会話を始めてください。