阅读(1144) (0)

Deploy

2016-02-24 15:57:42 更新

Deploy

目前为止,我们所有的工作都是在本机端 ( localhost ) 完成,你可以在自己电脑上的浏览器看到成果。但是,一个网站必须放在稳定的 Server 上部署 ( Deploy ) ,才能让其他使用者随时浏览观看。

在众多服务提供者中,我们选择 Heroku 作为这次的范例, 它的免费额度足够经营一个小型网站,并拥有完善的开发者教学资源。

这一章,我们会根据 官方教学 - "Getting Started with Django on Heroku" 稍作调整,教你如何准备部署,并在 Heroku 上发佈你的网站。

安装部署工具

首先,利用pip安装一些部署时需要用到的套件:

(VENV) ~/djangogirls$ pip install dj-database-url gunicorn dj-static

当终端机显示 Successfully installed... 时,表示必要的套件都已经安装好了。

部署准备

为了让 Server 了解部署时所需要的安装环境,我们需要调整和准备一些设定档案。

requirements.txt

djangogirls专案目录底下,利用pip freeze将此虚拟环境裡的 Python 套件全部条列出来,除了套件名称还会包含版本资讯,储存于 requirements.txt

(VENV) ~/djangogirls$ pip freeze > requirements.txt

由于 Heroku 使用 PostgreSQL 资料库, 我们在最后加上psycopg2==2.5.4 ( Python 的 PostgreSQL 模组 ) ,档案内容范例如下,版本可能会稍有不同:

Django==1.7.7
dj-database-url==0.3.0
dj-static==0.0.6
gunicorn==19.3.0
static3==0.5.1
psycopg2==2.5.4

Procfile

建立一个 Procfile 档案,它告诉 Heroku 要执行什麽指令来启动我们的应用:

web: gunicorn --pythonpath mysite mysite.wsgi

这一行<process_type>: <command>表示:

  • < process_type > -- 启用web应用
  • < command > -- Gunicorn 是原生支援 Django 的 Python WSGI Server,我们透过指令下列指令来启动网站:

  • gunicorn --pythonpath<directory_path> <project_name>.wsgi

runtime.txt

为了让 Heroku 知道要用哪一个版本的 Python,新增 runtime.txt 输入:

python-3.4.1

production_settings.py

前面的章节,我们透过修改settings.py来调整 Django project 的设定,但是通常正式上线 ( production ) 的环境会和开发/本机 ( development / local ) 环境有所不同。

所以我们在mysite/mysite/底下新建一个 production_settings.py,专门放部署时所需要的设定:

# import all default settings
from .settings import *

import dj_database_url
DATABASES = {
    'default': dj_database_url.config()
}

# Static asset configuration
STATIC_ROOT = 'staticfiles'

# 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 = ['*']

# Turn off DEBUG mode
DEBUG = False

TEMPLATE_DEBUG = False

wsgi.py

WSGI - Web Server Gateway Interface,简单来说,它是 Python 定义网页程式和伺服器沟通的介面,修改mysite/mysite/wsgi.py如下:

## mysite/wsgi.py

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

from django.core.wsgi import get_wsgi_application

from dj_static import Cling
application = Cling(get_wsgi_application())

加上 import dj_static 的部分,帮我们部署 static 档案 ( 例如图片,CSS 和 JavaScript 档案等等 )

.gitignore

有一些档案或资料夹在新增 git repository 时,不想被加入进入。建立一个 .gitignore 档案将我们的虚拟环境,本机资料库等等放进去:

VENV
*.pyc
__pycache__
staticfiles
db.sqlite3

小结

最后的档案结构如下:

djangogirls
├──mysite
│   ├── mysite
│   │   ├── __init__.py
│   │   ├── production_settings.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   ├── templates
│   ├── trips
│   └── manage.py
├── VENV
├── .gitignore
├── Procfile
├── requirements.txt
└── runtime.txt

Deploy to Heroku

在开始部署 ( Deploy ) 之前,请先确定你已经按照教学手册

  1. 注册 Heroku 帐号: https://id.heroku.com/signup
  2. 安装 Heroku 工具箱: https://toolbelt.heroku.com/

Step 1: 登入 Heroku

安装完工具箱裡的 Heroku client 后,你就可以使用 heroku 指令,让我们先来登入:

$ heroku login

输入注册时的 Email 帐号和密码,当你看到Authentication successful. 时,表示认证成功。

Step 2: 新增一个新的 git repository

djangogirls资料夹底下新增一个 git repository:

~/djangogirls$ git init
~/djangogirls$ git add .
~/djangogirls$ git commit -m "my djangogirls app"

Step 3-1: 新增新的 Heroku app

接下来,我们需要新增一个可以上传 repository 的地方,如果你之前已经新增过 app,请跳到 Step 3-2

~/djangogirls$ heroku create

预设create后面不放名字时,会自动产生随机名称的 Heroku app,如果想要命名自己的 app,如下:

~/djangogirls$ heroku create djangogirlsdiary

注意:

  • Heroku app 是不能重名的,所以如果你也输入djangogirlsdiary,会得到! Name is already taken的警告。
  • Heroku app 名称会显示在 deploy 成功后的网址上,例如: https://djangogirlsdiary.herokuapp.com

Step 3-2: 指定已经存在的 app

如果你之前已经新增过 app ,并且想发佈在已经存在的 app 上时,可以先用指令heroku apps查看 app 的名称:

$ heroku apps
=== My Apps
djangogirlsdiary

然后设定成你想要上传的 app:

$  heroku git:remote -a djangogirlsdiary
Git remote heroku added.

最后透过git remote -v检查一下是否设定到正确的位置:

$ git remote -v
heroku    https://git.heroku.com/djangogirlsdiary.git (fetch)
heroku    https://git.heroku.com/djangogirlsdiary.git (push)

Step 4: 设定环境变数

我们利用heroku config:set指令设置 环境变数,以确保未来在 Heroku 执行任何指令时,都是使用到部署专用的设定档:

$ heroku config:set DJANGO_SETTINGS_MODULE=mysite.production_settings

Step 5: 利用 git push 上传到 Heroku

使用git push指令上传 git repository 后,你会发现它按照 runtime.txt 安装 python-3.4.1,也透过 pip 安装我们在 requirements.txt 上列出的所有套件:

~/djangogirls$ git push heroku master
...
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Python app detected
remote: -----> Installing runtime (python-3.4.1)
remote: -----> Installing dependencies with pip
...
remote: -----> Compressing... done, 50.8MB
remote: -----> Launching... done, v5
remote:        https://djangogirlsdiary.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/djangogirlsdiary.git
 * [new branch]      master -> master

如果你遇到下列的错误讯息:

Permission denied (publickey).
fatal: The remote end hung up unexpectedly

请透过下列指令新增 public key,然后再重新git push

~/djangogirls$ heroku keys:add

Step 6: 启动 web process

先前建立了 Procfile 档案告诉 Heroku 启动时要执行的指令,现在我们使用指令启动 web process,并指定只需要1个 instance:

~/djangogirls$ heroku ps:scale web=1

Step 7: Django project 初始化

Django 已经成功启动了,但是我们还需要进行资料库初始化,利用heroku run可以在 Heroku 执行指令:

~/djangogirls$ heroku run python mysite/manage.py migrate

并为新资料库建立一个 superuser:

~/djangogirls$ heroku run python mysite/manage.py createsuperuser

Step 8: 开启浏览器观看你的网站

最后,透过open指令会自动在浏览器打开你的网站:

~/djangogirls$ heroku open

恭喜你成功地把网站发佈到网路上了!因为资料库是不同的,之前在本机端的日记都需要再重新输入喔。

你可以分享网址给任何人: https://djangogirlsdiary.herokuapp.com/ ( 记得前面要替换成你自己的 Heroku app 名称 )

未来如果对网站进行任何修改并想更新到 Heroku,只要先确定 git commit 完成后再 push 到 Heroku 即可。

$ git push heroku master