30 июня 2010 г.

musicmans.ru | Как сделать сайт на Django | Настраиваем Eclipse

Подготовка Eclipse

1. Качаем Eclipse на машину разработчика (windows, linux).

2. В Eclipse - Help->Install New Software, выбираем из выпадающего списка Helios - http://download.eclipse.org/releases/helios, выбираем:
General Purpose Tools - Marketplace Client 1.0.0.v20100611-0430
Это новый удобный клиент репозитория приложений для Eclipse. Следует учесть, что в этом репозитории находятся и платные приложения, так что, проверяйте информацию нажатием на кнопочку "i". Почитать обзор.

3. Заходим в Help-Eclipse Marketplace, устанавливаем pydev (поддержка python).
4. Заходим в Help-Eclipse Marketplace, устанавливаем mylyn.

Почитать про Mylyn здесь и здесь.

5. Обеспечиваем синхронизацию задач mylyn в eclipse и redmine.

6. Заходим в Help-Eclipse Marketplace, устанавливаем Subversive (считайте меня консерватором) (после перезапуска устанавливаем коннектор SVN Kit последней версии).

7. Устанавливаем Aptana (Aptana Studio 3.0.0 Beta, 2я не установилась на Helios) (редактирование шаблонов html, css, может быть и js).
Update Site: http://download.aptana.com/studio3/plugin/install

Subversion

Будем использовать через svn+ssh://. Устанавливаем subversion и ssh на сервер для управления кодом.
#apt-get install subversion ssh

Создаем репозиторий:

root@codeserver:~# cd /
root@codeserver:/# mkdir repos
root@codeserver:/# cd repos/
root@codeserver:/repos# svnadmin create musicmans


Добавляем пользователя и устанавливаем владельца:

#useradd -m svnuser
#chown -R svnuser:svnuser /repos/musicmans/

Проверяем, что пользователь может логиниться по ssh.
Далее, в eclise на машине разработчика переходим в перспективу SVN Repository Exploring, в Repository Location, и добавляем New-Repository Location.

Указываем URL: svn+ssh://codeserver/repos/musicmans/, указываем логин, пароль, включаем Enable Struсture Detection, ну и смотрим другие параметры.

После успешного подключения создаем структуру репозитория в New -> Project Structure, Monolithic layout.

Создание проекта

Далее, нам надо создать каркас django проекта и выложить его в trunk.

Как установить python (2.6), django (1.2), рассказывать не буду, мануалов масса.

В новом pydev появилась замечательная вещь, как создание Django проекта из мастера создания проектов.

Переходим в перспективу Pydev, в контекстном меню package explorer указываем New - Project:



Далее, введем название проекта, директорию, а также необходимо настроить интерпретатор python, нажав на кнопку autoconfig:


Выбираем версию django. Выбираем Database Engine. От обещанного sqlite3 я отказался, решив использовать postgresql как в разработке, так и на рабочем сервере. Считаем что, postgresql установлен на машине разработчика (мануалов масса на любую систему).

После окончания работы мастера наблюдаем примерно такую картину:



Еще в pydev появилось вот такое меню для проекта:



Поменяем кодировку проекта на UTF-8, если необходимо (пункт меню Properties).

Далее, расшарим проект в репозиторий.

Subversive замечательно справляется со структурой trunk, branches, tags.

Сделаем так, что у нас проект будет находится в trunk под именем backend, то есть trunk/backend, ведь в будущем у нас может появиться и другие проекты, которые надо будет разместить в транке, например проект gwt.

В контекстном меню проекта указываем -> Team - Share Project, далее несколько окон по умолчанию, в окне указания расположения проекта:
use specified name: backend
Нажимаем далее, в комментарии видим что-то похожее:
Share project "musicmans" into "svn+ssh://codeserver/repos/musicmans"
И коммитим изменения, в окне с коммитом необходимо добавить *.setting, *.pydevproject и *.project в svn:ignore (контекстное меню в списке ресурсов).
Перейдем в SVN Repository Exploring, в Repository Location нажмем на кнопку обновить:



Предварительную настройку директорий и проекта выполним в транке, а конкретные задачи создав ветку и переключившись в нее. Смотрите, как это просто делается в subversive:





Создаем и сразу переключаемся в ветку. Пока делать этого не будем. На этом настройка Eclipse пока закончена.

29 июня 2010 г.

musicmans.ru | Как сделать сайт на Django | Схема работы

Ну что же. Инструментарий у нас уже готов. Вникаем в общую схему работы.

Схема такая:
1. Разрабатываем локально, используя отладку Django в Eclipse (наверное будем использовать SQLite при разработке, чтобы было проще, плюс файл базы можно будет хранить в svn, для одного разработчика, я думаю, это нормально).
2. Subversion. Общепринятая структура svn проекта:

branches
tags
trunk

Как их сделать расскажу позже. Сейчас остановимся на теории.
Итак, trunk - рабочая копия проекта, trunk должен работать, не забываем про это.
Если trunk должен работать, то как коммитить недоделанные задачи? Для этого есть branches - ветки. Когда перед нами встает задача по модернизации или исправлению ошибок, создаем ветку (копию) из проекта trunk в branches.
После внесения изменений (и соответственных между ними коммитов/апдейтов ветки), выполняем слияние ветки с trunk.
tags - метки, это копии проекта в которые нельзя коммитить, обычно там хранятся копии релизов.

Если ничего не понятно, читаем книгу или ждем продолжения (рассмотрим вопрос, как это делается в Eclipse Subversive).

3. Используя Fabric, мы будем из tag/current с сервера с Subversion выкладывать релиз на сервер с сайтом, а также обновлять базу (с помощью South).

musicmans.ru | Как сделать сайт на Django | Начало

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

Технологии.

Серверная сторона - django. Конечно будем использовать сторонние django приложения, и не будем писать тесты, тестировать будут пользователи. :) Элементарные вещи о django рассматриваться не будут, для этого есть django book.

Клиентская сторона - наверное gwt. Пока не определился, но думаю внедрим.

Инструменты и техническая сторона

Техническая сторона - покупайте домен и vds. VDS можете купить два или сделать собственный сервер, например, дома, один для сайта, другой для хранения и управления кодом.
Собственно, предыдущие посты как раз были подготовкой к работе.
Система контроля версий - Subversion.
Управление проектом и баг-трекер - Redmine.
Среда разработки Eclipse (кстати вышел Helios 3.6) с pydev, Subversive + расширения по вкусу плюс второй экземпляр Eclipse для gwt.

Ну вот вроде бы и все. Если не все, допишу позже.
Сроки. Ориентируюсь на полгода до более-менее приличного сайта (потому что есть еще основная работа, к сожалению :) ).
Все этапы разработки сразу будут выкладываться на сайт http://musicmans.ru .

Следить за постами о разработке можно по тегу musicmans.ru.

27 июня 2010 г.

Дружим redmine и eclipse: mylyn

Продолжим заниматься redmine'ом.

Mylyn («майлин») — подсистема Eclipse управления заданиями.

Mylyn динамически подстраивает интерфейс Eclipse, оставляет только те элементы в дереве ресурсов, которые соответствуют текущей задаче. Mylyn логически продолжает такие «диалоги», как «Go Into», «Open Associated Perspective?»

Ставим в эклипс поддежку redmine для mylyn:

Eclipse redmine mylyn update site: http://redmin-mylyncon.sourceforge.net/update-site/nightly/

Скачиваем плагин для сервера отсюда.

Закачиваем плагин в директорию /vendor/plugins/ .

Перезапускам lighttpd:
# /etc/init.d/lighttpd restart

Заходим по адресу https://srv/redmine/mylyn/version , должны увидеть нечто такое:


2.6.4.stable
0.9.4.stable
2.3.5


а также сюда https://srv/redmine/admin/plugins

Другие варианты установки здесь.

Настройка клиента:

Далее, открываем перспективу planning в eclipse.



Добавляем репозиторий:





Настраиваем примерно следующим образом и нажимаем validate settings (что приятно не возникло проблем с http auth и https):



Далее создаем запрос задач (спросит автоматом после установки соединения) из redmine которые мы хотим видеть.

Далее пробуем создать задачу в eclipse: правой кнопкой на task list->New->Task...

25 июня 2010 г.

Установка redmine на lighttpd в debian squeeze

Начинаем как здесь:

#apt-get install mysql-server rails lighttpd
#apt-get install librmagick-ruby
#apt-get install libmysql-ruby
#apt-get install subversion git-core
#apt-get install libfcgi-ruby1.8

Создаем пользователя и базу:

# mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 63
Server version: 5.1.47-1 (Debian)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database redmine character set utf8;
Query OK, 1 row affected (0.08 sec)

mysql> create user 'redmine'@'localhost' identified by 'password';
Query OK, 0 rows affected (0.47 sec)

mysql> grant all privileges on redmine.* to 'redmine'@'localhost';
Query OK, 0 rows affected (0.01 sec)

Добавляем системного пользователя redmine:

#adduser --disabled-password redmine
#su redmine

Качаем релиз wget'ом redmine (я работал с версией redmine-0.9.4.tar.gz).

Распаковываем содержимое в ~/redmine (tar zxf)

Создаем файл redmine*/config/database.yml (можно скопировать из примера):

production:
adapter: mysql
database: redmine
host: localhost
username: rbuser
password: password
encoding: utf8

Генерируем секретный ключ сессий.

~/redmine$ rake generate_session_store
(in /home/redmine/redmine)

Заполняем базу данных.

~/redmine$ RAILS_ENV=production rake db:migrate
(in /home/redmine/redmine)
rake aborted!
Could not find RubyGem rack (~> 1.0.1)

Я получил такую ошибку.

#gem install rack -v 1.0.1
Successfully installed rack-1.0.1
1 gem installed
Installing ri documentation for rack-1.0.1...
Installing RDoc documentation for rack-1.0.1...

Запускаем повторно из под пользователя redmine:

#su redmine
redmine@srv:/root$ cd ~/redmine/
redmine@srv:~/redmine$ RAILS_ENV=production rake db:migrate
(in /home/redmine/redmine)

Должно все успешно заполниться.

Настройка lighttpd.

Создаем файл /etc/lighttpd/conf-available/20-redmine.conf :

/etc/lighttpd/conf-available# cat 20-redmine.conf
server.modules += ( "mod_fastcgi" )

$HTTP["url"] =~ "^/redmine/" {
alias.url = ("/redmine" => "/home/redmine/redmine/public")
server.document-root = "/home/redmine/redmine/public/"
server.error-handler-404 = "/redmine/dispatch.fcgi"
index-file.names = ("dispatch.fcgi")
fastcgi.server += (
".fcgi" => (
"localhost" => (
"min-procs" => 1,
"max-procs" => 2,
"check-local" => "disable",
"socket" => "/home/redmine/redmine/tmp/sockets/redmine_fcgi.socket" + var.PID,
"bin-path" => "/home/redmine/redmine/public/dispatch.fcgi",
"bin-environment" => (
"RAILS_ENV" => "production",
"RAILS_RELATIVE_URL_ROOT" => "/redmine",
"RAILS_ROOT" => "/home/redmine/redmine"
)
)
)
)
}

Включаем конфигурацию:

#lighttpd-enable-mod redmine

Создаем файл:

srv:/home/redmine/redmine/public# cp dispatch.fcgi.example dispatch.fcgi
srv:/home/redmine/redmine/public# chmod +x dispatch.fcgi

Даем права пользователю www-data (запускает lighttpd)

srv:/home/redmine#chown -R www-data:www-data redmine

Даем права на директории

srv:/home/redmine#chmod 755 logs tmp files

Перезапускаем конфигурации lighttpd:

#/etc/init.d/lighttpd force-reload

Заходим: http://srv/redmine/

По умолчанию, логин admin, пароль admin.

Если что-то пошло не так, смотрим логи:

#tail -F /var/log/lighttpd/access.log /var/log/lighttpd/error.log /home/redmine/redmine/log/production.log

18 июня 2010 г.

Продолжение про kvm

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

#virsh autostart name_domain

Чтобы корректно выключить (эмулируется нажатие на клавишу питания, что для современных дебианов с поддержкой acpi обеспечивает корректное завершение работы) виртуальную машину выполните:

#virsh shutdown name_domain

Ну и чтобы запустить, выполните:

#virsh start name_domain

Теперь про выключение/перезагрузку основной системы и соответственное выключение виртуальных машин (может очень полезным при выключении основной системы с помощью apcupsd (управление питанием в зависимости от состояния бесперебойника APC).


Создаем скрипт /etc/init.d/vmshutdown


#!/bin/bash

# Original Author :
# Joern http://www.linux-kvm.com/content/stop-script-running-vms-using-virsh
#
# Modified by : Vivek Kapoor http://exain.com
# Date: 22 May 2009

# Parameters you can modify :: START

TIMEOUT=90
LISTFILE=/root/runvm.lst
LOGFILE=/var/log/kvmshutdown.log
# Parameters you can modify :: STOP

PS=/bin/ps
SSH=/usr/bin/ssh
GREP=/bin/grep
CUT=/usr/bin/cut
VIRSH=/usr/bin/virsh
TR=/usr/bin/tr
CAT=/bin/cat
DATE=/bin/date

# Function to shutdown the virtual machine
kvmshutdown () {
COUNT=0
PID=$($PS ax|$GREP $1|$GREP kvm|$CUT -c 1-6)

echo kvmshutdown \: Shutting down $1 with pid $PID

#$VIRSH shutdown $1
$($SSH root@$1 halt)

while [ "$COUNT" -lt "$TIMEOUT" ]
do
$PS --pid $PID
if [ "$?" -eq "1" ]
then
return 0
else
sleep 5
COUNT=$(($COUNT+5))
fi
done

echo kvmshutdown \: Timeout happened. Destroying VM $1

$VIRSH destroy $1

return 1

}

# The program begins here

$VIRSH list 2>/dev/null|$GREP running|$TR -s \ |$CUT -f3 -d\ > $LISTFILE

VMN=`$CAT $LISTFILE`

for vm in $VMN
do
echo "$vm" is running
kvmshutdown "$vm"
if [ "$?" -eq "0" ]
then
echo VM "$vm" normally shutdown
echo `$DATE +%Y-%m-%d\ %H:%M:%S` VM $vm normally shutdown >> $LOGFILE
else
echo VM "$vm" destroyed !
echo `$DATE +%Y-%m-%d\ %H:%M:%S` VM $vm destroyed >> $LOGFILE
fi;
done


Далее, права запуска:
#chmod 755 vmshutdown

Проверяем выключение по ssh (как в скрипте, есть вариант через virsh - пробуйте), не забыв прописать хост в /etc/hosts.

server:/etc/init.d# ./vmshutdown stop

У меня спросил разрешения на отпечаток ключа RSA, после пароль рута, и только тогда выключился. Наверное метод через ssh требует беспарольного доверенного соединение, поэтому вернемся к virsh (закомментируем $($SSH root@$1 halt) и раскомментируем $VIRSH shutdown $1).

Пробуем:

server:/etc/init.d# ./vmshutdown stop

У меня все получилось - скрипт выключил все виртуальные машины. Остается внедрить его в rc.d.

Смотрим на уровень запуска самого kwm на основной системе.

/etc/rc0.d# ls | grep kvm
K20qemu-kvm

Посему выставляем 18 уровень для завершения виртуальных машин.


#ln -s /etc/init.d/vmshutdown /etc/rc0.d/K18vmshutdown
#ln -s /etc/init.d/vmshutdown /etc/rc6.d/K18vmshutdown


Теперь подключаемся по ssh к виртуальным машинам и к основному хосту. На основном выполняем:
#poweroff
или:
#reboot
и наблюдаем за виртуальными машинами.

Они должны выключиться раньше основной.

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

13 июня 2010 г.

Установка kvm на Debian Squeeze

Займемся виртуализацией, с аппаратной поддержкой процессора.

KVM (или Kernel-based Virtual Machine) — это программное решение, обеспечивающее виртуализацию в среде Linux на платформе x86, которая поддерживает аппаратную виртуализацию на базе Intel VT (англ.) (Virtualization Technology) либо AMD SVM (Secure Virtual Machine).

Добавлю, без аппаратной поддержки процессором она, как я понял, работать не будет.

Ставим основную систему. Для создания загрузочной флешки используем уже установленный линукс.
У меня будущий серверный процессор AMD, а также потому что squeeze еще unstable, качаем образ отсюда. Я скачал debian-testing-amd64-netinst.iso.

Основную систему будем ставить с флешки. Качаем файл boot.img.gz отсюда. Далее распаковываем образ на флешку:

#zcat boot.img.gz > /dev/sdX

где /dev/sdX - ваша флешка.

Далее вытащим и вставим флешку обратно. Скопируем в корень на автоматически примонтированную флешку файл debian-testing-amd64-netinst.iso. Все, отмонтируем флешку, вставляем в наш сервер, загружаемся и устанавливаем систему.

Создадим две директории - iso для установочных образов, vms для образов виртуальных машин. Копируем с флешки образ в iso.

Устанавливаем kvm:

#apt-get install qemu-kvm libvirt-bin virtinst bridge-utils

bridge-utils - сетевой мост. Настраиваем:

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
address 192.168.0.20
netmask 255.255.255.0
gateway 192.168.0.1
bridge_ports eth0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off

Перезагружаемся.

Проверяем

#ifconfig
#virsh list

virsh - это команда управления виртуальными машинами.

полезно virsh help.

Теперь настала очередь создать виртуальную машину.

#virt-install -n mediasrv -r 256 -f /vms/mediasrv.qcow2 -s 300 -c /iso/debian-testing-amd64-netinst.iso --vnc --vncport=5900 --noautoconsole --os-type linux --os-variant=generic26

-r - оперативная память
-f - файл-образ сервера
-s - размер файл-образа в гигабайтах
-c - cdrom
- остальное понятно.

как ни странно, но подключиться напрямую к vnc серверу (с другой системы в сети) мне не удалось, по-видимому Vinagre не справляется с авторизацией. Поэтому у меня получилось подключиться через ssh тунель:

$ ssh -L 5900:localhost:5900 root@server

После подключения, в Vinagre подключаемся к localhost:5900 и попадаем на новую виртуальную систему, с экраном установки debian.

Устанавливаем ssh на обе системы и дальше дело техники.

ps. В планах опробовать паравиртуализацию.