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



我有一个基本的django应用程序(Newsdiffs)在localhost:8000python website/manage.py runserver运行良好,但我想将其迁移到Heroku,我不知道我的下一步是什么。

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

所有在我的个人档案是这样的:

web: python website/manage.py runserver

在本地,这工作得很好,尽管它在http://127.0.0.1:8000/上启动它,这可能不是我想在Heroku上看到的。那么如何确定在哪里设置主机名和端口呢?我在应用里都没看到。

我两天前刚刚为自己画了这个清单。它是按照Heroku的python帮助页面中描述的步骤组装起来的。

这绝不是确定的,也不是完美的,它会改变,但这是一个有效的跟踪,因为我能够把网站上线。

仍然存在一些问题,要彻底检查,例如,出于安全原因,上传文件的media/目录的位置应该/可以在您的项目之外(现在它有效,但我已经注意到,如果dyno休眠,那么文件不会被模板到达/显示)。对于staticfiles/目录也是如此(尽管这个似乎工作得很好)。

也可以将django的调试模式设置为false。

在这里:

将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)

,并创建一个新的git分支,用于heroku twidering,以防止把事情搞砸

git checkout -b he

1)在heroku上创建应用

heroku create xyz

还将heroku添加为您的repo的远程地址

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
设置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'

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

编辑.env文件
vi .env

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

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?!
把你的代码推送到heroku
git push heroku he:master

heroku ps:scale web=1

14)在heroku DB上创建表

heroku run python manage.py migrate

注意:如果你看到这样的消息:"你刚刚安装了Django的认证系统,这意味着你没有定义任何超级用户。"您现在想创建一个吗?,输入no.

15)添加超级用户到heroku数据库

heroku run bash
python manage.py createsuperuser

和往常一样填写细节

用必要的fixture填充DB
heroku run python manage.py loaddata yourfile.json

17)访问heroku的web服务器的网页

heroku open

或转到

https://xyz.herokuapp.com/

和admin

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 shellheroku run bash

  • 在Heroku上设置配置变量

    heroku config:set VARNAME=whatever

  • 查看已设置的配置变量(包括DB的)

    heroku config

  • 查看postgres数据库详细信息

    heroku pg

如果你了解一些python,并且有很多用其他语言构建web应用程序的经验,但不完全理解Heroku适合哪里,我强烈推荐Discover Flask,它弥补了我对这些部分如何组合在一起的理解中的许多漏洞。

我想出来的一些事情:

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

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

  • "Procfile"不只是给出你用来在本地运行应用程序的命令。这是希罗库的要求。如果你有一个在Heroku上运行的应用,但它不包括Procfile,他们就遗漏了一些东西。

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

  • Heroku不支持sqlite。你必须在Postgres中运行你的生产数据库。

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

最新更新