部署Wagtail CMS到Heroku

英文原文来自 https://wagtail.io/blog/deploying-wagtail-heroku/
文章是去年的,较老了,可以对比 https://github.com/torchbox/wagtaildemo 该项目进行学习

Heroku是一个好的平台,当我们尝试部署一个网站时,它免去了很多系统管理的麻烦。但是你需要知道它的特质来部署Wagtail。

  • 在本教程结束时,你会在Heroku上运行一个简单并能执行工作的Wagtail内容管理网站。
  • 开始前的准备工作:
    • 你有一个Heroku的帐户,并且已经执行了它的基本安装说明。
    • 最好使用python3
    • Linux和OS X使用没问题。但是Windows使用会有些小障碍。

按常规创建自己的wagtail工程

wagtail start project .etc

  • 或者可以利用wagtaildemo-torchbox

使项目适用Heroku

  • 使用pip freeze或者直接添加requirements.txt文件内容
pip install xxx
pip freeze > requirements.txt
# 以下为requirements.txt中部分内容
# Dependencies for Heroku deployment
dj-database-url==0.3.0
whitenoise==2.0.4
uwsgi==2.0.11.2
  • 在项目根目录创建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 对它的解读是,我们的应用通过运行 wsgi.py 启动,并且应用将使用 gunicorn 作为 Web 服务器。

在Heroku上使用指定版本的python

  • 在项目根目录下创建runtime.txt文件,并添加python-3.4.3,即你需要的Python版本。

为Heroku更新你的项目配置

  • 当我们的app能被全网访问时,我们要使用生产环境配置而不是本地开发配置。我们的本地配置中Debug=True,并且使用了不安全的Django内置静态文件服务系统。
  • 首先,我们需要增加以下设置到我们的生产环境配置文件production.py中。这些新的设置允许我们利用Heroku的PostgreSQL数据库插件。要使Heroku能够在它自动生成的域名上运行我们的app,ALLOWED_HOSTS的设置是必须的。
# 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 = ['*']

创建一个git库

  • 在我们的app正式运行之前,我们需要告诉Herko使用我们的生产环境配置文件。为此,我们需要创建一个git仓库并且做初步的部署来让Heroku来建立环境。首先,我们需要创建一个.gitignore文件添加如下内容
*.pyc
.DS_Store
*.swp
/venv/
/static/
/media/
.env

然后我们需要初始化我们的仓库,并做第一次提交,创建我们的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

  • 我们希望我们的生产环境配置尽可能的安全,所以我们不想将他们保存在我们的git仓库中。因此,我们创建一个特殊的文件,它能够将某些敏感配置信息转换为能被production.py文件引用的环境变量
  • 首先,我们在项目根目录下创建一个.env文件。你会记得我们已经将它加入了.gitignore文件。
  • 在文件中加入
DJANGO_SETTINGS_MODULE=project_title.settings.production
SECRET_KEY='####' #Replace this with your own randomly generated, 50 character key

第一行指定Heroku应使用生产设置文件。第二个是站点密钥,为安全着想,我们希望从我们的production.py文件之外引用它。

  • 为了使用上述配置,我们需要在production.py文件顶部加入:
import os
env = os.environ.copy()
SECRET_KEY = env['SECRET_KEY']

第一步我们将环境变量对象赋给一个本地变量,然后在真正的配置文件中引用SECRET_KEY环境变量。
之后我们提交配置到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。
  • 现在可以通过命令heroku open来打开你的app,然后转到/admin。但是我们发现没有任何的静态文件提供的样式和图片,这是因为Django自身不能在生产环境提供静态文件服务。
  • 下面我们开始使用Whitenoise来解决问题。

在Heroku上提供静态文件服务

  • Whitenoise是一个python库,它允许Django在不依赖CDN的情况下提供自己的静态文件。我们先安装它并添加到需求文件。
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功能,并且激活离线压缩功能,来产生admin界面的静态资源。在production.py中添加如下内容:
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'
  • 通常我们将在服务器上运行命令python manage.py compress来产生静态文件,然后一切OK。但是Heroku并不这样工作。你可以登录Heroku并且运行compress,但是当你离开那个会话时那些压缩文件就会被删除。因此我们需要利用Heroku在部署过程中提供的钩子,并且在部署时包含一组预处理命令。
  • 幸运的是已经有人为我们创建了一系列脚本来做所有我们需要做的事,即heroku-django-cookbook。我们只需要简单地将该仓库中的bin文件夹拷贝到我们的工程根目录。
  • 最后再次add,commit和push你的代码,大功告成!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容

  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 2,967评论 1 3
  • Python 资源 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理。a...
    叶冷随记阅读 7,799评论 1 225
  • Python 资源大全中文版 awesome-python[https://github.com/vinta/aw...
    万色星辰阅读 9,763评论 0 256
  • 最好的春节在童年,这是很多人的共同感觉。 如果你也这样认为——恭喜你,这是你拥有“一个比较幸福的童年”的最好佐证。...
    小月同学阅读 570评论 26 3
  • 一个是尘世放牛郎,一个是九天织绣女,缘起偷衣裙,这样的初识初遇,不如那场西湖大雨油纸伞,也不如书院痴情小姐扮儒生,...
    Young广遇阅读 280评论 5 2