热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DeployDjangowithFabric

转自:http:gibuloto.comblogdeploy-django-with-fabricDeployDjangowithFabricInstall12#不

转自:http://gibuloto.com/blog/deploy-django-with-fabric/


Deploy Django with Fabric

Install



1
2

# 不要安裝在 virtualenv 裡面,不然每次 fab 都要進去 virtualenv 也是很麻煩
$ sudo pip install fabric



Operations



1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 在 remote 執行指令
run()

# 在 remote 執行需要 sudo 的指令
sudo()

# 在 localhost 執行指令
local()

# 在 remote 執行 change directory,通常會搭配 with 使用
cd()

# 在 localhost 執行 change directory
lcd()


cd()run()sudo() 只能用在 remote SSH 登入,本機的話要用 lcd()local()local('sudo some_command')

run() 默認的工作目錄就是 SSH 登入進去的家目錄,local(), 則是 fabfile.py 所在的目錄。

References:

  • Fabric Documentation

Example

我把 deploy 環境分成三種,productionstagingdevelopment,分別對應到一個 fabfile。fabfile 實際上就是一個 .py 檔案,因為 Fabric 說穿了就是用 Python 來寫一串 bash 指令。

目錄結構如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

jojogo/
├── app_product/
├── fabfile.py
├── fabfiles/
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── development.py
│   ├── development.pyc
│   ├── production.py
│   ├── production.pyc
│   ├── staging.py
│   └── staging.pyc
├── jojogo/
├── manage.py
├── requirements.txt
├── static/
└── templates/


in fabfile.py


1
2
3
4
5

from fabric.api import *

from fabfiles import production as pro
from fabfiles import staging as sta
from fabfiles import development as dev


Usage:


1
2
3
4

$ fab -l
$ fab pro.uwsgi
$ fab sta.uwsgi
$ fab dev.django


in production.py (remote: Ubuntu)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158

import os
import sys
from datetime import datetime

from fabric.api import *
from fabric.colors import *


def set_env():
env.FABFILE_NAME = 'production'
env.PROJECT_NAME = 'jojogo'
env.PROJECT_PATH_REMOTE = '/src/jojogo'
env.PROJECT_PATH_LOCAL = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..'))
env.SOURCE_VIRTUALENVWRAPPER = 'source /usr/local/bin/virtualenvwrapper.sh'
env.VIRTUALENV_NAME = env.PROJECT_NAME
env.VIRTUALENV_WORKON = '%s && workon %s' % (env.SOURCE_VIRTUALENVWRAPPER, env.VIRTUALENV_NAME)

env.host_string = 'REMOTE SERVER IP'
env.user = 'REMOTE SERVER SSH LOGIN USERNAME'
env.key_filename = 'ABSOLUTE PATH OF KEY PAIR FILE'



@task
def checkout():
'''
Checkout project from Subversion
'''

set_env()

sudo('apt-get update')
sudo('apt-get install git mercurial subversion')
run('svn co --username USERNAME https://SVN_REPO_URL/')


@task
def setup():
'''
Install all services & apps
'''

def install_postgresql_and_postgis():
sudo('apt-get install binutils gdal-bin libproj-dev postgresql-9.1-postgis postgresql-server-dev-9.1 python-psycopg2')

def install_nginx():
run('wget http://nginx.org/keys/nginx_signing.key')
sudo('apt-key add nginx_signing.key')
put('config/etc/apt/sources.list.d/nginx.list', '/etc/apt/sources.list.d/nginx.list', use_sudo=True)
sudo('apt-get update')
sudo('apt-get install nginx')

# 上傳配置文件
put('config/nginx/nginx.conf', '/etc/nginx.conf', use_sudo=True)
put('config/nginx/conf.d/guangdj.conf', '/etc/nginx/conf.d/guangdj.conf', use_sudo=True)

# 刪除範例的配置文件
sudo('rm /etc/nginx/conf.d/default.conf')
sudo('rm /etc/nginx/conf.d/example_ssl.conf')

sudo('service nginx restart')

def install_pip():
sudo('curl http://python-distribute.org/distribute_setup.py | python')
sudo('curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python')

def install_virtualenvwrapper():
sudo('pip install virtualenvwrapper')

def install_pil():
sudo('apt-get install apt-get build-dep python-imaging')

def install_uwsgi():
sudo('apt-get install build-essential python-dev libxml2-dev')

log_dir = '~/log/uwsgi'

run('mkdir -p %s' % log_dir)
run('touch %s/guangdj.log' % log_dir)

set_env()

install_postgresql_and_postgis()
install_nginx()
install_pip()
install_virtualenvwrapper()
install_pil()
install_uwsgi()

with prefix(env.SOURCE_VIRTUALENVWRAPPER):
'''
必須 source virtualenvwrapper.sh
否則會出現 /bin/sh: workon: command not found
'''

run('mkvirtualenv --no-site-packages %s' % env.VIRTUALENV_NAME)

with prefix(env.VIRTUALENV_WORKON):
with cd(env.PROJECT_PATH_REMOTE):
run('pip install -r requirements.txt')
run('yolk -l')
run('mkdir -p static_root')
run('python manage.py collectstatic --clear --noinput')


@task
def syncdb():
'''
Update & migrate Django database
'''

set_env()

with prefix(env.VIRTUALENV_WORKON):
run('python manage.py syncdb')


@task
def nginx():
'''
Reload nginx
'''

set_env()

sudo('service nginx restart')


@task
def celery():
'''
Reload Celery
'''

set_env()

with prefix(env.VIRTUALENV_WORKON):
try:
sudo("ps auxww | grep 'celery' | awk '{print $2}' | xargs kill -9")
except:
print(green('雖然有錯誤訊息,但是 celeryd 還是有被 kill'))

sudo('python manage.py celeryd_detach')


@task
def uwsgi():
'''
Reload uWSGI
'''

set_env()

with prefix(env.VIRTUALENV_WORKON):
run('svn up')
run('python manage.py collectstatic --clear --noinput')
run('killall -9 uwsgi')
run('uwsgi --ini config/uwsgi_conf.ini')


in development.py (localhost: Mac)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112

import os
import socket
import sys
from datetime import datetime

from fabric.api import *
from fabric.colors import *


def set_env():
env.FABFILE_NAME = 'development'
env.PROJECT_NAME = 'jojogo'
env.PROJECT_PATH_LOCAL = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..'))
env.EXPORT_POSTGRESQL_BIN = 'export PATH=/usr/local/Cellar/postgresql/9.1.4/bin:$PATH'
env.SOURCE_VIRTUALENVWRAPPER = 'source /usr/local/bin/virtualenvwrapper.sh'
env.VIRTUALENV_WORKON = '%s && workon %s' % (env.SOURCE_VIRTUALENVWRAPPER, env.PROJECT_NAME)
env.CURRENT_IP = socket.getaddrinfo(socket.gethostname(), None)[0][4][0]


@task
def setup():
'''
Install all services & apps
'''

def install_postgresql_and_postgis():
local('brew update')
local('brew install postgresql')
local('brew versions postgis')

def install_virtualenvwrapper():
local('sudo pip install --upgrade virtualenvwrapper')

def install_pil():
local('brew install jpeg lzlib')

set_env()

install_postgresql_and_postgis()
install_virtualenvwrapper()
install_pil()

with prefix(env.SOURCE_VIRTUALENVWRAPPER):
'''
必須 source virtualenvwrapper.sh
否則會出現 /bin/sh: workon: command not found
'''

local('mkvirtualenv --no-site-packages %s' % env.PROJECT_NAME)

with prefix(env.VIRTUALENV_WORKON):
local('pip install -r requirements.txt')
local('yolk -l')


@task
def postgresql(run_in='backgound'):
'''
Run PostgreSQL
'''

set_env()

with prefix(env.EXPORT_POSTGRESQL_BIN):
if run_in == 'backgound':
local('pg_ctl -D ~/Developer/postgresql/%s -l /tmp/postgresql.%s.log start' % (env.PROJECT_NAME, env.PROJECT_NAME))
else:
local('pg_ctl -D ~/Developer/postgresql/%s start' % (env.PROJECT_NAME))


@task
def celery(run_in='backgound'):
'''
Run Celery
'''

set_env()

with prefix(env.VIRTUALENV_WORKON):
if run_in == 'backgound':
try:
local('python manage.py celeryd_detach')
except:
print(green('celery 已經在執行了'))
else:
local('python manage.py celery worker --loglevel=info')


@task
def django():
'''
Run Django
'''

set_env()

with prefix(env.VIRTUALENV_WORKON):
local('python manage.py runserver %s:8000' % env.CURRENT_IP)


@task
def run_all():
'''
Run all services in backgound
'''

set_env()

with prefix(env.VIRTUALENV_WORKON):
postgresql()
celery()
django()









推荐阅读
  • 谢邀。---2016.09.20补充---GitHub-gregmalcolmpython_koans:PythonKoans是个不错的练手项目,我还曾经给它贡献过代 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • Django + Ansible 主机管理(有源码)
    本文给大家介绍如何利用DjangoAnsible进行Web项目管理。Django介绍一个可以使Web开发工作愉快并且高效的Web开发框架,能够以最小的代价构建和维护高 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了markdown[软件代理设置]相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 交换机配置:intg100unshintvlani1ipadd192.168.56.177qstelseuser-iv4authaaaproinsshupl3qsshuserpyt ... [详细]
  • 树状笔记软件for linux,Ubuntu 14.04安装开源树状笔记管理软件 WikidPad 2.2
    WikidPad是一款开源免费的wiki风格的树状笔记管理软件,类似于Notepad。基于Python,支持Windows、Mac、Linux等平台。W ... [详细]
  • Ubuntu18.04 安装ROS Melodic && Ros2 Dashing
    https:blog.csdn.netqq_44717317articledetails104547474一、Ubuntu18.04的安装ubuntu2go的制作关于Ubuntu2 ... [详细]
  • Request对象和Response对象request:(请求)当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpRequest对象。Djang ... [详细]
  • 十六.增加一个项目协作留言板功能(二)----- 建立一个任务管理的列表页面
    我们设计一个页面来展示正在处理的任务,该表格可以参照之前基础信息的增删改查。用户通过这个页面对任务进行相应操作。1.在views. ... [详细]
  • pyecharts 介绍
    一、pyecharts介绍ECharts,一个使用JavaScript实现的开源可视化库,可以流畅的运行在PC和移动设备上,兼容当前绝大部 ... [详细]
author-avatar
FXHT4564_845
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有