Heroku PR App无法连接GrapheneDB问题排查求助
排查Heroku上GrapheneDB与Neo4j驱动连接握手失败的问题
看起来你已经做了不少基础排查,我再给你补充几个针对性的方向,应该能帮你定位问题:
1. 修正加密连接配置
你的驱动代码里设置了encrypted=False,但GrapheneDB在Heroku环境下的Bolt连接默认要求加密传输,非加密连接会被服务端直接关闭,这很可能是握手失败的核心原因。建议修改配置:
from django.conf import settings from django.utils.functional import SimpleLazyObject from neo4j.v1 import GraphDatabase, basic_auth, TRUST_ALL_CERTIFICATES # 替换TRUST_ON_FIRST_USE def get_driver(): return GraphDatabase.driver( settings.NEO4J_BOLT_URL, auth=basic_auth(settings.NEO4J_USERNAME, settings.NEO4J_PASSWORD), encrypted=True, # 开启加密 trust=TRUST_ALL_CERTIFICATES, # 信任Heroku环境下的证书 ) driver = SimpleLazyObject(get_driver)
同时确认settings.NEO4J_BOLT_URL的前缀是bolt+s://(加密Bolt协议),而不是普通的bolt://。
2. 升级Neo4j驱动版本
你当前使用的neo4j-driver 1.5.3是2018年的旧版本,可能和GrapheneDB当前运行的Neo4j服务版本存在协议兼容性问题。建议升级到对应Neo4j版本的稳定驱动:
- 如果GrapheneDB的Neo4j是4.x版本,升级驱动到
neo4j==4.4.12(LTS版本) - 如果是5.x版本,升级到
neo4j==5.12.0左右的稳定版
升级后重新部署Heroku应用,测试连接是否恢复。
3. 验证Heroku出站IP是否在GrapheneDB白名单中
虽然nslookup能解析IP,但Heroku dyno的出站IP可能不在GrapheneDB的访问白名单里:
- 运行
heroku run curl ifconfig.me获取当前dyno的出站IP - 登录GrapheneDB控制台,找到对应数据库的"Security"设置,将获取到的IP添加到白名单中
- 重新测试连接
4. 用最小化脚本测试连接
去掉Django的Lazy封装,写一个简单的测试脚本直接在Heroku上运行,排除框架层面的干扰:
# test_connection.py from neo4j.v1 import GraphDatabase, basic_auth, TRUST_ALL_CERTIFICATES # 直接替换成你的GrapheneDB凭证 BOLT_URL = "bolt+s://your-graphenedb-host:port" USERNAME = "your-username" PASSWORD = "your-password" try: driver = GraphDatabase.driver( BOLT_URL, auth=basic_auth(USERNAME, PASSWORD), encrypted=True, trust=TRUST_ALL_CERTIFICATES ) with driver.session() as session: result = session.run("RETURN 1 AS test") print(f"连接成功!返回结果: {result.single()['test']}") except Exception as e: print(f"连接失败,错误信息: {str(e)}")
运行heroku run python test_connection.py,查看输出的错误细节,可能会得到更明确的提示。
5. 查看GrapheneDB的服务端日志
登录GrapheneDB控制台,找到对应数据库的"Logs"页面,检查是否有关于连接拒绝的具体记录(比如认证失败、协议版本不支持、IP被拦截等),这能直接帮你定位服务端层面的问题。
内容的提问来源于stack exchange,提问作者Chad
相关产品推荐
相关产品推荐

