如何将现有的 django 应用程序/项目部署/迁移到 Heroku 上的生产服务器?
How to deploy / migrate an existing django app / project to a production server on Heroku?
我有一个基本的 django 应用程序 (Newsdiffs),它在 localhost:8000
和 python 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。 :)
我有一个基本的 django 应用程序 (Newsdiffs),它在 localhost:8000
和 python 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 cfgDATABASES['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。 :)