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

How to deploy / migrate an existing django app / project to a production server on Heroku?

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

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

我的 Procfile 中的所有内容是这样的:

网络:python website/manage.py runserver

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

我两天前刚给自己画了这张单子。 按照 Heroku's help pages for python.

中描述的步骤后将其组合在一起

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

还有一些问题需要彻底检查,例如出于安全原因,media/ 上传文件的目录 should/could 位于项目外部(现在可以使用了,但我注意到如果测功机休眠,则文件不会 reached/displayed模板稍后)。 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)

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

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

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

例如

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

and/or 如果需要手动设置它们(在我的例子中 .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 仓库(he 分支)

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 数据库上创建表

heroku run python manage.py migrate

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

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/

和数据库

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

如果你知道一些 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。 :)