Django项目自动dotcloud部署&本地测试

现时循环的, C.C.的角色歌, 略带魔幻色彩

然后再吐槽一句, 为啥IMKQIM用一次shift切换中英文之后就自动变成中文符号了啊... 已经无语&泪目N久了...

其实在dali'an接近0.1的时候就已经用makefile实现了dotcloud的自动部署, 这几天做测试的时候也都放到网上去弄了, 不过dotcloud确实是有些慢的, 如果调试前端的话在等待刷新上频繁地浪费时间也没意义, 所以今天又改进了一下, 做到本地和dotcloud上同时可用.

写在最前面的一点是, 项目传到dotcloud上之后是在/home/dotcloud/current目录下面, 而且项目的目录没有加载到PATH里面, 所以呢, 比如你有个app1, 那么你最好在import的时候写成 from project_name.app1.xxx import xxx, 当然你也可以用os提供的功能在wsgi.py里面手动添加项目目录到PATH里面, 不过我比较喜欢前面一种方法 :D

接下来为settings.py和urls.py添加针对dotcloud的文件, 比如settings_server.py和urls_server.py.
在settings_server.py中可以用

1
2
with open('/home/dotcloud/environment.json') as f:
    dotcloud_env = json.load(f)

这样把一起配置的数据库等信息加载到dotcloud_env里面, 然后就可以像下面这样修改数据库的相关配置:

1
2
3
4
5
6
7
8
9
10
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'template1',
        'USER': dotcloud_env['DOTCLOUD_DB_SQL_LOGIN'],
        'PASSWORD': dotcloud_env['DOTCLOUD_DB_SQL_PASSWORD'],
        'HOST': dotcloud_env['DOTCLOUD_DB_SQL_HOST'],
        'PORT': int(dotcloud_env['DOTCLOUD_DB_SQL_PORT']),
    }
}

如果用mysql的话大致如下:

1
2
3
4
5
6
7
8
9
10
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysql', #这里我记不太清楚了, 应该是这个, 如果不行的话自己google下吧, 别忘了在下面留言 :D
        'USER': dotcloud_env['DOTCLOUD_DB_MYSQL_LOGIN'],
        'PASSWORD': dotcloud_env['DOTCLOUD_DB_MYSQL_PASSWORD'],
        'HOST': dotcloud_env['DOTCLOUD_DB_MYSQL_HOST'],
        'PORT': int(dotcloud_env['DOTCLOUD_DB_MYSQL_PORT']),
    }
}

顺便, 我没用mysql是因为没找到方法改它的字符集设定 :(, postgresql倒是直接支持存中文, 接下来是有关静态文件的设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MEDIA_ROOT = '/home/dotcloud/data/media/'
 
MEDIA_URL = 'http://{ project_url }/media/'
 
STATIC_ROOT = '/home/dotcloud/data/static/' # 这个地址是用来存放通过collectstatic收集的静态文件
 
STATIC_URL = '/static/'
 
STATICFILES_DIRS = (
    '/home/dotcloud/current/{ project_name }/static', # 总之是你各种静态文件的目录 也可以用下面模板目录的写法
)
 
TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(__file__), 'templates'),
)

然后是urls_server.py其实这个文件只要把urls.py中本地测试服务器需要的两个服务静态文件的条目删掉就可以了, 嗯, 也就是说本地的测试服务器要支持静态文件的话只要加上:

1
2
3
4
5
6
   url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {
           'document_root': settings.STATIC_ROOT,
       }),
   url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.MEDIA_ROOT,
        }),

这两条就OK了.

除了这些, 如果你有些参数本地测试和dotcloud上需要用不同的, 那么就把它单独弄到一个文件里, 然后像上面一样做成两份加以区分.

接下来建立dotcloud_conf这个文件夹, 里面放上各种配置dotcloud需要的文件:
dotcloud.yml (最基本的配置文件, 这个需要贴么...)

1
2
3
4
www:
  type: python 
db:
  type: postgresql

requirements.txt (用来告诉服务器上的pip自己的project都需要哪些库, 列出pip install xxx中的xxx就OK了)

1
2
3
4
5
Django
oauth2
feedparser
PIL
django-celery

nginx.conf (配置静态文件服务)

1
2
location /media/ { root /home/dotcloud/data ; }
location /static/ { root /home/dotcloud/data ; }

wsgi.py (apache的mod_wsgi调用的接口)

1
2
3
4
import os
os.environ['DJANGO_SETTINGS_MODULE'] = '{ project_name }.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

postinstall (安装完成后自动执行的一些命令)

1
2
3
4
5
#!/bin/sh
python { project_name }/manage.py syncdb --noinput
mkdir -p /home/dotcloud/data/media
mkdir -p /home/dotcloud/data/static
python { project_name }/manage.py collectstatic --noinput

最后是真正来搞这个自动部署的makefile啦(隐身属性终于解除了么...)

1
2
3
4
5
6
7
8
9
10
11
12
deploy: settings_server.py
	mkdir ../dotcloud_tmp
	mkdir ../dotcloud_tmp/{ project_name }
	cp -a . ../dotcloud_tmp/{ project_name }
	mv ../dotcloud_tmp/ .
	mv dotcloud_tmp/{ project_name }/dotcloud_conf/* dotcloud_tmp/
	rm -f dotcloud_tmp/{ project_name }/settings.py
	rm -f dotcloud_tmp/{ project_name }/urls.py
	mv dotcloud_tmp/{ project_name }/settings_server.py dotcloud_tmp/{ project_name }/settings.py
	mv dotcloud_tmp/{ project_name }/urls_server.py dotcloud_tmp/{ project_name }/urls.py
	dotcloud push { project_name } dotcloud_tmp
	rm -rf dotcloud_tmp

如果dotcloud push的时候出问题跳出的话(比如无法连接等等), 就手动执行一下最后一句吧, 然后如果有其他的本地/dotcloud不同的配置文件就模仿一下7-10行的内容吧...

吐槽: 喂, 那些大大的{ project_xxx }知道改的吧...

搞完这些之后就可以在本地用python manage.py runserver来做测试, 然后一个make就直接部署到dotcloud上去了 :D

_: dotcloud君V587不解释啊.... 咱服务器啥时候能写到一个make自动搞完就好了... 泪目
__: 整个鲁路修里面最喜欢的其实是R2结局的那首Continued Story, 最后一集看了好几遍就为了这歌...
___: 最近做这个项目其实学了很多东西, 但是反倒找不到地方去吐槽了...

各种吐槽完毕, 以上