Heroku部署Discord Bot遭遇R10启动超时错误的求助
你的问题是典型的Heroku进程类型配置错误导致的,先看看你遇到的错误详情:
Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2022-03-19T09:15:18.022903+00:00 heroku[web.1]: Stopping process with SIGKILL
2022-03-19T09:15:18.059850+00:00 app[web.1]: Error waiting for process to terminate: No child processes
2022-03-19T09:15:18.210022+00:00 heroku[web.1]: Process exited with status 22
2022-03-19T09:15:18.331083+00:00 heroku[web.1]: State changed from starting to crashed
Heroku的web进程类型强制要求应用在60秒内绑定到指定的$PORT环境变量,但你的Discord Bot是后台服务,根本不需要启动HTTP服务器监听端口,所以得用worker进程类型来运行它才行。
正确的解决步骤:
修正Procfile内容
你的Bot是Node.js编写的,所以Procfile的正确内容应该是:worker: node index.js注意这几点:
- 文件名必须是Procfile(首字母大写,没有任何后缀,绝对不能写成Procfile.txt)
- 一定要放在项目的根目录下
- 你之前尝试的
worker: java -jar...完全不对,因为你的代码是Node.js程序,不是Java jar包
在Heroku控制台调整进程配置
光改Procfile还不够,必须在Heroku后台关闭默认的web进程,启用worker进程:- 登录Heroku仪表盘,找到你的Bot应用
- 进入「Resources」标签页
- 找到「web npm start」这一行,点击右侧的铅笔图标,取消勾选后保存更改
- 找到「worker node index.js」这一行,勾选它并保存更改
重新部署应用
把修改后的Procfile提交到Git仓库,再重新部署到Heroku:git add Procfile git commit -m "Switch to worker process for Discord Bot" git push heroku main
为什么之前修改Procfile无效?
大概率是这两个原因:
- 你没关闭Heroku上默认运行的
web进程,Heroku还是会尝试启动web进程,结果因为没绑定端口超时崩溃 - Procfile的格式或文件名错误,比如写成了小写的
procfile,或者带了.txt后缀,导致Heroku识别不到正确的进程配置
最后检查下你的Bot代码,确认没有意外启动HTTP服务的逻辑(从你提供的代码来看是没有的),这样配置后,worker进程不会被要求绑定端口,就能稳定运行了。
内容的提问来源于stack exchange,提问作者thediscorddboi

