You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ktor应用部署Heroku后启动失败(H10错误)技术求助

解决Ktor应用部署到Heroku后的崩溃问题

从你的错误日志和配置来看,主要有两个核心问题:Procfile指定的启动脚本不存在,以及Application类中重复启动服务器导致的冲突。下面一步步帮你解决:

1. 修复Application类的重复服务器启动问题

你的module函数里手动调用了embeddedServer,但实际上EngineMain.main(args)已经会根据application.conf的配置来启动服务器,手动启动会导致端口冲突和启动逻辑混乱,这是Heroku应用崩溃的关键原因之一。

修改你的Application类代码,移除手动启动服务器的部分:

fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)

@kotlin.jvm.JvmOverloads
fun Application.module(testing : Boolean = false) {
    // 移除embeddedServer启动代码,让EngineMain负责启动服务器
    install(ContentNegotiation){
        jackson {
            enable(SerializationFeature.INDENT_OUTPUT)
        }
    }
    routing {
        // 添加根路径处理,避免访问/时返回404
        get("/"){
            call.respondText("Hello from Ktor on Heroku!")
        }
        
        get("/randomgames"){
            val submodel = subModel("Active", Calendar.getInstance().time.toString())
            val game1 = userCredentials("Los Angelos","California","https://cdn.pixabay.com/photo/2017/08/05/11/16/logo-2582748_1280.png","https://cdn.pixabay.com/photo/2017/08/05/11/16/logo-2582748_1280.png",submodel)
            val game2 = userCredentials("Texas","Arizona","https://cdn.pixabay.com/photo/2017/08/05/11/16/logo-2582748_1280.png","https://cdn.pixabay.com/photo/2017/08/05/11/16/logo-2582748_1280.png",submodel)
            val game3 = userCredentials("New York","Virginia","https://cdn.pixabay.com/photo/2017/08/05/11/16/logo-2582748_1280.png","https://cdn.pixabay.com/photo/2017/08/05/11/16/logo-2582748_1280.png",submodel)
            val gamesList = arrayListOf(game1, game2, game3)
            val mainModel = MainModel(gamesList)
            call.respond(mainModel)
        }
    }
}

2. 修复Procfile的启动路径问题

错误日志显示找不到build/install/kotlinserver/bin/kotlinserver,这是因为Gradle的installDist生成的脚本名称可能和你预期的不一致,而且这种方式依赖本地安装的环境,不如使用fat jar可靠。推荐使用Shadow插件生成包含所有依赖的fat jar:

步骤2.1 更新Gradle配置,添加Shadow插件

修改你的Gradle脚本,添加Shadow插件并配置stage任务:

buildscript {
    repositories {
        jcenter()
        maven { url "https://plugins.gradle.org/m2/" }
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "com.github.jengelman.gradle.plugins:shadow:7.1.2" // 引入Shadow插件
    }
}

apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'application'
apply plugin: 'com.github.johnrengelman.shadow' // 应用Shadow插件

group 'ktor.api.com'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8

mainClassName = "io.ktor.server.netty.EngineMain"

// 配置Shadow插件生成fat jar
shadowJar {
    manifest {
        attributes 'Main-Class': 'io.ktor.server.netty.EngineMain'
    }
}

// 修改stage任务依赖shadowJar,替代installDist
task stage {
    dependsOn shadowJar
    println "Running Stage"
}

// 其余配置保持不变...

步骤2.2 更新Procfile

将Procfile内容改为使用fat jar启动:

web: java -jar build/libs/ktor.api.com-1.0-SNAPSHOT-all.jar

注意:jar文件名格式为[group]-[version]-all.jar,如果你的group或version有修改,需要对应调整文件名。

3. 完善application.conf配置

确保你的配置文件绑定到0.0.0.0(Heroku要求应用必须监听所有网络接口),并正确读取PORT环境变量:

ktor {
    deployment {
        environment = production
        port = ${PORT}
        host = 0.0.0.0 // 必须设置为0.0.0.0,否则Heroku无法访问
    }
    application {
        modules = [ ktor.api.com.ApplicationKt.module ]
    }
}

4. 重新部署并验证

  1. 提交所有修改到GitHub仓库
  2. 等待Heroku自动重新部署,或者手动触发部署
  3. 如果仍然有问题,运行heroku logs --tail查看实时日志,排查剩余问题

完成以上步骤后,你的Ktor应用应该能在Heroku正常运行了。

内容的提问来源于stack exchange,提问作者Taki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 11:37:44