如何在Heroku上将现有的django应用程序/项目部署/迁移到生产服务器?

时间:2015-09-16 05:21:57

标签: python django heroku deployment web-deployment

我有一个基本的django应用程序(Newsdiffs)在localhost:8000 python website/manage.py runserver运行得很好但是我想将它迁移到Heroku而我无法弄清楚是什么我的下一步是。

我认为让它在本地运行会转换为在Heroku上运行它,但我意识到python website/manage.py runserver正在启动开发设置,我不知道如何告诉它使用主设置。

我的Procfile中的所有内容都是:

web:python website / manage.py runserver

在本地,这样可以正常工作,虽然它会在http://127.0.0.1:8000/启动它,这可能不是我想要的Heroku。那么我该如何确定在哪里设置主机名和端口?我在任何地方的应用程序中都没有看到。

2 个答案:

答案 0 :(得分:2)

我刚刚在两天前为自己画了这个清单。 按照Heroku's help pages for python中描述的步骤将它放在一起。

它绝不是决定性的,也不是完美的,它会改变,但它是一个有效的痕迹,因为我能够将网站放到网上。

仍有一些问题需要彻底检查,例如:出于安全原因,文件上传的media/目录的位置应该/可能存在于项目之外(现在它可以工作,但是我注意到dyno会睡觉然后模板没有到达/显示文件) 。 staticfiles/目录也是如此(尽管这个目录似乎工作正常)。

此外,您可能希望将django的调试模式设置为false。

所以这是:

我将EXISTING django应用程序部署到Heroku的第一步

假设:

a)您的django项目已经在虚拟环境中

b)您已经使用

收集了所有项目所需的软件包
pip freeze > requirements.txt

并将其提交给git

git add requirements.txt
git commit -m 'my prj requirements'

0)激活项目的虚拟环境

workon xyz  #using virtualenvwrapper

然后转到你的django项目目录(简称DPD),如果还没有那里那么

cd ~/prj/xyz  (or cdproject with virtualenvwrapper if setup properly)

并为heroku创建一个新的git分支,以防止搞砸事情

git checkout -b he

1)在heroku上创建应用

heroku create xyz

还将heroku添加为您的仓库的远程

2)将所需的包添加到requirements.txt

vi requirements.txt

添加

dj-database-url==0.3.0
django-postgrespool==0.3.0
gunicorn==19.3.0
psycopg2==2.6
django-toolbelt==0.0.1
static3==0.5.1
whitenoise==2.0.3

3)在本地venv

中安装所有依赖项
pip install -r requirements.txt --allow-all-external

4)设置heroku django设置

cd xyz

创建副本

cp setting.py settings_heroku.py

并编辑

vi settings_heroku.py

import os
import dj_database_url

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'), )
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
SECRET_KEY = os.environ["DJANGO_SECRET_KEY"]
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

替换django的std db cfg
DATABASES['default'] =  dj_database_url.config()
DATABASES['default']['ENGINE'] = 'django_postgrespool'

WSGI_APPLICATION = 'xyz.wsgi_heroku.application'

5)配置必要的环境变量(heroku configs)

编辑.env文件

vi .env

e.g。

DJANGO_SECRET_KEY=whatever
EMAIL_HOST_USER=youruser@gmail.com
EMAIL_HOST_PASSWORD=whateveritis

和/或根据需要手动设置它们(在我的情况下.env没有效果,显然没有加载,并且现在必须手动设置变量)

heroku config:set DJANGO_SECRET_KEY=whatever
heroku config:set EMAIL_HOST_USER=youruser@gmail.com
heroku config:set EMAIL_HOST_PASSWORD=whateveritis

6)为heroku创建一个单独的wsgi文件

cd xyx
cp wsgi.py wsgi_heroku.py

并对其进行编辑,使其指向正确的设置

vi wsgi_heroku.py
from whitenoise.django import DjangoWhiteNoise
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xyz.settings_heroku")
application = get_wsgi_application()
application = DjangoWhiteNoise(application) 

7)确保所有模板都使用

{% load staticfiles %}

8)定义Procfile文件,使其指向正确的wsgi

e.g。

cd ~/prj/xyz (DPD)
vi Procfile

添加

web: gunicorn xyz.wsgi_heroku --log-file -

9)将所有静态内容收集到DPD / staticfiles /

在本地,确保django指向正确的wsgi设置

export WSGI_APPLICATION=blogger.wsgi_heroku.application
python manage.py collectstatic

10)将更改添加到本地git仓库(他的分支)

git add --all .
git commit -m 'first 4 heroku'

11)检查整个事情是否在本地运作

heroku local # in heroku's help they also add `web`, not needed?!

12)将你的代码推送到heroku

git push heroku he:master

13)确保应用程序的实例正在运行

heroku ps:scale web=1

14)在heroku DB上创建表

heroku run python manage.py migrate

注意:如果您看到一条消息,“您刚刚安装了Django的auth系统,这意味着您没有定义任何超级用户。你想现在创建一个吗?“,键入号。

15)将超级用户添加到heroku DB

heroku run bash
python manage.py createsuperuser

并像往常一样填写详细信息

16)用必要的灯具填充数据库

heroku run python manage.py loaddata yourfile.json

17)访问heroku网络服务器上的网页

heroku open

或转到

https://xyz.herokuapp.com/

和管理员

https://xyz.herokuapp.com/admin/

和DB

https://xyz.herokuapp.com/db

有用的命令:

  • 查看应用的日志

    heroku logs [--tail]

  • 列出部署的附加组件

    heroku addons

    并使用一个:

    heroku addons:open <add-on-name>

  • 在heroku上运行命令(远程环境,您要部署的地方)

    heroku run python manage.py shell heroku run bash

  • 在Heroku上设置配置

    heroku config:set VARNAME=whatever

  • 查看已设置的配置变量(包括数据库)

    heroku config

  • 查看postgres数据库详细信息

    heroku pg

答案 1 :(得分:2)

如果你了解一些python,并且有很多使用其他语言构建网络应用程序的经验,但不完全了解Heroku适合的地方,我强烈推荐Discover Flask,这修复了我的很多漏洞了解这些碎片如何组合在一起。

我制定的一些事情:

  • 如果您要部署到Heroku,确实需要一个独立的虚拟环境,因为Heroku会从requirements.txt文件中安装Python模块。

  • Gunicorn是一个网络服务器,你肯定需要在Gunicorn下运行你的应用程序,否则它不会在Heroku上运行。

  • "Procfile"并不仅仅提供您用来在本地运行应用的命令。而Heroku需要它。因此,如果您有一个专为Heroku运行而构建的应用程序并且它不包含Procfile,那么他们就会遗漏一些东西。

  • 你不会告诉Heroku你的主机名是什么。当您运行heroku create时,它应该告诉您您的域名将是什么。每当你运行git push heroku master(或者你正在推动的任何分支,也许它不是master)时,Heroku将(尝试)重新启动你的应用。

  • Heroku doesn't support sqlite。您必须在Postgres中运行您的生产数据库。

这并没有直接回答我的问题,但它确实填补了一些让我难以提出正确问题的缺失部分。 RTFM尽管如此。 :)