Heroku 部署说明

Heroku本为提供Ruby云环境的平台,不过现在也支持 Python ,下面将描述如何在它上面 部署 Uliweb。此应用以 simple_todo 为例,可以从 uliweb-doc/projects 中得到。

客户端下载及登录

首先保证你已经有了 heroku 的帐号。然后去它的客户端页面下载合适的客户端,这里我 以windows客户端为例。下载并安装后,首先执行:

heroku login

根据提示输入你的邮箱和密码,然后它会自动查找本地的ssh公钥,如果找到,则会问你是 否要上传。因为我以前已经安装过 git 所以已经生成过公钥。

创建项目

首先在本地创建一个目录作为你的项目目录,如: herodu。进入这个目录,然后执行:

heroku create --stack cedar

执行如图:

_images/heroku1.png

我们可以从结果中看到已经生成了可访问的URL和git仓库地址。在后面我们可以改个名。 不过我试了,如果还没有上传过代码,好象改不了。

文本没有使用virtualenv来创建 Python 环境,所以省略了这块的处理。

编写代码

首先保证你的uliweb的版本在 0.1.1 以上,因为从 0.1.1 才支持 heroku 。在项目目录 下执行:

uliweb support heroku

这样会在当前目录下生成:

lib/
.gitignore
app.py
Procfile
requirements.txt

其中:

lib/
用来存放你想上传的一些库。不过在一般情况下,你可以通过 requirements.txt 来安装,因此不一定需要。不过在 app.py 中会将 lib 目录添加到 sys.path 中。
.gitignore
因为 heroku 使用的是 git 上传版本,所以这里提供了一个简单的 .gitignore 文件, 你可以根据需要进行修改。
app.py
启动文件。它会自动识别 os.environ['PORT'] 如果没有缺省使用 5000 端口, 同时将 IP 绑定到 0.0.0.0 上。
Procfile

Heroku 会采用 foreman 来启动应用,你可以在本地用它来启动 uliweb 项目。访问 地址可以是 http://localhost:5000

Note

因为我更熟悉nginx+uwsgi的模式,因此使用foreman的话不知道有没有性能问题。 并且没有看到如何配置静态文件?所以在我的试验中能用开发服务器来提供服务和 静态文件的支持。

requirements.txt

pip 安装需求文件,缺省要安装:

Uliweb==0.1.1
psycopg2==2.4.5
SQLAlchemy==0.7.7

因为 heroku 采用的是 postgreSql 数据库。

然后将 simple_todo (在uliweb-doc/projects/simple_todo下) 的代码拷贝到项目目录下。 注意,这里没有单独创建一个project的项目目录,而是直接使用项目目录。所以在这个目 录下应该直接有 apps 子目录。当前目录结构如:

_images/heroku2.png

因为 heroku 可以直接运行后端的命令,因此就可以直接运行 uliweb 的命令行工具,如 同步数据库。所以将项目目录直接做为uliweb项目是为了方便执行命令行。

接着修改 apps/settings.ini ,内容为:

[GLOBAL]
DEBUG = True

INSTALLED_APPS = [
    'uliweb.contrib.staticfiles',
    'uliweb.contrib.orm',
    'uliweb.contrib.heroku',
    'todo',
    ]

[SITE]
SITE_NAME = '任务跟踪'
EMAIL = 'limodou@gmail.com'

在Heroku是可以使用 Debug 调试的。上面在 uliweb.contrib.orm 后面安装了 uliweb.contrib.heroku 。 在 uliweb.contrib.heroku 中可以自动从 os.environ 中获得 DATABASE_URL 的信息。

上面的代码基本上写好了。然后我们直接上传。

上传代码

首先在本地创建GIT创建,把所有代码提交进去:

git init
git add .
git commit -m "message"

然后检查一下remote中是不是有heroku:

git remote

如果没有则将上面的git地址添加到remote中去:

git remote add heroku <heroku地址>

然后开始push代码:

git push heroku master

在push成功时,会根据相关的requirements.txt等信息开始后台的部署和服务启动。但是 此时很有可能数据库还未生效。前面已经说了,uliweb.contrib.heroku 会从环境变量中 获得数据库连接的串,而uliorm所使用的数据库连接和 heroku 提供的是一致的。这块都 已经由这个 app 处理了。现在的关键就是要创建数据库的实现。

创建数据库

可以先用:

heroku config

结果如图:

_images/heroku3.png

可以看到有 DATABASE_URL 的信息。如果没有,说明数据库实例没有创建,则可以执行:

heroku addons:add shared-database

应用改名

前面说了,如果觉得自建的应用名不好看,可以修改一下,使用:

heroku rename <你想改的名字>

一旦名字修改了,你的服务URL和git的地址都将发生变化。不过服务地址会自动变化,所以 不用做什么特殊处理。

数据库表的同步

代码传完了,名字也改了,数据库也建了,但是访问 simple_todo 还是有问题,因为这个 例子需要创建一个 todo 的表。heroku没有提供phpadmin,不过它可以在本地执行远端的 命令,所以很方便,下面执行:

heroku run uliweb syncdb

这里你会看到 todo 表被创建的信息。这样就可以访问你的应用了。我的例子是 http://uliweb.herokuapp.com/

调试

在heroku上可以直接查看出错页面,所以还是挺方便。同时如果想看日志,可以执行:

heroku logs

参考

参考原 Heroku 的文档有些问题并不能解决,有些是通过这篇文档来解决的。

部署Python网站到Heroku云平台