部署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你的代码,大功告成!

你可能感兴趣的:(部署Wagtail CMS到Heroku)