feat(docker): add Dockerfile for application build and runtime

This commit is contained in:
2025-11-02 14:06:39 +01:00
parent aa83082d09
commit 21b6267ccf
6 changed files with 57 additions and 15 deletions

1
.gitignore vendored
View File

@@ -138,3 +138,4 @@ target
/knockoutwhistweb/.g8/
/knockoutwhistweb/.bsp/
/currentSnapshot.json
.env

41
Dockerfile Normal file
View File

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

View File

@@ -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

View File

@@ -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)

View File

@@ -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}
}

View File

@@ -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")