簡體   English   中英

如何將現有的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正在啟動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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM