Heroku无法识别migrations、线上部署报R10/H10错误求助
故障根因
你遇到的线上崩溃不是未应用迁移直接导致的,核心触发原因有两个:
- 启动命令硬编码了端口
5000,但Heroku会为每个web进程动态分配端口,存在$PORT环境变量中,你绑定固定端口无法被Heroku检测到,触发R10启动超时错误,进程直接被系统杀死 - 线上使用了Django自带的
runserver开发服务器,它仅适用于本地调试,性能、稳定性都不满足生产环境要求,也是启动异常的诱因
至于未应用迁移的提示,是因为Heroku线上的数据库和你本地数据库是独立的,你本地执行过迁移只会同步本地库,线上库还没执行对应的迁移操作,所以会出现本地无迁移可做、线上提示未迁移的情况。
修复步骤
1. 调整依赖和Procfile配置
Procfile是Heroku用来识别进程启动命令的配置文件,不需要和JSON相关,适配你的Django项目按以下步骤修改即可:
- 先确保你的
requirements.txt中添加了生产WSGI服务器依赖gunicorn,如果没有就本地执行pip install gunicorn,再更新requirements.txt - 把项目根目录的Procfile内容替换为:
web: gunicorn store.wsgi --log-file -
(你日志中显示配置文件为store.settings,说明你的项目主文件夹名为store,所以直接用上面的配置即可,不需要额外修改)gunicorn启动时会自动读取Heroku分配的$PORT环境变量绑定端口,不会再出现R10错误。
2. 调整Django生产配置
打开Django项目的settings.py,修改ALLOWED_HOSTS配置,添加你的Heroku应用域名,避免访问拦截:
ALLOWED_HOSTS = ['shrouded-bastion-04661.herokuapp.com', '127.0.0.1']
3. 执行线上数据库迁移
代码部署完成后,在本地项目目录执行Heroku CLI命令,直接在远程线上环境执行迁移:heroku run python manage.py migrate
验证
所有修改完成后重新提交代码部署到Heroku,部署完成后再访问应用即可正常运行。
内容的提问来源于stack exchange,提问作者VaultDweller
相关产品推荐
相关产品推荐

