From 21b6267ccf2c067bd9fb26b77f2b4e8331a78280 Mon Sep 17 00:00:00 2001 From: Janis Date: Sun, 2 Nov 2025 14:06:39 +0100 Subject: [PATCH 1/6] feat(docker): add Dockerfile for application build and runtime --- .gitignore | 1 + Dockerfile | 41 +++++++++++++++++++ build.sbt | 12 +++--- .../app/auth/{Auth.scala => AuthAction.scala} | 4 +- knockoutwhistweb/conf/application.conf | 10 ++--- project/plugins.sbt | 4 +- 6 files changed, 57 insertions(+), 15 deletions(-) create mode 100644 Dockerfile rename knockoutwhistweb/app/auth/{Auth.scala => AuthAction.scala} (93%) diff --git a/.gitignore b/.gitignore index c0c2529..666f573 100644 --- a/.gitignore +++ b/.gitignore @@ -138,3 +138,4 @@ target /knockoutwhistweb/.g8/ /knockoutwhistweb/.bsp/ /currentSnapshot.json +.env \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e9f1033 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,41 @@ +# === Stage 1: Build the Play application === +FROM sbtscala/scala-sbt:eclipse-temurin-alpine-22_36_1.10.3_3.5.1 AS builder + +WORKDIR /app + +# Install Node.js and Less CSS preprocessor +USER root +RUN apk add --no-cache nodejs npm && \ + npm install -g less + +# Cache dependencies first +COPY project ./project +COPY build.sbt ./ +RUN sbt -Dscoverage.skip=true update + +# Copy the rest of the code +COPY . . + +# Build the app and stage it +RUN sbt -Dscoverage.skip=true clean stage + +# === Stage 2: Runtime image === +FROM eclipse-temurin:21-jre-alpine + +# Install Argon2 CLI and libraries +RUN apk add --no-cache bash argon2 argon2-libs + +WORKDIR /opt/playapp + +# Copy staged Play build +COPY --from=builder /app/knockoutwhistweb/target/universal/stage /opt/playapp + +# Expose the default Play port +EXPOSE 9000 + +# Set environment variables +ENV PLAY_HTTP_PORT=9000 + +# Run the Play app +ENTRYPOINT ["./bin/knockoutwhistweb"] +CMD ["-Dplay.server.pidfile.path=/dev/null"] diff --git a/build.sbt b/build.sbt index f33dfa4..a23a870 100644 --- a/build.sbt +++ b/build.sbt @@ -19,17 +19,17 @@ lazy val commonSettings = Seq( .map(m => "org.openjfx" % s"javafx-$m" % "21" classifier osName) }, libraryDependencies += guice, - coverageEnabled := true, - coverageFailOnMinimum := true, - coverageMinimumStmtTotal := 85, - coverageMinimumBranchTotal := 100 +// coverageEnabled := true, +// coverageFailOnMinimum := true, +// coverageMinimumStmtTotal := 85, +// coverageMinimumBranchTotal := 100 ) lazy val knockoutwhist = project.in(file("knockoutwhist")) .settings( commonSettings, mainClass := Some("de.knockoutwhist.KnockOutWhist"), - coverageExcludedPackages := "de.knockoutwhist.ui.*;de.knockoutwhist.utils.gui.*" + //coverageExcludedPackages := "de.knockoutwhist.ui.*;de.knockoutwhist.utils.gui.*" ) lazy val knockoutwhistweb = project.in(file("knockoutwhistweb")) @@ -38,7 +38,7 @@ lazy val knockoutwhistweb = project.in(file("knockoutwhistweb")) .settings( commonSettings, libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "7.0.2" % Test, - libraryDependencies += "de.mkammerer" % "argon2-jvm" % "2.12", + libraryDependencies += "de.mkammerer" % "argon2-jvm-nolibs" % "2.12", libraryDependencies += "com.auth0" % "java-jwt" % "4.3.0", libraryDependencies += "com.github.ben-manes.caffeine" % "caffeine" % "3.2.2", JsEngineKeys.engineType := JsEngineKeys.EngineType.Node diff --git a/knockoutwhistweb/app/auth/Auth.scala b/knockoutwhistweb/app/auth/AuthAction.scala similarity index 93% rename from knockoutwhistweb/app/auth/Auth.scala rename to knockoutwhistweb/app/auth/AuthAction.scala index b956035..30add86 100644 --- a/knockoutwhistweb/app/auth/Auth.scala +++ b/knockoutwhistweb/app/auth/AuthAction.scala @@ -14,8 +14,8 @@ class AuthAction @Inject()(val sessionManager: SessionManager, val parser: BodyP extends ActionBuilder[AuthenticatedRequest, AnyContent] { override def executionContext: ExecutionContext = ec - - private def getUserFromSession(request: RequestHeader): Option[User] = { + + protected def getUserFromSession(request: RequestHeader): Option[User] = { val session = request.cookies.get("sessionId") if (session.isDefined) return sessionManager.getUserBySession(session.get.value) diff --git a/knockoutwhistweb/conf/application.conf b/knockoutwhistweb/conf/application.conf index 33a9cd6..bdd403a 100644 --- a/knockoutwhistweb/conf/application.conf +++ b/knockoutwhistweb/conf/application.conf @@ -2,14 +2,14 @@ play.filters.disabled += play.filters.csrf.CSRFFilter play.filters.disabled += play.filters.hosts.AllowedHostsFilter +play.http.secret.key="QCY?tAnfk?aZ?iwrNwnxIlR6CTf:G3gf:90Latabg@5241AB`R5W:1uDFN];Ik@n" +play.http.secret.key=${?APPLICATION_SECRET} auth { issuer = "knockoutwhistweb" audience = "ui" - # ${?PUBLIC_KEY_FILE} - privateKeyFile = "/home/janis/Workspaces/IntelliJ/KnockOutWhist/Gitops/rsa512-private.pem" - privateKeyPem = ${?PUBLIC_KEY_PEM} - #${?PUBLIC_KEY_FILE} - publicKeyFile = "/home/janis/Workspaces/IntelliJ/KnockOutWhist/Gitops/rsa512-public.pem" + privateKeyFile = ${?PRIVATE_KEY_FILE} + privateKeyPem = ${?PRIVATE_KEY_PEM} + publicKeyFile = {?PUBLIC_KEY_FILE} publicKeyPem = ${?PUBLIC_KEY_PEM} } diff --git a/project/plugins.sbt b/project/plugins.sbt index 4a29c3d..65b0015 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,9 +1,9 @@ addSbtPlugin("org.playframework" % "sbt-plugin" % "3.0.9") addSbtPlugin("org.foundweekends.giter8" % "sbt-giter8-scaffold" % "0.18.0") -addSbtPlugin("org.scoverage" % "sbt-scoverage" % "2.2.1") +//addSbtPlugin("org.scoverage" % "sbt-scoverage" % "2.2.1") addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.0") -addSbtPlugin("org.scoverage" % "sbt-coveralls" % "1.3.1") +//addSbtPlugin("org.scoverage" % "sbt-coveralls" % "1.3.1") addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.1.2") addSbtPlugin("nl.gn0s1s" % "sbt-dotenv" % "3.2.0") -- 2.52.0 From fec39510b11448805789ee3f503596f9a38607bd Mon Sep 17 00:00:00 2001 From: Janis Date: Sun, 2 Nov 2025 14:42:20 +0100 Subject: [PATCH 2/6] fix(config): update key file references in application configuration --- knockoutwhistweb/conf/application.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/knockoutwhistweb/conf/application.conf b/knockoutwhistweb/conf/application.conf index bdd403a..1ee3721 100644 --- a/knockoutwhistweb/conf/application.conf +++ b/knockoutwhistweb/conf/application.conf @@ -10,6 +10,6 @@ auth { audience = "ui" privateKeyFile = ${?PRIVATE_KEY_FILE} privateKeyPem = ${?PRIVATE_KEY_PEM} - publicKeyFile = {?PUBLIC_KEY_FILE} + publicKeyFile = ${?PUBLIC_KEY_FILE} publicKeyPem = ${?PUBLIC_KEY_PEM} } -- 2.52.0 From 204a364c48b5e50ab40ac7fe5d189259c9293cd5 Mon Sep 17 00:00:00 2001 From: Janis Date: Sun, 2 Nov 2025 14:45:37 +0100 Subject: [PATCH 3/6] fix(build): update argon2-jvm dependency to include libs --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index a23a870..f43b19b 100644 --- a/build.sbt +++ b/build.sbt @@ -38,7 +38,7 @@ lazy val knockoutwhistweb = project.in(file("knockoutwhistweb")) .settings( commonSettings, libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "7.0.2" % Test, - libraryDependencies += "de.mkammerer" % "argon2-jvm-nolibs" % "2.12", + libraryDependencies += "de.mkammerer" % "argon2-jvm" % "2.12", libraryDependencies += "com.auth0" % "java-jwt" % "4.3.0", libraryDependencies += "com.github.ben-manes.caffeine" % "caffeine" % "3.2.2", JsEngineKeys.engineType := JsEngineKeys.EngineType.Node -- 2.52.0 From 0fde343b46fb8dcd46fe0c73ac9d0962d3e6004b Mon Sep 17 00:00:00 2001 From: Janis Date: Sun, 2 Nov 2025 14:46:05 +0100 Subject: [PATCH 4/6] fix(build): update argon2-jvm dependency to include libs --- build.sbt | 10 +++++----- project/plugins.sbt | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build.sbt b/build.sbt index f43b19b..f33dfa4 100644 --- a/build.sbt +++ b/build.sbt @@ -19,17 +19,17 @@ lazy val commonSettings = Seq( .map(m => "org.openjfx" % s"javafx-$m" % "21" classifier osName) }, libraryDependencies += guice, -// coverageEnabled := true, -// coverageFailOnMinimum := true, -// coverageMinimumStmtTotal := 85, -// coverageMinimumBranchTotal := 100 + coverageEnabled := true, + coverageFailOnMinimum := true, + coverageMinimumStmtTotal := 85, + coverageMinimumBranchTotal := 100 ) lazy val knockoutwhist = project.in(file("knockoutwhist")) .settings( commonSettings, mainClass := Some("de.knockoutwhist.KnockOutWhist"), - //coverageExcludedPackages := "de.knockoutwhist.ui.*;de.knockoutwhist.utils.gui.*" + coverageExcludedPackages := "de.knockoutwhist.ui.*;de.knockoutwhist.utils.gui.*" ) lazy val knockoutwhistweb = project.in(file("knockoutwhistweb")) diff --git a/project/plugins.sbt b/project/plugins.sbt index 65b0015..4a29c3d 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,9 +1,9 @@ addSbtPlugin("org.playframework" % "sbt-plugin" % "3.0.9") addSbtPlugin("org.foundweekends.giter8" % "sbt-giter8-scaffold" % "0.18.0") -//addSbtPlugin("org.scoverage" % "sbt-scoverage" % "2.2.1") +addSbtPlugin("org.scoverage" % "sbt-scoverage" % "2.2.1") addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.3.0") -//addSbtPlugin("org.scoverage" % "sbt-coveralls" % "1.3.1") +addSbtPlugin("org.scoverage" % "sbt-coveralls" % "1.3.1") addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.1.2") addSbtPlugin("nl.gn0s1s" % "sbt-dotenv" % "3.2.0") -- 2.52.0 From 003e1c3cfbf1f4fb9eef046eeeea47a9334a435d Mon Sep 17 00:00:00 2001 From: Janis Date: Fri, 7 Nov 2025 14:03:36 +0100 Subject: [PATCH 5/6] fix(build): disable coverage tracking in build configuration --- build.sbt | 1 - 1 file changed, 1 deletion(-) diff --git a/build.sbt b/build.sbt index f33dfa4..f842c2f 100644 --- a/build.sbt +++ b/build.sbt @@ -19,7 +19,6 @@ lazy val commonSettings = Seq( .map(m => "org.openjfx" % s"javafx-$m" % "21" classifier osName) }, libraryDependencies += guice, - coverageEnabled := true, coverageFailOnMinimum := true, coverageMinimumStmtTotal := 85, coverageMinimumBranchTotal := 100 -- 2.52.0 From b49f169632d95451f1195774e1f13cb41d9e6918 Mon Sep 17 00:00:00 2001 From: Janis Date: Fri, 7 Nov 2025 14:21:48 +0100 Subject: [PATCH 6/6] feat(docker): add .dockerignore and .sbtopts for build configuration --- .dockerignore | 1 + .sbtopts | 2 ++ 2 files changed, 3 insertions(+) create mode 100644 .dockerignore create mode 100644 .sbtopts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..4c49bd7 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +.env diff --git a/.sbtopts b/.sbtopts new file mode 100644 index 0000000..27f4f7b --- /dev/null +++ b/.sbtopts @@ -0,0 +1,2 @@ +-J--add-opens=java.base/java.util=ALL-UNNAMED +-J--add-opens=java.base/java.lang=ALL-UNNAMED -- 2.52.0