热门标签 | 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()









推荐阅读
  • 本文将详细介绍如何在Mac上安装Jupyter Notebook,并提供一些常见的问题解决方法。通过这些步骤,您将能够顺利地在Mac上运行Jupyter Notebook。 ... [详细]
  • 本文详细介绍了在 Ubuntu 系统上搭建 Hadoop 集群时遇到的 SSH 密钥认证问题及其解决方案。通过本文,读者可以了解如何在多台虚拟机之间实现无密码 SSH 登录,从而顺利启动 Hadoop 集群。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
  • 单元测试:使用mocha和should.js搭建nodejs的单元测试
    2019独角兽企业重金招聘Python工程师标准BDD测试利器:mochashould.js众所周知对于任何一个项目来说,做好单元测试都是必不可少 ... [详细]
  • 基于Linux开源VOIP系统LinPhone[四]
    ****************************************************************************************** ... [详细]
  • SecureCRT是一款功能强大的终端仿真软件,支持SSH1和SSH2协议,适用于在Windows环境下高效连接和管理Linux服务器。该工具不仅提供了稳定的连接性能,还具备丰富的配置选项,能够满足不同用户的需求。通过SecureCRT,用户可以轻松实现对远程Linux系统的安全访问和操作。 ... [详细]
  • 在本文中,我们将探讨如何在Docker环境中高效地管理和利用数据库。首先,需要安装Docker Desktop以确保本地环境准备就绪。接下来,可以从Docker Hub中选择合适的数据库镜像,并通过简单的命令将其拉取到本地。此外,我们还将介绍如何配置和优化这些数据库容器,以实现最佳性能和安全性。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • Vue应用预渲染技术详解与实践 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
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社区 版权所有