在heroku上部署我的app

heroku从2022.11.28起就要停止免费产品计划了;-;,所以我使用render作为替代品。

最近学了一点flask,听说heroku能免费部署小型应用,就想试着把我最近写的一个放上去试试。
以下为这次踩坑的记录:

安装

注册好账号后,安装heroku CLI

输入:

1
$ heroku --version

出现版本提示即为安装完成。

部署

我按照dashboard中deploy选项卡中对heroku git使用的介绍,做出以下操作:

1
2
3
4
5
6
7
$ heroku login
$ heroku create
$ git init
$ heroku git:remote -a 给你发的随机仓库名
$ git add .
$ git commit -m "msg here"
$ git push heroku main

如果heroku login登录出现ip不匹配的情况,请使用heroku login -i

然后报错,看了一下似乎是没有设置buildpacks,所以我设置了buildpacks:

1
$ heroku buildpacks:set heroku/python

然后再次push,结果还是报错,于是我查看Activity选项卡中的日志,发现App not compatible with buildpack: https://buildpack-registry.s3.amazonaws.com/buildpacks/heroku/python.tgz

诶然后我就跟着那个网址下载下来一个压缩包,解压之后看了一下里面的README.md,发现可能是因为缺少requirements.txtruntime.txt导致的错误。

随后我查阅heroku关于python部署的官方文档示例文档,再进行以下操作:

1
$ git clone https://github.com/heroku/python-getting-started.git

打开之后把requirements.txtruntime.txt复制到我app的文件夹中,再次push,成了!ohhhhhhhhhhhhhhhhhh(

总算把我的app整上去了。但是新的问题又来了,它似乎不能正常工作:
image.png

我尝试了:

1
$ heroku ps:scale web=1

但是不管等多久,都是Couldn't find that process type (web),执行heroku logs --tail查看日志发现No web processes running(H14)

在网上查找到了这篇文章,然后又被指路到了另一篇文章,了解到需要添加一个叫Procfile的文件并在里面填上大致如下的内容:

1
web: python website/manage.py runserver 0.0.0.0:$PORT

我根据我的文件名和端口进行修改,填完之后再次执行上上步的操作:

1
2
$ heroku ps:scale web=1
Scaling dynos... done, now running web at 1:Free

现在看起来似乎是正常的了,但是打开网页一看还是不行,然后错误也换了一个变为App crashed(H10)

1
$ heroku local web

执行以上操作,发现他不能打开我的文件,说是没有这个这个目录!?

1
2
3
4
$ heroku local web
2:31:42 ├F10: PM┤ web.1 | python: can't open file 'C:\Users\bujijam\desktop\gluebottle\website\main.py': [Errno 2] No such file or directory
[DONE] Killing all processes with signal SIGINT
2:31:42 ├F10: PM┤ web.1 Exited with exit code null

我定睛一看,可能是要把文件放在website文件夹下。我将main.pytemplatesstatic这俩文件夹一起移动到了新文件夹。(位置不对的话jinja2会找不到模板文件)

在此操作,ohhhhhhhhhhhhhhhhh能在本地上运行了!但是网站上仍然不能运行。

然后我再次翻日志,发现python报了一行错提示没有flask模块,然后我才发现我搬过来的requirements.txt中没有flask……

加上之后再试一遍,很好,flask装上了,但是仍旧出错H10。

随后我注意到日志中有一行Permission denied,这让我联想到了app运行时给我的警告:

1
2
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.

我猜有可能跟这个有点关系(即使没关系我也应该使用wsgi启动服务来部署线上),随后我改了我的代码,在requirements.txt添加上gevent

情况没有改变,不过报错总算换了一个了,而且是python的报错:

1
PermissionError: [Errno 13] Permission denied: ('0.0.0.0', 80)

我在网上查找到这篇文章,随后试着把端口改成5000(flask默认分配的端口),然后错误又换了一个:

1
2
3
2022-08-24T13:05:30.334183+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2022-08-24T13:05:30.393331+00:00 heroku[web.1]: Stopping process with SIGKILL
2022-08-24T13:05:30.538726+00:00 heroku[web.1]: Process exited with status 137

端口绑不上?我纳闷了,明明Procfile中的端口和我app中的端口设置的都是5000,为什么会绑不上?

然后我看了这篇文章,直接就恍然大悟,我赶紧把我Procfile中的端口又改了回去$PORT,然后对app进行改动。

1
2
3
4
2022-08-25T06:49:59.166716+00:00 heroku[web.1]: State changed from crashed to starting
2022-08-25T06:50:01.682779+00:00 heroku[web.1]: Starting process with command `python website/main.py runserver 0.0.0.0:21463`
2022-08-25T06:50:03.586050+00:00 heroku[web.1]: State changed from starting to up
2022-08-25T06:50:03.000000+00:00 app[api]: Build succeeded

成功了!ohhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh!

补充

由于heroku马上就要不免费了,所以我换成了render。可以参阅render官方文档从heroku上进行转移。

我的网站:https://damp-shelf-90170.onrender.com/

不得不说render的构建速度真的感人,对非vip的限制太狠了;-;