本番で動かす#
jar を作る#
fat jar(依存も全部入り)にするのがいちばん簡単です。
plugins {
application
id("com.gradleup.shadow") version "<版>"
}
application {
mainClass = "my_blog.App"
}
tasks.shadowJar {
archiveFileName = "app.jar"
mergeServiceFiles() // JDBC ドライバなどの META-INF/services が消えないように
}
./gradlew shadowJar # build/libs/app.jar
Web を起動する#
java \
-Djimble.env=prod \
-Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 \
-jar app.jar
| 渡すもの | なぜ |
|---|---|
-Djimble.env=prod |
application.prod.conf を読み、isProduction() を true にします |
-Dstdout.encoding / -Dstderr.encoding |
付けないと LANG 未設定のコンテナで日本語のログが化けます |
**-Djimble.env は JVM の引数です。**プログラム引数(java -jar app.jar env=prod)
では効きません。
設定はどこから読まれるか#
jar の中だけです。(conf/ をリソースに足してあるので、jar に入っています。
設定 を参照)
1. application.<env>.conf ← あればこれだけ
2. 無ければ application.conf
**読むのは1ファイルだけです。**共通を読み込むのは環境別ファイルの
1行目に書く include "application.conf" です。
書き忘れると共通の設定が落ちるので、起動時に名指しで言います。
**jar の外の設定は読みません。**設定を変えたらビルドし直します。 そのぶん、動いている jar と設定が1対1になり、 「直したのに効かない」が起きません。 環境ごとに変わる値(DB のパスワードなど)は次の節のとおり環境変数で渡します。
どれを読んだかは起動ログに出ます(設定)。
秘密は環境変数で#
設定ファイルには ${?ENV_NAME} だけ書き、値は環境変数で渡します。
export DB_PASSWORD='...'
export COOKIE_SECRET='...'
export CIPHER_KEY='...'
java -Djimble.env=prod -jar app.jar
バッチを動かす#
fat jar から起動クラスを指定して呼びます。
java \
-Djimble.env=prod \
-Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 \
-cp app.jar my_blog.batch.Batch \
class=my_blog.batch.PostCleanupBatch
class= がバッチのクラス名です。ほかの key=value はバッチの引数になります。
env=prod を引数で渡しても環境は変わりません。
設定はバッチの入口に来る前に読み終わっているためです。
食い違っていたら、その場で止めて言います。
env=prod と指定されていますが、いま動いているのは env=local です。
env= では環境は変わりません(設定はここに来る前に読み終わっています)。
JVM の引数で渡してください。
java -Djimble.env=prod -cp app.jar <起動クラス> ...
スケジューラを動かす#
cron でバッチを回すなら、スケジューラを常駐させます。
java -Djimble.env=prod -cp app.jar my_blog.batch.Batch \
class=my_blog.batch.SchedulerBatch
止めるまで動き続けます。systemd などに任せてください。
Web と同じプロセスで動かすこともできますが、複数台に並べるときは
batch.scheduler_id の扱いを決めてから にしてください。
終了#
SIGTERM で終了処理が走ります(サーバー・スケジューラ・DB のプール)。
kill -9 はトランザクションが中途半端に残るので避けてください。
起動したら確認すること#
起動ログの1行目あたりに構成が出ます。思っていたものと合っているかを見てください。
jimble 構成: env=prod / session=db / cache=db / redis=あり / db=[main] / パスワード暗号化=あり
設定: jar:file:/opt/app/app.jar!/application.prod.conf, jar:file:/opt/app/app.jar!/application.conf
env=local になっていたら、-Djimble.env が渡っていません。