Skip to content

Updates and GraalVM for reduced memory footprint #22

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/backend.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 21
distribution: graalvm
java-version: 23
cache: gradle
- name: Verify
run: ./gradlew --no-daemon check koverHtmlReport koverVerify
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/gradle-dependency-submission.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 21
distribution: graalvm
java-version: 23
cache: gradle

- name: Run snapshot action
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/operations.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 21
distribution: graalvm
java-version: 23
cache: gradle
- uses: pnpm/action-setup@v4
with:
Expand Down
4 changes: 1 addition & 3 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/kotlinc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 14 additions & 5 deletions Backend/bootstrap/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,21 @@ plugins {
application
alias(libs.plugins.kotlin.jvm)
alias(libs.plugins.shadow)
alias(libs.plugins.kover)
alias(testLibs.plugins.kover)
}

application {
mainClass.set("io.ktor.server.netty.EngineMain")
mainClass.set("dev.honegger.jasstracker.bootstrap.ApplicationKt")

val isDevelopment: Boolean = project.ext.has("development")
applicationDefaultJvmArgs = listOf("-Dio.ktor.development=$isDevelopment")
}

kotlin {
jvmToolchain(23)
jvmToolchain {
languageVersion.set(JavaLanguageVersion.of(23))
vendor.set(JvmVendorSpec.GRAAL_VM)
}
}

dependencies {
Expand All @@ -27,7 +30,7 @@ dependencies {
implementation(libs.ktor.server.call.logging)
implementation(libs.ktor.server.content.negotiation)
implementation(libs.ktor.server.cors)
implementation(libs.ktor.server.netty)
implementation(libs.ktor.server.cio)
implementation(libs.ktor.server.auth)
implementation(libs.ktor.server.auth.jwt)
implementation(libs.ktor.server.status.pages)
Expand All @@ -37,12 +40,18 @@ dependencies {
implementation(libs.kotlin.logging)
implementation(libs.slf4j)
implementation(libs.java.jwt)
testImplementation(testLibs.kotlin.test)
testImplementation(testLibs.mockk)
}

tasks.withType<Test> {
useJUnitPlatform()
}

tasks {
shadowJar {
manifest {
attributes(Pair("Main-Class", "io.ktor.server.netty.EngineMain"))
attributes("Main-Class" to "dev.honegger.jasstracker.bootstrap.ApplicationKt")
}
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
@file:OptIn(ExperimentalEncodingApi::class)

package dev.honegger.jasstracker.bootstrap

import dev.honegger.jasstracker.api.endpoints.*
import dev.honegger.jasstracker.bootstrap.plugins.configureAuthentication
import dev.honegger.jasstracker.bootstrap.plugins.configureHTTP
import dev.honegger.jasstracker.bootstrap.plugins.configureStaticRouting
import dev.honegger.jasstracker.bootstrap.plugins.initializeDatabase
import dev.honegger.jasstracker.bootstrap.plugins.*
import dev.honegger.jasstracker.bootstrap.utils.readConfiguration
import dev.honegger.jasstracker.data.repositories.*
import dev.honegger.jasstracker.domain.services.*
import dev.honegger.jasstracker.security.Argon2HashConfig
Expand All @@ -14,15 +14,32 @@ import dev.honegger.jasstracker.security.JwtTokenService
import io.ktor.server.application.*
import io.ktor.server.auth.*
import io.ktor.server.routing.*
import io.ktor.server.engine.*
import io.ktor.server.cio.*
import io.ktor.server.config.*
import kotlin.io.encoding.Base64
import kotlin.io.encoding.ExperimentalEncodingApi
import kotlin.time.Duration

fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)
fun main() {
embeddedServer(
factory = CIO,
configure = {
connectors += EngineConnectorBuilder().apply {
port = System.getenv("PORT")?.toInt() ?: 8080
}
},
environment = applicationEnvironment {
config = MapApplicationConfig(readConfiguration(System::getenv))
},
module = Application::module,
).start(true)
}

@Suppress("unused") // application.conf references the main function. This annotation prevents the IDE from marking it as unused.
fun Application.module() {
environment.config.apply {
val jwtConfig = JwtConfig(
secret = property("jwt.secret").getString(),
secret = Base64.decode(property("jwt.secret").getString()),
issuer = property("jwt.issuer").getString(),
audience = property("jwt.audience").getString(),
realm = property("jwt.realm").getString(),
Expand Down Expand Up @@ -56,7 +73,6 @@ fun Application.module() {
configureHTTP()
configureStaticRouting()


routing {
route("/api") {
configureAuthenticationEndpoints(playerService)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package dev.honegger.jasstracker.bootstrap.utils

inline fun readConfiguration(getEnvVariable: (name: String) -> String?) = listOf(
"jasstracker.db.url" to (getEnvVariable("DB_URL") ?: "jdbc:postgresql://localhost:5432/jasstracker"),
"jasstracker.db.user" to (getEnvVariable("DB_USER") ?: "jasstracker"),
"jasstracker.db.password" to (getEnvVariable("DB_PASSWORD") ?: "password"),

"jwt.secret" to (getEnvVariable("JWT_SECRET") ?: "z8TxaimeeD3R9EFBCBTLNi6LNlDOOiRuKjb5TYcUEcNNjYDzhbS5StLIB1wqvDPhNoXY66FUvIsQrOykDUbUQg=="),
"jwt.issuer" to (getEnvVariable("JWT_ISSUER") ?: "http://0.0.0.0:8080/"),
"jwt.audience" to (getEnvVariable("JWT_AUDIENCE") ?: "http://0.0.0.0:9090/"),
"jwt.realm" to (getEnvVariable("JWT_REALM") ?: "JassTracker"),
"jwt.expiryTime" to (getEnvVariable("JWT_EXPIRY_TIME") ?: "4h"),

"hash.iterations" to (getEnvVariable("HASH_ITERATIONS") ?: "10"),
"hash.memory" to (getEnvVariable("HASH_MEMORY") ?: "65536"),
"hash.parallelization" to (getEnvVariable("HASH_PARALLELIZATION") ?: "1"),
)
41 changes: 0 additions & 41 deletions Backend/bootstrap/src/main/resources/application.conf

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package dev.honegger.jasstracker.bootstrap.plugins

import dev.honegger.jasstracker.bootstrap.utils.readConfiguration
import kotlin.test.*

class ConfigurationTest {
@Test
fun `should provide default configuration`() {
assertContentEquals(listOf(
"jasstracker.db.url" to "jdbc:postgresql://localhost:5432/jasstracker",
"jasstracker.db.user" to "jasstracker",
"jasstracker.db.password" to "password",
"jwt.secret" to "z8TxaimeeD3R9EFBCBTLNi6LNlDOOiRuKjb5TYcUEcNNjYDzhbS5StLIB1wqvDPhNoXY66FUvIsQrOykDUbUQg==",
"jwt.issuer" to "http://0.0.0.0:8080/",
"jwt.audience" to "http://0.0.0.0:9090/",
"jwt.realm" to "JassTracker",
"jwt.expiryTime" to "4h",
"hash.iterations" to "10",
"hash.memory" to "65536",
"hash.parallelization" to "1",
), readConfiguration { null })
}

@Test
fun `should read environment variables`() {
assertContentEquals(listOf(
"jasstracker.db.url" to "DB_URL_VALUE",
"jasstracker.db.user" to "DB_USER_VALUE",
"jasstracker.db.password" to "DB_PASSWORD_VALUE",
"jwt.secret" to "JWT_SECRET_VALUE",
"jwt.issuer" to "JWT_ISSUER_VALUE",
"jwt.audience" to "JWT_AUDIENCE_VALUE",
"jwt.realm" to "JWT_REALM_VALUE",
"jwt.expiryTime" to "JWT_EXPIRY_TIME_VALUE",
"hash.iterations" to "HASH_ITERATIONS_VALUE",
"hash.memory" to "HASH_MEMORY_VALUE",
"hash.parallelization" to "HASH_PARALLELIZATION_VALUE",
), readConfiguration { "${it}_VALUE" })
}
}
9 changes: 5 additions & 4 deletions Backend/data-access/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@ plugins {
java
alias(libs.plugins.kotlin.jvm)
alias(libs.plugins.jooq)
alias(libs.plugins.kover)
alias(testLibs.plugins.kover)
}

kotlin {
jvmToolchain(23)
jvmToolchain {
languageVersion.set(JavaLanguageVersion.of(23))
vendor.set(JvmVendorSpec.GRAAL_VM)
}
}

dependencies {
Expand Down Expand Up @@ -74,8 +77,6 @@ jooq {
generate.apply {
isDeprecated = false
isRecords = true
isPojos = false
isFluentSetters = false
}
target.apply {
packageName = "dev.honegger.jasstracker.data.database"
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading