如何解决Heroku上Nextcord.py Discord Bot连接CockroachDB失败问题
Heroku部署Nextcord Bot连接CockroachDB问题排查与解决
问题背景
使用Nextcord.py开发的Discord Bot,本地可正常连接CockroachDB,但部署到Heroku后出现两类异常:
- Web进程部署:触发R10启动超时错误
- Worker进程部署:Bot命令可正常执行,但数据库连接超时
问题1:Web进程R10启动超时错误
错误日志
2023-06-14T10:29:55.300444+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
原因
Heroku的Web进程强制要求应用在60秒内绑定到$PORT环境变量指定的HTTP端口,但Discord Bot是后台服务,不需要监听HTTP请求,因此不适合使用Web进程类型。
解决方法
确认项目根目录的Procfile配置为Worker进程:
worker: python your_bot_main_file.py
(将your_bot_main_file.py替换为你的Bot入口文件名)
问题2:Worker进程数据库连接超时
错误日志
2023-06-14T10:46:44.323804+00:00 app[worker.1]: psycopg2.OperationalError: connection to server at "enter server here" (IP), port 32481 failed: Connection timed out 2023-06-14T10:46:44.323805+00:00 app[worker.1]: Is the server running on that host and accepting TCP/IP connections?
可能原因及解决方法
1. CockroachDB IP白名单未包含Heroku出站IP
Heroku应用使用动态出站IP,需将Heroku官方公布的所有出站IP段添加到CockroachDB的IP允许列表:
- 登录CockroachDB控制台,进入对应集群的网络设置页面
- 将Heroku出站IP范围添加至允许访问的IP列表
2. SSL配置不完整(sslmode=verify-full时)
当sslmode设为verify-full时,psycopg2需要验证服务器证书,必须指定根证书路径:
- 下载CockroachDB的根证书(
root.crt),放置到项目根目录 - 修改数据库连接代码,添加
sslrootcert参数:
conn = psycopg2.connect( host=os.getenv('HOST'), port=os.getenv('PORT'), database=os.getenv('DATABASE'), user=os.getenv('USER'), password=os.getenv('PASSWORD'), sslmode=os.getenv('SSLMODE'), sslrootcert='root.crt' )
- 确保
root.crt已提交到Git(不要添加到.gitignore)
3. 环境变量配置错误
- 检查
PORT变量为纯数字格式,无额外符号或引号 - 核对
HOST、USER、PASSWORD等参数与CockroachDB控制台提供的信息完全一致 - 在Heroku控制台设置→Config Vars中重新确认所有变量值
4. 手动测试连接有效性
通过Heroku命令行直接测试数据库连接,定位具体错误:
heroku run python -c "import psycopg2; import os; conn = psycopg2.connect(host=os.getenv('HOST'), port=os.getenv('PORT'), database=os.getenv('DATABASE'), user=os.getenv('USER'), password=os.getenv('PASSWORD'), sslmode=os.getenv('SSLMODE'), sslrootcert='root.crt')"
内容的提问来源于stack exchange,提问作者Natan Niemetz
相关产品推荐
相关产品推荐

