[英]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
正在啟動dev設置,但我不確定如何告訴它使用主要設置。
我的Procfile中的全部是這樣的:
網址: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)
並為heroku twiddling創建一個新的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配置)
編輯.env
文件
vi .env
例如
DJANGO_SECRET_KEY=whatever
EMAIL_HOST_USER=youruser@gmail.com
EMAIL_HOST_PASSWORD=whateveritis
和/或根據需要手動設置它們(在我的情況下, .env
無效,顯然沒有加載,並且現在必須手動設置var)
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 repo(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 DB上創建表
heroku run python manage.py migrate
注意:如果您看到一條消息,說:“您剛剛安裝了Django的auth系統,這意味着您沒有定義任何超級用戶。 您要立即創建一個嗎?”,鍵入否。
15)將超級用戶添加到heroku數據庫
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 DB詳細信息
heroku pg
如果您了解python並在構建其他語言的Web應用程序方面有很多經驗,但又不完全了解Heroku的適用范圍,那么我強烈建議您使用Discover Flask ,它為我理解這些部分如何組合提供了很多漏洞。
我解決的一些問題:
如果要部署到Heroku,則確實確實需要一個隔離的虛擬環境,因為Heroku會從requirements.txt文件中安裝Python模塊。
Gunicorn是一個Web服務器,您肯定需要在Gunicorn下運行您的應用程序,否則它將無法在Heroku上運行。
“ Procfile”不僅提供用於在本地運行應用程序的命令。 而Heroku則需要它。 因此,如果您擁有一個在Heroku上運行的應用程序,並且其中不包含Procfile,則它們會遺漏一些東西。
您不會告訴Heroku您的主機名是什么。 當您運行heroku create
它應該告訴您您的域名是什么。 每次您運行git push heroku master
(或您要推送的任何分支,也許不是master
)時,Heroku都會(嘗試)重新啟動您的應用程序。
Heroku 不支持sqlite 。 您必須在Postgres中運行生產數據庫。
這並不能直接回答我的問題,但是確實可以填補一些遺漏的部分,這使我什至很難提出正確的問題。 盡管有RTFM。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.