英文原文來自 https://wagtail.io/blog/deploying-wagtail-heroku/
文章是去年的媒至,較老了授瘦,可以對比 https://github.com/torchbox/wagtaildemo 該項(xiàng)目進(jìn)行學(xué)習(xí)
Heroku是一個好的平臺寇蚊,當(dāng)我們嘗試部署一個網(wǎng)站時(shí)肌似,它免去了很多系統(tǒng)管理的麻煩锭亏。但是你需要知道它的特質(zhì)來部署Wagtail。
- 在本教程結(jié)束時(shí)茬腿,你會在Heroku上運(yùn)行一個簡單并能執(zhí)行工作的Wagtail內(nèi)容管理網(wǎng)站。
- 開始前的準(zhǔn)備工作:
- 你有一個Heroku的帳戶宜雀,并且已經(jīng)執(zhí)行了它的基本安裝說明切平。
- 最好使用python3
- Linux和OS X使用沒問題。但是Windows使用會有些小障礙辐董。
按常規(guī)創(chuàng)建自己的wagtail工程
wagtail start project
.etc
- 或者可以利用wagtaildemo-torchbox
使項(xiàng)目適用Heroku
- 使用pip freeze或者直接添加requirements.txt文件內(nèi)容
pip install xxx
pip freeze > requirements.txt
# 以下為requirements.txt中部分內(nèi)容
# Dependencies for Heroku deployment
dj-database-url==0.3.0
whitenoise==2.0.4
uwsgi==2.0.11.2
- 在項(xiàng)目根目錄創(chuàng)建Procfile文件悴品,并添加
web: uwsgi --http :$PORT --module wagtaildemo.heroku_wsgi --master --processes 2 --static-map /media/=/app/media/ --offload-threads 1
或者最簡情況
web: gunicorn gettingstarted.wsgi
Heroku 對它的解讀是,我們的應(yīng)用通過運(yùn)行 wsgi.py 啟動简烘,并且應(yīng)用將使用 gunicorn 作為 Web 服務(wù)器苔严。
在Heroku上使用指定版本的python
- 在項(xiàng)目根目錄下創(chuàng)建
runtime.txt
文件铝宵,并添加python-3.4.3
云稚,即你需要的Python版本。
為Heroku更新你的項(xiàng)目配置
- 當(dāng)我們的app能被全網(wǎng)訪問時(shí)黄橘,我們要使用生產(chǎn)環(huán)境配置而不是本地開發(fā)配置亥至。我們的本地配置中Debug=True悼沈,并且使用了不安全的Django內(nèi)置靜態(tài)文件服務(wù)系統(tǒng)。
- 首先姐扮,我們需要增加以下設(shè)置到我們的生產(chǎn)環(huán)境配置文件production.py中絮供。這些新的設(shè)置允許我們利用Heroku的PostgreSQL數(shù)據(jù)庫插件。要使Heroku能夠在它自動生成的域名上運(yùn)行我們的app茶敏,
ALLOWED_HOSTS
的設(shè)置是必須的壤靶。
# Parse database configuration from $DATABASE_URL
import dj_database_url
DATABASES['default'] = dj_database_url.config()
# Honor the 'X-Forwarded-Proto' header for request.is_secure()
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# Allow all host headers
ALLOWED_HOSTS = ['*']
創(chuàng)建一個git庫
- 在我們的app正式運(yùn)行之前,我們需要告訴Herko使用我們的生產(chǎn)環(huán)境配置文件惊搏。為此贮乳,我們需要創(chuàng)建一個git倉庫并且做初步的部署來讓Heroku來建立環(huán)境忧换。首先,我們需要創(chuàng)建一個.gitignore文件添加如下內(nèi)容
*.pyc
.DS_Store
*.swp
/venv/
/static/
/media/
.env
然后我們需要初始化我們的倉庫向拆,并做第一次提交亚茬,創(chuàng)建我們的Heroku app,并且提交我們的倉庫到Heroku浓恳。
git init
git add .
git commit -m "first commit to heroku"
heroku create
# Creates a new Heroku app and connects it to your initialised git repo
git push heroku master
# Pushes your commited code up to your new ap
heroku run python manage.py migrate
# Heroku allows you to run shell commands remotely with the 'heroku run' command.
heroku run python manage.py createsuperuser
# Creates a new superuser on Heroku
heroku ps:scale web=1
# Ensures that a new Dyno is running for your project
提交配置到Heroku
- 我們希望我們的生產(chǎn)環(huán)境配置盡可能的安全刹缝,所以我們不想將他們保存在我們的git倉庫中。因此颈将,我們創(chuàng)建一個特殊的文件梢夯,它能夠?qū)⒛承┟舾信渲眯畔⑥D(zhuǎn)換為能被production.py文件引用的環(huán)境變量
- 首先,我們在項(xiàng)目根目錄下創(chuàng)建一個
.env
文件晴圾。你會記得我們已經(jīng)將它加入了.gitignore文件颂砸。 - 在文件中加入
DJANGO_SETTINGS_MODULE=project_title.settings.production
SECRET_KEY='####' #Replace this with your own randomly generated, 50 character key
第一行指定Heroku應(yīng)使用生產(chǎn)設(shè)置文件。第二個是站點(diǎn)密鑰死姚,為安全著想人乓,我們希望從我們的production.py文件之外引用它。
- 為了使用上述配置知允,我們需要在production.py文件頂部加入:
import os
env = os.environ.copy()
SECRET_KEY = env['SECRET_KEY']
第一步我們將環(huán)境變量對象賦給一個本地變量撒蟀,然后在真正的配置文件中引用SECRET_KEY
環(huán)境變量。
之后我們提交配置到Heroku温鸽。我們先安裝一個插件保屯,然后使用命令上傳:
heroku plugins:install git://github.com/ddollar/heroku-config.git
heroku config:push
最后,我們需要重新提交修改后的配置文件到Heroku:
git add .
git commit -m "Changing to use production settings"
git push heroku master
- 恭喜涤垫!我們成功部署了wagtail到Heroku姑尺。
- 現(xiàn)在可以通過命令
heroku open
來打開你的app,然后轉(zhuǎn)到/admin
蝠猬。但是我們發(fā)現(xiàn)沒有任何的靜態(tài)文件提供的樣式和圖片切蟋,這是因?yàn)镈jango自身不能在生產(chǎn)環(huán)境提供靜態(tài)文件服務(wù)。 - 下面我們開始使用Whitenoise來解決問題榆芦。
在Heroku上提供靜態(tài)文件服務(wù)
- Whitenoise是一個python庫柄粹,它允許Django在不依賴CDN的情況下提供自己的靜態(tài)文件。我們先安裝它并添加到需求文件匆绣。
pip install whitenoise
pip freeze > requirements.txt
- 然后我們通過修改wsgi.py文件來告訴Heroku我們要使用它:
import os
from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise
#
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_title.settings")
#
application = get_wsgi_application()
application = DjangoWhiteNoise(application)
- 我們將使用Whitenoise的gzip功能驻右,并且激活離線壓縮功能,來產(chǎn)生admin界面的靜態(tài)資源崎淳。在production.py中添加如下內(nèi)容:
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
COMPRESS_OFFLINE = True
COMPRESS_CSS_FILTERS = [
'compressor.filters.css_default.CssAbsoluteFilter',
'compressor.filters.cssmin.CSSMinFilter',
]
COMPRESS_CSS_HASHING_METHOD = 'content'
- 通常我們將在服務(wù)器上運(yùn)行命令
python manage.py compress
來產(chǎn)生靜態(tài)文件堪夭,然后一切OK。但是Heroku并不這樣工作。你可以登錄Heroku并且運(yùn)行compress
森爽,但是當(dāng)你離開那個會話時(shí)那些壓縮文件就會被刪除恨豁。因此我們需要利用Heroku在部署過程中提供的鉤子,并且在部署時(shí)包含一組預(yù)處理命令爬迟。 - 幸運(yùn)的是已經(jīng)有人為我們創(chuàng)建了一系列腳本來做所有我們需要做的事橘蜜,即heroku-django-cookbook。我們只需要簡單地將該倉庫中的bin文件夾拷貝到我們的工程根目錄雕旨。
- 最后再次add扮匠,commit和push你的代碼,大功告成凡涩!