2010
08.26

Недавно решил для одного из своих текущих проектов таки сделать легкий автоматический деплоймент.

Сам проект написан на Django в песочнице virtualenv, крутится все это на apache + mod_wsgi. Сам проект лежит в приватном репозитории на github.

Изначально было два варианта:

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

Первый вариант я както пробовал, все хоршо, только на проекте еще работает человек, который в программировании ничего не шарит и который с горем пополам разобрался как коммитить в гите.

Значит план работы процесса деплоймента такой:

  1. После завершения изменений в коде мы делаем пуш на удаленный репозиторий( который у нас на гитхабе).
  2. Гитхаб после пуша делает пост вызов с данными заданной странички на нашем сервере.
  3. Страничка запускает shell script, который запускает процесс деплоймента на сервере.

Итак, теперь обо всем детально.

Сперва заходите на свой сервер и создаете файлик, который будет виден с нет и который будет запускать процесс деплоймента. Я написал его на РНР для простоты, он очень тривиален:

<?php
set_time_limit(0);
if(isset($_POST['payload'])){
     $data = json_decode(stripslashes($_POST['payload']));
     if($data->ref == "refs/heads/live"){
         passthru('sudo /some/path/to/live/script.sh');
     } else {
         passthru('sudo /some/path/to/staging/script.sh');
     }
}
?>

Он проверяет если я сдела пуш в ветку master – значит делает деплоймент бета сервера, если  live -  значит живой сайт обновляет.

Потом заходим в админку нашего репозитория на гитхабе и указываем ссылку на этот наш скрипт в Post-Receive urls. Почитать детально про Post-Receive Hooks на Githab.

Теперь создаем shell script который будет запускать процесс  деплоймента, он тоже простой:

#!/bin/bash

PROJDIR="/path/to/project/public_html"
LOGFILE="/path/to/project/logs/deploy.log"

cd $PROJDIR
. ./project-env/bin/activate
fab deploy -f $PROJDIR/fabfile.py >> $LOGFILE
apache2ctl -k graceful

Собственно скрипт активирует virtualenv(сам fabric установлен в нем, потому так делаю, есил у вас он общесистемный – просто запускаете и все) – и указываю в какой лог складывать результат установки + перезапсук апача в конце.

Ага, еще такая вещь, чтобы с РНР скрипта удалось запустить команду с  sudo -  в sudoers указал следующее:

www-data ALL =(ALL) NOPASSWD: /some/path/to/live/script.sh 
www-data ALL =(ALL) NOPASSWD: /some/path/to/staging/script.sh

Так мы разрешаем запускать данные скритп через sudo без пароля для группы www-data.

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

Сам скрипт каждый раз клонирует репозиторий с github и складывает в папочку с текущим временем и датой вметос названия и линкует ее в папку current. Также он удаляет старые папки(больше 10 дней помоему). Плюс скрипт линкует все папки/файлы, которых нет в репозитории.

По идее в скрипт можно добавить еще обнолвение базы данных(south или просто выполнение sql файлов) или например обновление библиотек в virtualenv из файлика requirements.txt. Но пока я оставил все максимально просто, изменения в структуре бд я делаю не так часто и надежнее сделать их руками. То же самое касается новых библиотек.

В итоге процесс обновления новой версии на staging или production занимает от силы секунд 20-30 после пуша на гитхаб, что очень и очень подталкивает делать обновления на живом сайте как можно чаще :)

2009
12.23

Очень простой бекап для вашего хостинга, использующий duplicity. Для меня основные папки для бекапа – /root, /etc, /home, /www + базы данных. БД я дамплю по крону каждый день за час до общего бекапа и складываю в папочку скажем в /root, плюс каждый дамп гзипом прохожу. Чтото в этом духе:

#!/bin/bash
echo "MySQL dbs backup starting..."
DBASELIST=`mktemp`
APASS='password'
mysqlshow -p$APASS | awk '{print $2}' | grep -v Databases | sort >$DBASELIST
#you will find dumps in /root/backup/mysql_current
cd /root/backup/mysql_current
for x in `cat $DBASELIST`; do
echo "Processing: $x backing up...";
mysqldump --opt -p$APASS $x >$x.sql;
done;
echo "Remove old gzips..."
rm *.gz
echo "Create new gzips from dumps..."
gzip *
echo "MySQL backup process completed!"

Ну и потом сам скрипт, который бекапит все данные и складывает на фтп:

#!/bin/sh
#
# Loading the day of the month in a variable.
date=`date +%d`
# Setting the pass phrase to encrypt the backup files. Will use symmetrical keys in this case.
#PASSPHRASE='yoursecretgpgpassphrase'
#export PASSPHRASE
# Setting the password for the FTP account that the
# backup files will be transferred to.
FTP_PASSWORD='ftp_pass_here'
export FTP_PASSWORD
FTP_HOST='ftp://ftp.host'
# Check to see if we're at the first of the month.
# If we are on the 1st day of the month, then run
# a full backup. If not, then run an incremental
# backup.
if [ $date = 01 ]
then
duplicity remove-older-than 3M --no-encryption -v5 $FTP_HOST/root >>/var/log/duplicity/root.log
duplicity remove-older-than 3M --no-encryption -v5 $FTP_HOST/etc >>/var/log/duplicity/etc.log
duplicity remove-older-than 3M --no-encryption -v5 $FTP_HOST/home >>/var/log/duplicity/home.log
duplicity remove-older-than 3M --no-encryption -v5 $FTP_HOST/www >>/var/log/duplicity/www.log
#backup
duplicity full --no-encryption -v5 /srv $FTP_HOST/root >>/var/log/duplicity/root.log
duplicity full --no-encryption -v5 /etc $FTP_HOST/etc >>/var/log/duplicity/etc.log
duplicity full --no-encryption -v5 /home $FTP_HOST/home >>/var/log/duplicity/home.log
duplicity full --no-encryption -v5 /var/www $FTP_HOST/www >>/var/log/duplicity/www.log
#if not the first day of month
else
duplicity remove-older-than 3M --no-encryption -v5 $FTP_HOST/root >>/var/log/duplicity/root.log
duplicity remove-older-than 3M --no-encryption -v5 $FTP_HOST/etc >>/var/log/duplicity/etc.log
duplicity remove-older-than 3M --no-encryption -v5 $FTP_HOST/home >>/var/log/duplicity/home.log
duplicity remove-older-than 3M --no-encryption -v5 $FTP_HOST/www >>/var/log/duplicity/www.log
#incremental backup
duplicity incremental --no-encryption -v5 /root $FTP_HOST/root >>/var/log/duplicity/root.log
duplicity incremental --no-encryption -v5 /etc $FTP_HOST/etc >>/var/log/duplicity/etc.log
duplicity incremental --no-encryption -v5 /home $FTP_HOST/home >>/var/log/duplicity/home.log
duplicity incremental --no-encryption -v5 /var/www $FTP_HOSt/www >>/var/log/duplicity/www.log
fi
# Check http://www.nongnu.org/duplicity/duplicity.1.html
# for all the options available for Duplicity.
# Unsetting the confidential variables so they are
# gone for sure.
unset PASSPHRASE
unset FTP_PASSWORD
exit 0

В первый день каждого месяца делается полный бекап + удаляются файлы старше 3 месяцев. Каждый день делается инкрементальный бекап + удаляются файлы старше 3 месяцев. Все логи падают в /var/log/duplicity/*

Складывать данные можно в локальную папку/ftp/ssh/webdav/rsync/s3 плюс для параноиков есть шифрование данных. У меня как раз оно принудительно отключено, но думаю по козе не сложно будет подправить ключики.

Достаются данные буквально одной командой – детально про это написано в мане.

2009
07.19

Не так давно читал на W$ по поводу нового аукциона Копейкофф :) Интересен был сам его формат, так как рассказывали что вещи там продают за копейки, плата берется только за ставки.

После часового исследования правил и цен на купленные товары стало приблизительно ясно, что никто в убыток там не работает :) При средней ставке в 2грн цена товара повышается на 5коп – тоесть к примеру на мониторе(с ценой в 2150грн) который был продан за 47.4грн сыграло  948 ставок, тоесть как минимум выручка была очень близка к реальной стоимости товара. Ясно что за смс оплату голосов ощутимый процент осядет у оператора, но это пример не самой удачной продажи на сайте. К сожалению подобрать чтото более удачное не представляется возможным – сайт уже четвертый день закрыт – не выдержали наплыва пользователей при розыграше новенького лансера :( Но при работающем сайте было достаточно товаров, за которые шла выручка в три раза превышающая стоимость – то есть вполне себе с нормальной прибылью даже с учетом всего.

Пожелаю от себя решить все технические вопросы и продать таки машинку :) “За копейки” ;)

2009
07.13

Если создать virtualenv с ключиком –no-site-packages, то надо будет ставить все вспомогательным либы для django, такие как mysqldb или pil. Просто easy_install mysqldb не получится сделать.

Я погуглил немного и потом методом проб и ошибок у меня вышло следующее:

pip install -E tz-env/ mysql-python -f http://sourceforge.net/projects/mysql-python/files/

где tz-env – название виртуального  окружения.

P.S. возможно это особенность макоси, но у меня вместо mysql_config был бинарник mysql_config5. Не забудьте создать правильную мягкую ссылку что бы все установилось как следует :)

2009
06.21

простота в django

все таки люблю я джанго за его простоту :) много из того, что нужно есть из коробки. Надо было вот отобразить список сгруппированные по первой букве. Просто используем

{% ifchanged object_name.title.0 %} {{ object_name.title.0 }} {% endifchanged %}

в цикле перебора обьектов и все готово :) Всего одна строчка в шаблоне :)

2009
02.23

Новая лопата :)

Уже около месяца являюсь владельцем нового десктопа, после покупки ноутбука около двух лет работал только на нем, старый десктоп ушел подрабатывать домашим сервером к знакомому :)

Машинка не слабая но и не максимум, надеюсь на несколько лет нормальной работы хватит. Что понравилось – Ubuntu 8.10×64 стала с одного компакта и при этом заработали ВСЕ устройства, никаких допиливаний руками или утомительных установок драйверов(привет, виста!). Винду все таки пришлось поставить, так как в комплекте с системником купил два джойстика Logitech Dual Action :)

Для работы же если есть необходимость в услугах “окошек”  - есть вмваря :) Имхо самый правильный способ работы с этой операционкой – если и сломает железо – то виртуальное :) Всегда можна переставить без вреда для компьютера :)

Конечно же, новым инструментом я доволен  и надеюсь он увеличит мою продуктивность в столко раз, во сколько он мощнее, чем  мой ноутбук :)

2009
02.22

Привет всем, я все еще здесь. Немного занят на текущем проекте, очень уж ресурсоемкий он оказывается :) Очень скоро напишу про свой новый инструмент для разработки, естественно продолжим общатсья на тему win/lin, веб разработки вообще и нашего django проекта в частности :)

2008
12.16

Многие хотят попробовать фрилансить, но боятся что получить свой первый бид очень сложно, нужно демпинговать и тд. Отнюдь, достаточно правильно зарегистрировать аккаунт, следую нескольким простым правилам  работе с http://odesk.com :)

Заполняйте профайл по максимуму

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

Подготовьте резюме

Обязательно на английском и желательно в формате PDF(откроется на 95% машин, абсолютно безвреден), в резюме укажите контактную информацию(почту, мессенджер), ваши навыки, опыт работы, предыдущие проекты и вашу участь в них. Резюме будет необходимо при выставлении бидов – когда ставите бид – вы пишете почему должны выбрать вас и можете в приложение добавить резюме, это заствит заказчика посмотреть ваши работы и лишний раз удостоверится всерьезности ваших намерений  :)

Пройдите тесты на профпригодность

Вам необходимо будет как минимум пройти один тест – oDesk Readiness Test for Independent Contractors and Company Managers – тест на знание правил работы с сервисом. Без него ставить биды на сайте не можна, увы. Желательно пройдите еще несколько тестов на проф пригодность – это даст уверенность заказчикам в том, что вы владеете необходимыми знаниями, к тому же они часто ищут работников как раз про пройденным тестам, так что если удастся попасть в десятку лучших – будуту сразу на виду ;)

Пользуйтесь RSS

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

Выполняйте работу качественно и вовремя

Это самый важный пункт :) Довольный клиент оставит хорший отзыв и вернется к вам еще не раз :) А в глазах потенциальных клиентов высокий средний бал за вашу работу станет еще одним серьезным аргументом, что бы нанять именно вас!

Мой профайл не идеален, но как пример :)

Удачи на вольных хлебах!

2008
12.11

Идея

Этой заметкой я начинаю серию о создании сайтов на django.  Для тех, кто не читал вступительный пост – я не супер_ джанго_гуру и не мега_хакер_питона :). Сколько себя помню – работал на РНР, потом пошел тренд на фреймворки и каким-то образом мне понравился именно django. Это было около года назад, может больше. С недавнего времени стараюсь делать свои проекты на нем, но пишу один, потому решил выставить то, что делаю, на суд общественности. Надеюсь, кому то будет полезно, да и мне подскажут где косяки есть ;) ПОЕХАЛИ.

Тема проекта

Общий концепт идеи ясен, теперь о проекте. Сейчас модным трендом являются социальные сети. Давайте и мы создадим соцсеть :) Сделаем систему коллективных блогов с регистрацией, комментариями и.. ну а дальше не будем загадывать, по ходу дела придумаем.

Проект наш будет называться нефутбол – все любят наш отечественный футбол и футболистов которые в нем играют. Но так как наши комманды в основном не радуют нас громкими победами(скорее наоборот), то сайт будет называться нефутбол, мы будем обсуждать и ругать(все культурно, никаких матов и оскорблений)  нефутболистов, выбирать худшего из худших и тд ;)

Read More >>

2008
11.29

Здравствуйте, все читатели и возможные читатели моего блога :)

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

Я хочу сделать открытую разработку одного вполне реального проекта с паралельной публикацией того, что я делаю и как. Заодно и посмотрим, может более знающие люди в Python и Django подскажут – что и где я еще делаю не так.

В целом концепт публикаций уже сформулирован, но хотелось бы услышать пожеланий – что будет более интересно – смотреть видео с процессом написания или читать текст со скриншотами? Также готов выслушать любые другие идеи :)

Заранее спасибо всем отозвавшимся!