{"id":165081,"date":"2013-01-08T18:45:03","date_gmt":"2013-01-08T14:45:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=165081"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=165081","title":{"rendered":"<span class=\"post_title\">Django work flow (\u043e\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u043e \u0434\u0435\u043f\u043b\u043e\u044f)<\/span>"},"content":{"rendered":"<div class=\"content html_format\"> \t\t\t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/2a2\/a2f\/1a0\/2a2a2f1a0d94af85b897e5914b53ff4a.png\" align=\"left\"\/> \u0420\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u0431\u044b\u0441\u0442\u0440\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0438 \u0434\u0435\u043f\u043b\u043e\u0435 \u043d\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043d\u0443\u0436\u043d\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0441\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f.<\/p>\n<p>  \u041c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e \u0431\u044b \u043d\u0430\u0447\u0430\u043b\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0431\u044b\u043b\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u043c, \u043a\u0430\u043a \u0438 \u0435\u0433\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0434\u0435\u043f\u043b\u043e\u0439. \u0412 \u043b\u0443\u0447\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430\u043c \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0438\u043c\u0435\u0442\u044c 3 \u043a\u043d\u043e\u043f\u043a\u0438: \u043d\u0430\u0447\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c.<\/p>\n<p>  \u042d\u0442\u0430 \u0442\u0435\u043c\u0430 \u043d\u0435 \u043d\u043e\u0432\u0430\u044f \u0438 \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0430 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u0430\u0445, \u044f \u043b\u0438\u0448\u044c \u043f\u043e\u043a\u0430\u0436\u0443 \u0441\u0432\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442.<br \/>  \u0414\u043b\u044f \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f: PyCharm (\u043d\u0443 \u0438\u043b\u0438 \u043a\u0430\u043a\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440), Python (\u043a\u0443\u0434\u0430 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e), fabric, virtualenv, git \u0438 pip.<\/p>\n<p>  <a name=\"habracut\"><\/a><\/p>\n<h4>\u041a\u0430\u043a \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0443 \u043c\u0435\u043d\u044f<\/h4>\n<p>  \u041a\u043b\u0438\u043a\u0430\u0435\u043c \u043d\u0430 \u043a\u043d\u043e\u043f\u043e\u0447\u043a\u0443:<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/807\/a2f\/0d9\/807a2f0d96b2491a9d6836a64921dccc.png\"\/> <\/p>\n<p>  \u0412\u0432\u043e\u0434\u0438\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435:<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/cf1\/1b6\/17d\/cf11b617da048d645707b0e2120bb9a5.png\"\/><\/p>\n<p>  \u042f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e PyCharm, \u0442\u044b\u043a\u0430\u044e \u043d\u0430 \u043a\u043d\u043e\u043f\u043e\u0447\u043a\u0443 Run, \u0432\u0432\u043e\u0436\u0443 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u0433\u043e\u0442\u043e\u0432\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u044b. (\u0437\u0430 \u043a\u0443\u043b\u0438\u0441\u0430\u043c\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435: \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u043f\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0433\u0434\u0435 \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0438 PyCharma \u0438 git`\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 (virtualenv), \u0441\u043e\u0437\u0434\u0430\u043d \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 git \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 bitbucket.org, \u043a\u0443\u0434\u0430 \u0443\u0436\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d \u043a\u043e\u043c\u043c\u0438\u0442.<\/p>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435, \u043c\u043d\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u043d\u043e\u0432\u043e\u043c \u043e\u043a\u043d\u0435 PyCharm, \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u0447\u043a\u0443 Run \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0440\u0430\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0433\u043b\u044f\u0434\u044f \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0447\u0443\u0434\u043e \u0441\u0430\u043c\u043e \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442\u0441\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f.<\/p>\n<p>  \u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0447\u0438\u0442\u0430\u0442\u044c, \u0442\u043a \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0443\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u0441\u0432\u043e\u0435\u043c \u0430\u0440\u0441\u0435\u043d\u0430\u043b\u0435, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043b\u0438\u0448\u044c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/p>\n<h4>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435<\/h4>\n<p>  \u0412\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e \u0431\u0435\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u044f, \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <a href=\"http:\/\/fabric.readthedocs.org\">fabric<\/a>.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/660\/ee1\/2e7\/660ee12e71bfbcad43bf3630af5e1818.png\"\/><\/p>\n<p>  \u0412\u0441\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0443 \u043c\u0435\u043d\u044f \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 _DJANGO_PROJ_ \u0438 \u0438\u043c\u0435\u044e\u0442 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0443\u044e \u0438\u0437 5 \u043f\u0430\u043f\u043e\u043a:<br \/>  <b>src <\/b> \u2014 \u0434\u043b\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432<br \/>  <b>venv <\/b> \u2014 \u0434\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<br \/>  <b>static <\/b> \u2014 \u0434\u043b\u044f \u0432\u0441\u0435\u0439 \u0441\u0442\u0430\u0442\u0438\u043a\u0438 (collectstatic)<br \/>  <b>media <\/b> \u2014 \u0434\u043b\u044f \u043c\u0435\u0434\u0438 \u0444\u0430\u0439\u043b\u043e\u0432<br \/>  <b>db <\/b> \u2014 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0411\u0414<\/p>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 _DJANGO_PROJ_ \u0435\u0441\u0442\u044c \u043f\u0430\u043f\u043a\u0430 deploy, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f fabfile.py \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0442\u0430\u043a \u0436\u0435 \u0432 \u043d\u0435\u0439 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u0438 \u0448\u0430\u0431\u043b\u043e\u043d \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0430\u043f\u043a\u0438 <b>src<\/b>, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u0441\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u0439, \u043e\u043d\u0430 \u0436\u0435 \u0431\u0443\u0434\u0435\u0442 git \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c.<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/6db\/f71\/6bd\/6dbf716bde17d50999107e2c781a60d6.png\"\/><\/p>\n<p>  \u0412 \u043a\u043e\u0440\u043d\u0435 \u043b\u0435\u0436\u0430\u0442: \u043f\u0430\u043f\u043a\u0430 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 PyCharma \u0438 \u043f\u0430\u043f\u043a\u0430 _project_, \u0444\u0430\u0439\u043b\u044b: .gitignore (\u0434\u043b\u044f git`a) \u0438 requirements.txt (\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430).<\/p>\n<p>  \u0412 _project_ \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0432\u0441\u0435 \u0442\u043e, \u0447\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (\u0448\u0430\u0431\u043b\u043e\u043d\u044b, \u0441\u0442\u0430\u0442\u0438\u043a\u0430, url.py). (<a href=\"http:\/\/www.deploydjango.com\/django_project_structure\/index.html\">\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 Django \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 requirements.txt<\/a>) \u041a\u0430\u0442\u0430\u043b\u043e\u0433 static \u0432 \u043f\u0430\u043f\u043a\u0435 _project_ \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 favicon), \u043d\u0435 \u043f\u0443\u0442\u0430\u0439\u0442\u0435 \u0435\u0433\u043e \u0441 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u043c static \u0432 \u043a\u043e\u0440\u043d\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b collectstatic.<\/p>\n<p>  \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 fab \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0438 \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442 git \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"python\">def init():     # \u0432\u0441\u0435 \u043f\u0443\u0442\u0438 \u043e\u0442\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 fabfile.py \u0444\u0430\u0439\u043b\u0430.     env.lcwd = os.path.dirname(__file__)      # \u0441\u043f\u0430\u0440\u0438\u0432\u0430\u0435\u043c \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (\u043e\u043d\u043e \u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f DNS \u0438\u043c\u0435\u043d\u0435\u043c \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u0430)     prompt(&quot;project domain: &quot;, &quot;project&quot;,         validate=&quot;^([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$&quot;)     puts(&quot;create project: {0}&quot;.format(env.project))      with lcd('..'):         local('mkdir ' + env.project) # \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430         with lcd(env.project):             local('mkdir db src venv static media') # \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u043f\u0430\u043f\u043a\u0438             with lcd('src'):                 # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438                 local('cp -r ..\/..\/deploy\/project\/* .'.replace('\/', os.path.sep))                 local_template_render('gitignore.txt', env, '.gitignore')                  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c git                 local('git init')                 local('git add *')                 local('git commit -am &quot;init&quot;')              # \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435             local('virtualenv --clear venv')             local('.\/venv\/Scripts\/activate && pip install --download-cache=..\/deploy\/pip.cache \\                 -r .\/src\/requirements.txt'.replace('\/', os.path.sep))              # \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c Django             local('.\/venv\/Scripts\/activate && python .\/src\/manage.py syncdb --noinput && \\                 python .\/src\/manage.py migrate --noinput'.replace('\/', os.path.sep)) <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e fab \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0436\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0433\u043e\u0442\u043e\u0432 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443.<\/p>\n<p>  \u041d\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 bitbucket \u043f\u0440\u043e\u0435\u043a\u0442\u0430:  <\/p>\n<pre><code class=\"python\">        if BITBUCKET_USER and BITBUCKET_PASSWORD and                 confirm_global('create private bitbucket repository?'):             env.bit_user=BITBUCKET_USER             env.bit_password=BITBUCKET_PASSWORD              import requests as r             rez = r.post('https:\/\/api.bitbucket.org\/1.0\/repositories\/',                 data=dict(name=env.project, is_private=True),                 auth=BITBUCKET_AUTH,             )             puts('request status ok: {0}'.format(rez.ok))              if rez.ok:                 with lcd(env.project):                     # \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441 bitbucket.org                     local_template_render('fabfile.txt', env, 'fabs.py')                     with lcd('src'):                         local('git remote add origin https:\/\/{0}:{2}@bitbucket.org\/{0}\/{1}.git'                             .format(env.bit_user, env.project, env.bit_password))                         local('git push -u origin --all')   # to push changes for the first time <\/code><\/pre>\n<p>  (\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u043e\u043b\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043a\u043e\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438)<\/p>\n<p>  \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u0432\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Django, \u0432 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c SECRET_KEY, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c.<br \/>  \u0414\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441 \u0434\u0435\u043f\u043b\u043e\u0435\u043c.<\/p>\n<h4>\u0414\u0435\u043f\u043b\u043e\u0439<\/h4>\n<p>  \u0414\u0435\u043f\u043b\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f git \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u0441\u0435\u0445 \u043d\u0443\u0436\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.<br \/>  \u041c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0441\u0432\u044f\u0437\u043a\u0430 <b>Ubuntu + nginx + uWSGI<\/b>.<br \/>  \u0422\u0443\u0442 \u0443\u0436\u0435 \u0432\u0441\u0435 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0449\u0435. \u041d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u0442\u0435\u0439, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u0445\u0430\u0431\u0440\u0435: <a href=\"http:\/\/habrahabr.ru\/post\/113636\/\">kmike<\/a>, <a href=\"http:\/\/habrahabr.ru\/post\/116894\/\">Nginx + uWSGI<\/a>, <a href=\"http:\/\/habrahabr.ru\/post\/81050\/\">DTemplate<\/a>, <a href=\"http:\/\/habrahabr.ru\/post\/76619\/\">Django \u0438 Fabric<\/a>, <a href=\"http:\/\/habrahabr.ru\/post\/141271\/\">Fabric<\/a>\u2026<\/p>\n<pre><code class=\"python\">def deploy():     &quot;&quot;&quot;     \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0433\u0438\u0442 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.      **\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 `env`**     env.user - deploy user name (use for ssh)     env.password - deploy user password (use for ssh)     env.hosts - list deploy hosts (use for ssh)      env.domain - django site domain (DNS) use for:         - nginx settings         - uWSGI start settings         - project dir name      env.repository - \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0433\u0438\u0442 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0434\u043b\u044f \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043f\u043a\u0438 src.      env.no_input_mode - \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u044f \u043b\u0438\u0448\u043d\u0438\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432.     &quot;&quot;&quot;     # \u0432\u0441\u0435 \u043f\u0443\u0442\u0438 \u043e\u0442\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 fabfile.py \u0444\u0430\u0439\u043b\u0430.     env.lcwd = os.path.dirname(__file__)      require('no_input_mode')      # \u0415\u0441\u043b\u0438 no_input_mode == True \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432,     # \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0437\u0430\u043d\u0447\u0435\u043d\u0438\u044f     if env.no_input_mode:         def confirm_local(question, default=True):             puts(question)             puts(&quot;Use no_input_mode [default: {0}]&quot;.format(&quot;Y&quot; if default else &quot;N&quot;))             return default          confirm = confirm_local     else:         confirm = confirm_global      # \u0417\u0430\u043f\u0440\u043e\u0441\u0438\u043c DNS \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u0430, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442\u0443.     validate=&quot;^([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$&quot;     if not env.get(&quot;domain&quot;):         if env.no_input_mode:             abort(&quot;Need set env.domain !&quot;)         else:             prompt(&quot;Project DNS url: &quot;, &quot;domain&quot;, env.get('domain_default', ''),                     validate=validate)     else:         if not re.findall(validate, env.domain):             abort(&quot;Invalid env.domain !&quot;)      # \u0417\u0430\u043f\u0440\u043e\u0441\u0438\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 git \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u0439     if not env.get(&quot;repository&quot;):         if env.no_input_mode:             env.repository = env.repository_default         else:             prompt(&quot;Deploy from: &quot;, &quot;repository&quot;, env.get('repository_default', ''))      require('repository', 'domain')      puts(&quot;Deploy site: {0} \\nFrom: {1}&quot;.format(env.domain, env.repository))     DOMAIN_WITHOUT_DOT = env.domain.replace('.', '_')      # \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438     env.project_user = DOMAIN_WITHOUT_DOT     env.project_group = DOMAIN_WITHOUT_DOT     env.project_dir_name = DOMAIN_WITHOUT_DOT     env.root = posixpath.join(PROJECTS_ROOT, env.project_dir_name)      env.debug = True      # \u0422\u0443\u0442 \u0443\u0436\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0434\u0435\u043f\u043b\u043e\u0439     deb.packages(['git'])      # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u044e\u0437\u0435\u0440\u0430 deploy \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430     if not fabtools.user.exists('deploy'):         fabtools.user.create('deploy', home=PROJECTS_ROOT, group='deploy', create_home=False,             system=True, shell='\/bin\/false', create_group_if_need=True)      # \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432     files.directory(PROJECTS_ROOT, use_sudo=True, owner='root', group='root', mode='755')     with cd(PROJECTS_ROOT):         # \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f pip \u043f\u0430\u043a\u0435\u0442\u043e\u0432         files.directory('.pip.cache', use_sudo=True, owner='deploy', group='deploy', mode='755')         pip_cache_dir = posixpath.join(PROJECTS_ROOT, '.pip.cache')          # \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430         if is_dir(env.project_dir_name) and                 confirm(&quot;proj dir exist! abort ?&quot;, default=False):             return          files.directory(env.project_dir_name, use_sudo=True, owner='root', group='root',             mode='755')          # \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 uWSGi         if not fabtools.user.exists(env.project_user):             fabtools.user.create(env.project_user, home=env.root,                 group=env.project_group, create_home=False, system=True,                 shell='\/bin\/false', create_group_if_need=True)          # \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430         with cd(env.project_dir_name):             # \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c\u0438             if not is_dir('src') or                     confirm(&quot;proj src exist! [rm all and re clone \/ git pull]?&quot;,                             default=False):                 files.directory('src', use_sudo=True, owner='deploy', group='deploy', mode='755')                 with cd('src'):                     sudo('rm -Rf .??* *')                     sudo('git clone %(repository)s .' % env, user='deploy')             else:                 with cd('src'):                     sudo('git pull', user='deploy')              # \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435             if not is_dir('venv') or                     confirm(&quot;proj venv dir exist! [rm all and recreate \/ repeat install]?&quot;,                             default=False):                 files.directory('venv', use_sudo=True, owner='deploy', group='deploy', mode='755')                 with cd('venv'):                     sudo('rm -Rf .??* *')              python.virtualenv('venv', use_sudo=True, user='deploy', clear=True)             with fabtools.python.virtualenv('venv'):                 python.install_requirements('src\/requirements.txt', use_mirrors=False,                         use_sudo=True, user='deploy', download_cache=pip_cache_dir)              # \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0434\u043b\u044f \u043b\u043e\u0433\u043e\u0432, \u0411\u0414 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c sqlite), \u0441\u0442\u0430\u0442\u0438\u043a\u0438 \u0438 \u043c\u0435\u0434\u0438\u0430 \u0444\u0430\u0439\u043b\u043e\u0432.             files.directory('log', use_sudo=True, owner='root', group='root', mode='755')             files.directory('db', use_sudo=True, owner=env.project_user,                 group=env.project_group, mode='755')             files.directory('media', use_sudo=True, owner=env.project_user,                 group=env.project_group, mode='755')             files.directory('static', use_sudo=True, owner=env.project_user,                 group=env.project_group, mode='755')             sudo('chown -R ' + env.project_user + ':' + env.project_group +                 ' db* static* media*')              # \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0430\u0442\u0438\u043a\u0443, \u0411\u0414             with fabtools.python.virtualenv('venv'):                 sudo('python src\/manage.py collectstatic --noinput', user=env.project_user)                 sudo('python src\/manage.py syncdb --noinput', user=env.project_user)                 sudo('python src\/manage.py migrate --noinput', user=env.project_user)                 #sudo('python src\/manage.py loaddata fixtures.json', user=env.project_user)              # \u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u0435\u0431 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 nginx \u0438 uWSGI             # ------------------- #             # WEB SERVER SETTINGS #             # ------------------- #              # I`m use nginx &lt;-&gt; uWSGI &lt;-&gt; Django              nginx.server()             deb.packages(['uwsgi', 'uwsgi-plugin-python'])              # proj conf!             if not is_dir('conf') or confirm(&quot;proj conf dir exist! [backup and update? \/ skip]&quot;,                     default=False):                 files.directory('conf', use_sudo=True, owner='root', group='root', mode='755')                 with cd('conf'):                     local_conf_templates = os.path.join(os.path.dirname(__file__),                         'template', 'conf')                     uwsgi_conf = os.path.join(local_conf_templates, 'uwsgi.ini')                     nginx_conf = os.path.join(local_conf_templates, 'nginx.conf')                      sudo(&quot;rm -Rf *.back&quot;)                     sudo(&quot;ls -d *{.conf,.ini} | sed 's\/.*$\/mv -fu \\&quot;&\\&quot; \\&quot;\\\\0.back\\&quot;\/' | sh&quot;)                     files.template_file('uwsgi.ini', template_source=uwsgi_conf, context=env,                         use_sudo=True, owner='root', group='root', mode='644')                     files.file('reload', use_sudo=True, owner='root', group='root')                     sudo('ln -sf $(pwd)\/uwsgi.ini \/etc\/uwsgi\/apps-enabled\/' +                         env.project_dir_name + '.ini')                      files.template_file('nginx.conf', template_source=nginx_conf, context=env,                         use_sudo=True, owner='root', group='root', mode='644')                     sudo('ln -sf $(pwd)\/nginx.conf \/etc\/nginx\/sites-enabled\/' +                         env.project_dir_name)              sudo('service nginx restart')             sudo('service uwsgi restart') <\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u0449\u0435 \u043f\u0440\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u0441 \u0441\u0430\u0439\u0442\u0430\u043c\u0438 \u043d\u0430 deploy \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043e\u043d\u0430 \u043f\u043e\u0447\u0442\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043b\u0438\u0448\u044c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0438 log \u0438 conf.<br \/>  <b>log<\/b> \u2014 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u043e\u0432, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 nginx \u0438 uWSGI<br \/>  <b>conf<\/b> \u2014 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0434\u043b\u044f nginx \u0438 uWSGI<\/p>\n<p>  \u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435:<br \/>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/e74\/7d1\/d7a\/e747d1d7af34ba8b71d4bf3a0fcb2657.png\"\/><\/p>\n<h4>\u0418\u0442\u043e\u0433<\/h4>\n<p>  \u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438-\u0442\u0430\u043a\u0438 2 \u043a\u043d\u043e\u043f\u043a\u0438, \u043e\u0434\u043d\u0443 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0432\u0442\u043e\u0440\u0443\u044e \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f.<\/p>\n<p>  \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0441\u0435 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c, \u0438, \u044f \u043d\u0435 \u0430\u0433\u0438\u0442\u0438\u0440\u0443\u044e \u0432\u0441\u0435\u0445 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a.<br \/>  \u0422\u0430\u043a \u0436\u0435 \u0445\u043e\u0447\u0443 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438 \u043d\u0435\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u2014 \u044d\u0442\u043e \u0434\u0435\u043b\u043e \u0441\u0443\u0433\u0443\u0431\u043e \u0438\u043d\u0442\u0438\u043c\u043d\u043e\u0435 (\u043b\u0438\u0447\u043d\u043e\u0435) \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0430\u043c \u0440\u0435\u0448\u0430\u0435\u0442 \u0434\u043b\u044f \u0441\u0435\u0431\u044f, \u043a\u0430\u043a \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 (\u043a\u0442\u043e-\u0442\u043e \u043b\u044e\u0431\u0438\u0442 apache, \u043a\u043e\u043c\u0443-\u0442\u043e \u043d\u0443\u0436\u0435\u043d redis ..). \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0437\u044f\u0442\u044c \u043c\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0438 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u0434 \u0441\u0435\u0431\u044f.<\/p>\n<p>  \u042f \u0442\u0430\u043a \u0436\u0435 \u043e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043d\u0435 \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u043b\u043e\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u043d\u0430\u0434 \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443, \u0435\u0449\u0435 \u0440\u0430\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u043e \u0441\u0443\u0433\u0443\u0431\u043e \u043b\u0438\u0447\u043d\u043e\u0435, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0434\u0435\u043f\u043b\u043e\u0439. \u042f \u043d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043b, \u0445\u043e\u0442\u044f \u0431\u044b \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u0430\u043c\u043e\u043c\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443, \u0438\u043d\u0430\u0447\u0435, \u043d\u0438 \u043e \u043a\u0430\u043a\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0447\u0438, \u0443\u0436 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0442\u0443\u0442 \u0442\u043e\u043d\u043a\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442.<\/p>\n<p>  \u041d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u043c\u043e\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p>  <a href=\"https:\/\/bitbucket.org\/pahaz\/django-work-flow\">\u041f\u043e\u043b\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/a><\/p>\n<h6>\u041c\u0438\u043d\u0438 HOW-TO<\/h6>\n<p>  \u0418\u0442\u0430\u043a, \u043a\u0430\u043a \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0432\u0441\u0435\u043c \u044d\u0442\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f!?<br \/>  (\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d <b>Python<\/b> v2.* \u0438 <b>pip<\/b>. \u0422\u0430\u043a \u0436\u0435 \u0437\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c windows \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442 fabric)<\/p>\n<p>  \u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432 \u043f\u0430\u043f\u043a\u0443 \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u0434\u0436\u0430\u043d\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 <b>cd ~<\/b> \u0438\u043b\u0438 <b>cd %HOMEPATH%<\/b>).<\/p>\n<pre><code class=\"bash\">git clone https:\/\/bitbucket.org\/pahaz\/django-work-flow.git _DJANGO_PROJECTS_ <\/code><\/pre>\n<p>  \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e:  <\/p>\n<pre><code class=\"bash\">pip install -r deploy\/req.txt <\/code><\/pre>\n<p>  \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <b>_DJANGO_PROJECTS_\/deploy\/project<\/b>.<\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u043a\u0443\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f pip \u043f\u0430\u043a\u0435\u0442\u044b \u2014 <b>_DJANGO_PROJECTS_\/deploy\/.pip.cache<\/b><br \/>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0441 \u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0435\u043f\u043b\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u2014 <b>fabsettings.py<\/b><\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440:  <\/p>\n<pre><code class=\"bash\"># conf for init BITBUCKET_USER = 'pahaz' BITBUCKET_PASSWORD = 'mypasswd'  # conf for deploy DEPLOY_DEFAULT_DOMAIN = 'developers.urfu.ru' DEPLOY_DEFAULT_REPOSITORY = 'https:\/\/pahaz@bitbucket.org\/pahaz\/developers.urfu.ru.git'  DEPLOY_USER = 'root'                            # change DEPLOY_PASSWORD = 'qwer'                        # change DEPLOY_HOSTS = ['192.168.174.131:22', ]         # change  <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0444\u0430\u0439\u043b <b>init.sh.cmd<\/b>, \u0432\u0432\u043e\u0434\u0438\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f, \u043d\u0430\u0441 \u0441\u043f\u0440\u043e\u0441\u044f\u0442, \u0445\u043e\u0442\u0438\u043c \u043b\u0438 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 bitbucket \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439. (\u043e\u0442\u0432\u0435\u0447\u0430\u0435\u043c \u043d\u0430 \u0441\u0432\u043e\u0435 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435)<\/p>\n<p>  \u0412\u0441\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0433\u043e\u0442\u043e\u0432.<\/p>\n<p>  \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e src \u0432 PyCharme \u0438 \u043f\u0438\u0448\u0435\u043c \u043a\u043e\u0434.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u0435\u043f\u043b\u043e\u0439 (\u0435\u0441\u043b\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 PyCharm`a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c, \u0442\u043e \u0434\u0435\u043f\u043b\u043e\u0439 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 \u043e\u0434\u0438\u043d \u043a\u043b\u0438\u043a; \u043d\u0443 \u0438\u043b\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u0438\u043a fabs.py \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430)<\/p>\n<p>  \u0411\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0442\u0435\u0431\u0435 %habrauser%.<\/p>\n<p>  PS. \u0418 \u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u044f\u0442 \u043c\u0435\u043d\u044f \u0437\u043d\u0430\u0442\u043e\u043a\u0438 pep`a. \t\t\t \t\t\t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/165081\/\"> http:\/\/habrahabr.ru\/post\/165081\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\"> \t\t\t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/2a2\/a2f\/1a0\/2a2a2f1a0d94af85b897e5914b53ff4a.png\" align=\"left\"\/> \u0420\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u0431\u044b\u0441\u0442\u0440\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0438 \u0434\u0435\u043f\u043b\u043e\u0435 \u043d\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043d\u0443\u0436\u043d\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0441\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f.<\/p>\n<p>  \u041c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e \u0431\u044b \u043d\u0430\u0447\u0430\u043b\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0431\u044b\u043b\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u043c, \u043a\u0430\u043a \u0438 \u0435\u0433\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0434\u0435\u043f\u043b\u043e\u0439. \u0412 \u043b\u0443\u0447\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430\u043c \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0438\u043c\u0435\u0442\u044c 3 \u043a\u043d\u043e\u043f\u043a\u0438: \u043d\u0430\u0447\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c.<\/p>\n<p>  \u042d\u0442\u0430 \u0442\u0435\u043c\u0430 \u043d\u0435 \u043d\u043e\u0432\u0430\u044f \u0438 \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0430 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u0430\u0445, \u044f \u043b\u0438\u0448\u044c \u043f\u043e\u043a\u0430\u0436\u0443 \u0441\u0432\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442.<br \/>  \u0414\u043b\u044f \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f: PyCharm (\u043d\u0443 \u0438\u043b\u0438 \u043a\u0430\u043a\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440), Python (\u043a\u0443\u0434\u0430 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e), fabric, virtualenv, git \u0438 pip.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-165081","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/165081","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=165081"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/165081\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=165081"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=165081"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=165081"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}