使用Docker在Heroku部署Spigot服务器遇R10启动超时问题求助
解决Heroku部署Spigot Minecraft服务器的Error R10启动超时问题
我来帮你搞定这个头疼的R10超时问题!先拆解下问题根源,再一步步给你解决方案:
问题原因
Heroku的Web进程有个硬性要求:必须在60秒内绑定到$PORT环境变量指定的端口,而且默认只监听HTTP/HTTPS流量。但你部署的是Spigot游戏服务器,搭配ngrok做TCP隧道,根本不需要绑定这个Web端口——这就直接触发了Heroku的R10启动超时检测,把你的进程强制干掉了。
解决方案
1. 切换进程类型为Worker
Heroku有专门的worker进程类型,用来运行不需要HTTP端口绑定的后台服务,刚好适配你的Minecraft服务器场景。
- 新建或修改项目根目录下的
Procfile文件,内容改成你实际的启动命令(比如整合了Spigot和ngrok的启动脚本):
如果你的启动命令是直接运行Java,也可以写成worker: ./start-server.shworker: java -jar spigot.jar,记得把ngrok的启动逻辑整合进去。 - 部署完成后,用命令调整进程数量:
这条命令会启动1个worker进程,同时关闭默认的web进程,这样Heroku就不会再检查端口绑定了。heroku ps:scale worker=1 web=0
2. 优化启动脚本的执行顺序
本地运行正常但Heroku上出问题,大概率是Spigot还没完全启动,ngrok就先跑起来了,导致隧道建立失败。你可以给启动脚本加个等待逻辑,确保Spigot的25565端口开放后再启动ngrok:
比如在你的start-server.sh里加入这段:
# 启动Spigot服务器(后台运行) java -jar spigot.jar & # 等待25565端口开放 while ! nc -z localhost 25565; do echo "等待Spigot服务器启动..." sleep 2 done # 启动ngrok TCP隧道 ./ngrok tcp 25565
这样能保证ngrok连接的是已经就绪的Spigot端口,避免隧道建立失败。
3. 处理Heroku的临时文件系统
Heroku的本地文件系统是临时的,每次部署或重启进程,Spigot的世界数据、配置文件都会丢失。如果需要持久化数据,你可以:
- 使用Heroku的Volumes附加组件(付费),挂载一个持久化存储卷到Spigot的数据目录;
- 或者在启动脚本里加入逻辑,把数据同步到外部存储,启动时拉取,关闭时上传。
4. 日志排查
如果还是有问题,用这个命令查看Heroku的实时日志,能帮你定位到底是Spigot启动失败,还是ngrok出了问题:
heroku logs --tail
总结
核心就是把Heroku的进程类型从默认的web改成worker,绕开端口绑定的强制要求,再优化启动顺序确保服务正常就绪。这样应该就能解决R10超时的问题了!
内容的提问来源于stack exchange,提问作者paperbenni
相关产品推荐
相关产品推荐

