Categories

Checkio.ORG

Subscribe to Posts

Email:

  • 03Feb

    Меня за….ло скролить длинные админки туда-сюда ради сабмита и вот

    1. .submit-row{
    2.     position: fixed;
    3.     z-index: 100;
    4.     left: 220px;
    5.     top: 0;
    6. }

    И панель наконецто просто начинает за вами кататься

    А чем ты занимаешься в свой выходной? :)

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , ,

  • 22Jun


    Чем меньше рутины мы привносим в свою работу, тем больше она может приносить удовольствия.

    Сегодня я расскажу про автоматизированный деплойтинг в python. Это значит одной командой я могу залить на все продакшен сервера файлы, обновить на нем необходимые компоненты и перегрузить веб сервер, и наблюдать за этим откинувшись на кресле и попивать кофеек.

    Я Вам расскажу про Fabric(На момент написания статьи 0.9.1 — бала последняя стабильная версия), наиболее подходящий для этого инструмент, который делает все описанное и даже больше через ssh.

    Про установку рассказывать особо нечего, pip отлично справляется с этим.

    В корень своего проекта я кладу fabfile.py, в этом файле и будут храниться все процедуры для работы с Fabric. Ниже приведу небольшой пример скрипта, который будет архивировать наш проект, заливать его на сервер и там разархивировать.

    1. from fabric.api import *
    2. env.hosts = ['oduvan@lyabah.com']
    3.  
    4. def deploy():
    5.     local('tar czf /tmp/my_project.tgz .')
    6.     put('/tmp/my_project.tgz', '/tmp/')
    7.     with cd('/home/oduvan/www/test_fab/'):
    8.         run('tar xzf /tmp/my_project.tgz')

    Если у Вас все получилось, а я очень надеюсь, что с этим хостом и именем пользователя ни у кого кроме меня получиться ничего не может (так что поменяйте свою строку конекта во второй строке), то вы можете увидеть что-то сильно напоминающее вот это:

    1. $ fab deploy
    2. [localhost] run: tar czf /tmp/my_project.tgz .
    3. Password for oduvan@lyabah.com:
    4. [oduvan@lyabah.com] put: /tmp/my_project.tgz -> /tmp/my_project.tgz
    5. [oduvan@lyabah.com] run: tar xzf /tmp/my_project.tgz
    6. [oduvan@lyabah.com] err: tar: ./fabfile.pyc: time stamp 2010-06-21 10:03:41 is 4.461083597 s in the future
    7. [oduvan@lyabah.com] err: tar: .: time stamp 2010-06-21 10:03:41 is 4.460804762 s in the future
    8.  
    9. Done.
    10. Disconnecting from lyabah.com… done.

    Само собой, пароль у вас спросят и его необходимо будет ввести, в конце статьи я выложу свой пароль к ссш, чтоб вы могли протестить работу.

    Кому лень вводить пароли могу добавить после второй сроки
    env.password = ‘oh_its_my_real_password’

    либо сгенерить себе файл с ссш ключом и путь к нему положить в
    env.key_filename — в отличие и пароля тут может быть передан массив ключей

    Но и этот код можно сократить. У Fabric есть contrib libs, одна из них project. Тут подробно каждую я описывать не буду, просто покажу пример с одной из них, дабы просто показать, что они есть

    1. from fabric.api import *
    2. from fabric.contrib.project import rsync_project
    3. env.hosts = ['oduvan@lyabah.com']
    4.  
    5. def deploy():
    6.     local('python manage.py test', capture=False)
    7.     rsync_project('/home/oduvan/www/test_fab/','.')

    как видите наш код сократился до одной команды, не считая команду для тестирования Django проекта, ведь если какая-то команда возвратит ошибочный статус, то выполнения прекратится, а значит если тесты не проходят загрузка не начинается. Дополнительный параметр capture говорит о том, что необходимо скрывать выходные данные команды, мы эту опцию отключаем.

    Вот основные команды, которые Вам необходимо знать, чтоб свободно пользоваться Fabric

    put — копировать файл с локальной машины на удаленную. Доп параметр mode — устанавливает права на файл, см chmod
    get — копировать файл с удаленной на локальную
    local — выполнить команду на локальной машине. Доп параметр capture — скрывать выходные данные, по умолчанию False
    run — выполнить команду на удаленной машине
    sudo — выполнить команду на удаленной машине через судо. Доп параметр user — указываем имя пользователя, под которым необходимо запустить команду

    Обратите внимание, что у нас есть команда sudo, а значит при необходимости, мы можем и сервак зарелоадить и вообще сделать любые админ вещи, главное, чтоб пользователь был в судоерсах.

    Для деплойтинга на несколько серверов, причем различной конфигурации, и роли – у Fabric тоже кое-что припасено.

    1. from fabric.api import *
    2. from fabric.contrib.project import rsync_project
    3. env.roledefs =  {'web':['oduvan@lyabah.com','oduvan@dev.lyabah.com'],
    4.         'db':['oduvan@db1.lyabah.com','oduvan@db2.lyabah.com'],
    5.         'media':['oduvan@media@lyabah.com'],
    6.         }
    7.  
    8. @roles('web')
    9. def deploy():
    10.     rsync_project('/home/oduvan/www/test_fab/','.')

    в этом примере заливка файлов будет идти сразу на 2 вебовых сервака. Как видите вы можете запланировать у себя роли отдельных серверов под БД, под медиа файл и т.д.

    кроме как декоратаром роль можно указывать и при запуске процедуры

    1. $ fab deploy -R web

    Иногда в момент или во время запуска необходимо передать данные скрипту.

    В момент запуска это делается через аргументы самой функции

    к примеру если у вас

    1. def deploy(arg1,arg2):
    2.     pass

    то эти 2 аргумента можно передать как

    1. $fab deploy:'HI','HO'
    2. $ fab deploy:'HI',arg2='HO'
    3. $ fab deploy:arg1='HI',arg2='HO'

    Либо спросить что-то во время работы функции у пользователя функцией
    prompt(text, key=None, default=”, validate=None)

    Задает вопрос пользователю с текстом text, если пользователь не вводит данные, то возвращает значение из default, предварительно отчищая его функцией validate, и возвращает как результат этой функции, если не передан key, иначе кладет значение в env[key]

    А теперь примеры функций деплойтинга из реальной жизни, которые вы можете написать и у себя в проекте:

    bounce_wsgi_procs — зарелоадить wsgi через touch в него
    deploy_media — загружаем только медиа файлы
    migrate — запускаем скрипт миграции через South
    update_repositories – обновляем репозитарии
    update_dependencies — устанавливаем зависимости
    reload_nginx — перегружаем nginx
    deploy — полная установка, последовательный запуск всех этих функций.

    Подводя итоги могу сказать, что Fabric должна стать musthave tool в разработке.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , , ,

  • 09Nov

    Надеюсь, все из вас понимают, что на python manage.py runserver … продакшен работать не будет. Это хорошо. На самом деле ответы на все эти вопросы можно накапать в гугле.

    Создавая проект на, к примеру, на перле у меня был fcgi скрипт, в котором и обрабатывались все запросы. Этот скрипт писался мной либо Catalyst сам генерил этот файл. На внешнем сервере я просто лайти указывал путь на этот файл и все. Удобно это было хотя бы тем, что лайти сам следил за тем, чтоб скрипт не отваливался и в случае необходимости доподнимал необходимое количество скриптов.

    В случае джанго – вы отдельно поднимаете скрипты, указываете им сокет а лайти уже указываете на этот сокет. По крайне мере второго решения я не нашел пока, т.к. и это пока устраивает.

    1. $HTTP["host"] == "yourwebsite.com" {
    2.  
    3. server.document-root = "/home/www/website/static/"
    4.  
    5. fastcgi.server = (
    6.     "/manage.fcgi" => (
    7.         "main" => (
    8.             # Use host / port instead of socket for TCP fastcgi
    9.             # "host" => "127.0.0.1",
    10.             # "port" => 3033,
    11.             "socket" => "/home/www/website/manage.sock",
    12.             "check-local" => "disable",
    13.         )
    14.     ),
    15. )
    16. alias.url = (
    17.     "/static/" => "/home/www/website/static/",
    18. )
    19.  
    20. url.rewrite-once = (
    21.     "^(/static.*)$" => "$1",
    22.     "^/favicon\.ico$" => "favicon.ico",
    23.     "^(/.*)$" => "/manage.fcgi$1",
    24. )
    25. }

    Что тут происходит? Сначало направляем фаст “/manage.fcgi” на сокет “/home/www/website/manage.sock”.
    В алиасах прописываем пути к вашим папкам со статикой.

    Реврайты лайти проверяет поочереди. Поэтому сначала записываются статика с favicon. А потом реврайт на fastcgi. Т.е. на фаст попадают только не статические запросы.

    По модулям lighttpd – проверте, чтоб у вас были активны следующие: mod_alias, mod_rewrite и mod_fastcgi

    Далее скрипт, который создает непосредственно сокет. Его можно положить в папку с manage.py

    1. #!/bin/bash
    2.  
    3. # Replace these three settings.
    4. PROJDIR="/home/www/website/"
    5. PIDFILE="$PROJDIR/manage.pid"
    6. SOCKET="$PROJDIR/manage.sock"
    7.  
    8. cd $PROJDIR
    9. if [ -f $PIDFILE ]; then
    10.     kill `cat$PIDFILE`
    11.     rm -f — $PIDFILE
    12. fi
    13.  
    14. ./manage.py runfcgi socket=$SOCKET pidfile=$PIDFILE
    15. chmod a+w $SOCKET

    В принципе и скрипт и конфиг лайти, с небольшими поправками, можно нарыть в доках по джанго.

    Но этого будет мало.
    Во первых необходимо сразу указать в settings.py:

    1. FORCE_SCRIPT_NAME = ''

    иначе вас ждут несколько неприятных сюрпризов с редиректами. Далее проконтролируйте урлы и пути в файле settings.py. Хотябы LOGIN_URL у вас точно должен был поменятся.

    Далее выключаем дебаг, заполняем данные для отправки почты и емаил администратора. Теперь, в случае какой либо ошибки она не будет выдана пользователю, а полный дамп будет выслан вам на мыло. Ниже я привел конфигурацию, для отсылки почты через жмейловский смтипи.

    1. DEBUG = False
    2.  
    3. ADMINS = (
    4.      ('Alexander Lyabah', 'alexander@lyabah.com'),
    5. )
    6.  
    7. EMAIL_HOST = 'smtp.gmail.com'
    8. EMAIL_PORT = 587
    9. EMAIL_HOST_USER = 'support@lyabah.com'
    10. EMAIL_HOST_PASSWORD = '***'
    11. EMAIL_SUBJECT_PREFIX = '[My-Web-Site]'
    12. EMAIL_USE_TLS = True

    Пока все… если что еще всплывет, буду еще об этом писать.

    Share and Enjoy:
    • Facebook
    • LinkedIn
    • Twitter
    • del.icio.us
    • StumbleUpon
    • MySpace
    • Reddit
    • Digg
    • Google Bookmarks
    • Technorati
    • email
    • Print
    • Sphinn
    • Mixx
    • Blogplay
    • Add to favorites
    • Linkter
    • Live
    • MSN Reporter
    • NewsVine
    • RSS
    • Yahoo! Bookmarks
    • Yahoo! Buzz
    • Yigg
    Rating 3.00 out of 5
    [?]

    Tags: , , , ,

   

Recent Posts

Recent Comments

  • Благодарю, начал изучать fabric с вашей статьи....
  • Идея действительно отличная и очень радует то, что подобн...
  • Спасибо...
  • Там четыре круглых кнопочки. Подразумевается, что каждая ...
  • А в чем заключатеся неправильна работа?...