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, 最后一集看了好几遍就为了这歌...
___: 最近做这个项目其实学了很多东西, 但是反倒找不到地方去吐槽了...
各种吐槽完毕, 以上