以下は、heroku に ktor アプリケーション (rest api) をデプロイしているときに発生する例外です。herokuローカルサーバーでは問題なく動作しますが、サーバーで問題が発生します。ここでpostgreSqlデータベースを使用しています
here you can get the full source code
https://github.com/nameisjayant/Ktor-Todo-Api
> 2021-06-06T14:05:05.948824+00:00 app[web.1]: at > com.codingwithjks.repository.DatabaseFactory.hikari(DatabaseFactory.kt:26) > 2021-06-06T14:05:05.948898+00:00 app[web.1]: at com.codingwithjks.repository.DatabaseFactory.init(DatabaseFactory.kt:16) > 2021-06-06T14:05:05.948953+00:00 app[web.1]: at com.codingwithjks.ApplicationKt.module(Application.kt:32) > 2021-06-06T14:05:05.948994+00:00 app[web.1]: at com.codingwithjks.ApplicationKt.module$default(Application.kt:28) > 2021-06-06T14:05:05.949068+00:00 app[web.1]: ... 24 more > 2021-06-06T14:05:09.000000+00:00 app[api]: Build succeeded > 2021-06-06T14:05:12.624192+00:00 heroku[web.1]: Process exited with status 1 > 2021-06-06T14:05:12.701399+00:00 heroku[web.1]: State changed from starting to crashed > 2021-06-06T14:05:28.888453+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" > host=todo-rest-api-23242.herokuapp.com > request_id=36434e2c-f89b-4ff7-bfc3-89cc3b927211 fwd="103.198.173.200" > dyno= connect= service= status=503 bytes= protocol=https > 2021-06-06T14:05:29.482958+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" > host=todo-rest-api-23242.herokuapp.com > request_id=c8c0bff6-91c6-4838-a5d7-3e83cca5f1dd fwd="103.198.173.200" > dyno= connect= service= status=503 bytes= protocol=https > 2021-06-06T14:12:03.000000+00:00 app[api]: Build started by user jayntkumar99@gmail.com > 2021-06-06T14:13:02.973949+00:00 app[api]: Deploy d0fbe4c4 by user jayntkumar99@gmail.com > 2021-06-06T14:13:02.973949+00:00 app[api]: Release v10 created by user jayntkumar99@gmail.com > 2021-06-06T14:13:03.838082+00:00 heroku[web.1]: State changed from crashed to starting > 2021-06-06T14:13:07.347769+00:00 heroku[web.1]: Starting process with command `./build/install/example/bin/example` > 2021-06-06T14:13:09.742957+00:00 app[web.1]: Setting JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will > override them. > 2021-06-06T14:13:09.743159+00:00 app[web.1]: bash: ./build/install/example/bin/example: No such file or directory > 2021-06-06T14:13:09.802293+00:00 heroku[web.1]: Process exited with status 127 > 2021-06-06T14:13:09.886995+00:00 heroku[web.1]: State changed from starting to crashed > 2021-06-06T14:13:30.000000+00:00 app[api]: Build succeeded > 2021-06-06T14:13:40.561950+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" > host=todo-rest-api-23242.herokuapp.com > request_id=3064eaba-777b-4b6d-bd79-855d23dfe140 fwd="103.198.173.200" > dyno= connect= service= status=503 bytes= protocol=https > 2021-06-06T14:13:41.107491+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" > host=todo-rest-api-23242.herokuapp.com > request_id=fe5be84d-6e79-4eda-aae4-c4b679ec2c62 fwd="103.198.173.200" > dyno= connect= service= status=503 bytes= protocol=https > 2021-06-06T14:14:03.555698+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" > host=todo-rest-api-23242.herokuapp.com > request_id=cc4d10b8-6650-400b-ad87-5f36b144ec44 fwd="103.198.173.200" > dyno= connect= service= status=503 bytes= protocol=http > 2021-06-06T14:14:04.222065+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" > host=todo-rest-api-23242.herokuapp.com > request_id=c83df707-fe4f-47a1-a6c9-a39a23c83cc5 fwd="103.198.173.200" > dyno= connect= service= status=503 bytes= protocol=http > 2021-06-06T14:14:07.733808+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" > host=todo-rest-api-23242.herokuapp.com > request_id=78efe78b-a180-4592-844e-eeb14e317ae2 fwd="103.198.173.200" > dyno= connect= service= status=503 bytes= protocol=http > 2021-06-06T14:14:08.394252+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" > host=todo-rest-api-23242.herokuapp.com > request_id=2d2e989c-f695-4311-b3be-644381a2ea9a fwd="103.198.173.200" > dyno= connect= service= status=503 bytes= protocol=http > 2021-06-06T14:20:13.438814+00:00 heroku[web.1]: State changed from crashed to starting > 2021-06-06T14:20:17.000000+00:00 app[api]: Build started by user jayntkumar99@gmail.com > 2021-06-06T14:20:17.780691+00:00 heroku[web.1]: Starting process with command `./build/install/example/bin/example` > 2021-06-06T14:20:21.761892+00:00 app[web.1]: Setting JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will > override them. > 2021-06-06T14:20:21.762092+00:00 app[web.1]: bash: ./build/install/example/bin/example: No such file or directory > 2021-06-06T14:20:21.840577+00:00 heroku[web.1]: Process exited with status 127 > 2021-06-06T14:20:21.910863+00:00 heroku[web.1]: State changed from starting to crashed > 2021-06-06T14:21:14.241869+00:00 app[api]: Release v11 created by user jayntkumar99@gmail.com > 2021-06-06T14:21:14.241869+00:00 app[api]: Deploy 8bf5ea75 by user jayntkumar99@gmail.com > 2021-06-06T14:21:14.497150+00:00 heroku[web.1]: State changed from crashed to starting > 2021-06-06T14:21:17.982363+00:00 heroku[web.1]: Starting process with command `java -jar build/libs/example-0.0.1-all.jar` > 2021-06-06T14:21:20.424533+00:00 app[web.1]: Setting JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will > override them. > 2021-06-06T14:21:20.428220+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -Xmx300m -Xss512k -XX:CICompilerCount=2 > -Dfile.encoding=UTF-8 > 2021-06-06T14:21:20.989769+00:00 app[web.1]: 2021-06-06 14:21:20.986 [main] TRACE Application - { > 2021-06-06T14:21:20.989792+00:00 app[web.1]: # application.conf @
/application.conf: 2 > 2021-06-06T14:21:20.989797+00:00 app[web.1]: "展開": { > 2021-06-06T14:21:20.989797+00:00 app[web. 1]: # env var PORT > 2021-06-06T14:21:20.989798+00:00 app[web.1]: "port" : "44723" > 2021-06-06T14:21:20.989798+00:00 app [web.1]: }, > 2021-06-06T14:21:20.989799+00:00 app[web.1]: # 非表示のコンテンツ > 2021-06-06T14:21:20.989799+00:00 app[web. 1]: "セキュリティ": "***" > 2021-06-06T14:21:20.989799+00:00 アプリ[web.1]: } > 2021-06-06T14:21:20.989800+00:00 アプリ[ web.1]: > 2021-06-06T14:21:21.096772+00:00 app[web.1]: 2021-06-06 14:21:21.096 [main] INFO アプリケーション - 自動リロードが無効になっている理由 > 開発モードオフです。> 2021-06-06T14:21:21.599262+00:00 app[web.1]: スレッド「メイン」Java で例外が発生しました。
DatabaseFactory クラス
package com.codingwithjks.repository
import com.codingwithjks.data.table.TodoTable
import com.codingwithjks.data.table.UserTable
import com.zaxxer.hikari.HikariConfig
import com.zaxxer.hikari.HikariDataSource
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.SchemaUtils
import org.jetbrains.exposed.sql.transactions.transaction
object DatabaseFactory {
fun init(){
Database.connect(hikari())
transaction {
SchemaUtils.create(UserTable)
SchemaUtils.create(TodoTable)
}
}
private fun hikari():HikariDataSource {
val config = HikariConfig()
config.driverClassName = System.getenv("JDBC_DRIVER_2")
config.jdbcUrl = System.getenv("JDBC_DATABASE_URL_2")
config.maximumPoolSize = 3
config.isAutoCommit = true
config.transactionIsolation = "TRANSACTION_REPEATABLE_READ"
config.validate()
return HikariDataSource(config)
}
suspend fun <T> dbQuery(block : ()->T):T =
withContext(Dispatchers.IO){
transaction {
block()
}
}
}
Application.kt ファイル
package com.codingwithjks
import com.codingwithjks.auth.JwtService
import com.codingwithjks.auth.MySession
import com.codingwithjks.auth.hash
import com.codingwithjks.repository.DatabaseFactory
import com.codingwithjks.repository.TodoRepository
import com.codingwithjks.repository.UserRepository
import com.codingwithjks.routes.todos
import com.codingwithjks.routes.users
import io.ktor.application.*
import io.ktor.response.*
import io.ktor.request.*
import io.ktor.routing.*
import io.ktor.http.*
import io.ktor.locations.*
import io.ktor.sessions.*
import io.ktor.auth.*
import io.ktor.auth.jwt.*
import io.ktor.gson.*
import io.ktor.features.*
fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)
@OptIn(KtorExperimentalLocationsAPI::class)
@Suppress("unused") // Referenced in application.conf
@kotlin.jvm.JvmOverloads
fun Application.module(testing: Boolean = false) {
install(Locations) {
}
DatabaseFactory.init()
val userDb = UserRepository()
val todoDb = TodoRepository()
val jwt = JwtService()
val hashFunction = {s:String -> hash(s)}
install(Sessions) {
cookie<MySession>("MY_SESSION") {
cookie.extensions["SameSite"] = "lax"
}
}
install(Authentication) {
jwt("jwt") {
verifier(jwt.verifier)
realm = "Todo Server"
validate {
val payload = it.payload
val claim = payload.getClaim("id")
val claimString = claim.asInt()
val user = userDb.findUser(claimString)
user
}
}
}
install(ContentNegotiation) {
gson {
setPrettyPrinting()
disableHtmlEscaping()
}
}
routing {
get("/"){
call.respondText("Hello world..")
}
users(userDb,todoDb,jwt,hashFunction)
todos(todoDb,userDb)
}
}
const val API_VERSION = "/v1"
私を助けてください :)