воскресенье, 6 февраля 2011 г.

Настройка LAMP + Mercurial + Trac в Ubuntu 10.10

Начну почти с самого начала, но без большого количества подробных комментариев, потому что лень писать подробные. Предполагается, что у вас уже есть сервер с установленной ОС Ubuntu Linux (например, 10.10, как у меня), и там — ssh-сервер для доступа снаружи. Ну или есть доступ прямо в консоль сервера, не важно. А, да, рекомендаций по настройке DNS я не напишу, так как в настройке DNS-серверов я полный профан, а в веб-интерфейсах разных регистраторов и всяких прочих служб, предоставляющих услуги DNS, полагаю, можно разобраться самостоятельно. Также я не расскажу про настройку https, хотя правильнее (потому что безопаснее) было бы работать именно через https с исходниками.

Итак, есть сервер. Надо на нём развернуть несколько девелоперских площадок для разработки веб-сайтов на PHP+MySQL, в качестве системы контроля версий — Mercurial, в качестве issue-трекера — Trac.

Для начала установим MySQL.
# apt-get install mysql-server

Это метапакет, в который сразу входит MySQL Server 5.1 и клиент MySQL. И сразу сделаем необходимые базы данных и заведём пользователей. У нас будет, скажем, два проекта — MyProject1 и MyProject2, и ещё базы для Trac.
# mysql -uroot -p
mysql> create database myproject1;
mysql> create database myproject2;
mysql> create database trac1;
mysql> create database trac2;

В общем виде команда выглядит как «create user USERNAME@HOST identified by PASSWORD»:
mysql> create user 'myproject1'@'localhost' identified by '123';
mysql> create user 'myproject2'@'localhost' identified by '123';
mysql> create user 'trac'@'localhost' identified by '123';

Если вы вносите какие-то изменения руками в таблицу mysql.user, то надо потом сделать flush privileges, чтоб они вступили в силу. При добавлении пользователей через create user этого не требуется. Выдача прав:
mysql> grant all privileges on myproject1.* to 'myproject1'@'localhost';
mysql> grant all privileges on myproject2.* to 'myproject2'@'localhost';
mysql> grant all privileges on trac1.* to 'trac'@'localhost';
mysql> grant all privileges on trac2.* to 'trac'@'localhost';
mysql> flush privileges;
mysql> exit

С MySQL всё. Теперь надо установить apache и PHP с необходимыми библиотеками.
# apt-get install apache2 php5 php5-gd php5-curl php5-mysql

Надо приучить PHP к работе с кириллицей в UTF-8.
# nano /etc/php5/apache2/php.ini

Найдите соответствующие строки, раскомментируйте их и впишите указанные значения:
mbstring.internal_encoding = UTF-8
mbstring.func_overload = 2

Вместо 2 можно вписать и 6 при желании, но 2 обычно достаточно для Битрикса.

Теперь займёмся собственно апачем. Хорошим тоном считается работа с каждым сайтом под отдельным пользователем. Обычно, чтоб не было проблем с правами, пользователя www-data добавляют в группу владельцев файлов сайта, но всё равно там постоянно могут возникать проблемы, когда файл создан из-под апача, а пользователь, соответствующий сайту, не может его отредактировать. Кроме того, я как-то раз наткнулся на проблему сосуществования Trac и веб-интерфейса Mercurial, поэтому предлагаю сделать следующее: заменить apache2-mpm-prefork на apache2-mpm-itk, который позволяет апачу реально запускать форки под разными пользователями без SuExec. Так как сервер рассматривается как девелоперская площадка, то высоких нагрузок не предвидится, и замена prefork на itk на производительности не скажется никак.
# apt-get install apache2-mpm-itk

Создадим пользователей для наших проектов, Trac и Mercurial:
# adduser myproject1
# adduser myproject2
# adduser trac
# adduser hg

Двум пользователям, для которых актуальна работа с репозиториями Mercurial, сделаем в домашних папках файлы .hgrc с указанными юзернеймами, чтоб не пришлось указывать каждый раз при коммите.
# cd /home/myproject1 
# nano .hgrc

Содержимое может быть примерно таким:
[ui] 
username = myproject1

И сделаем самого пользователя владельцем этого файла.
# chown myproject1:myproject1 .hgrc

Аналогично можно поступить со вторым.
И ещё добавим пользователя hg в группы myproject1 и myproject2, чтоб можно было делать push через http (или https). Я обычно добавляю в группы пользователей так:
# nano /etc/group

Нахожу в файле соответствующие строчки и добавляю в них пользователей:
myproject1::1001:myproject1,hg
myproject2::1002:myproject2,hg

Создадим папки для наших проектов, Trac и Mercurial:
# cd /var/www/
# mkdir myproject1
# mkdir myproject2
# mkdir hg
# mkdir trac
# chown myproject1:myproject1 myproject1/
# chown myproject2:myproject2 myproject2/
# chown trac:trac trac/
# chown hg:hg hg/

Создадим виртуальные хосты для двух наших проектов:
# nano /etc/apache2/sites-available/myproject1

Минимальное содержимое должно быть таким:
<VirtualHost *:80>
ServerAlias myproject1.local
AssingUserID myproject1 myproject1
DocumentRoot /var/www/myproject1
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
</VirtualHost>

Аналогично для myproject2.
К настройке апача мы ещё вернёмся чуть позже, а сейчас — установим Mercurial и Trac. И полезный в дальнейшем модуль для апача.
# apt-get install mercurial trac trac-mercurial python-mysqldb libapache2-mod-wsgi

Небольшое лирическое отступление — создадим пару репозиториев Mercurial и проверим, как работает связка Apache+PHP+MySQL.
# su myproject1 
$ cd myproject1
$ nano index.php

Содержимое файла вполне может быть таким:
<?php 
$cid = mysql_connect('localhost', 'myproject1', '123');
if(!$cid) die(mysql_error());
if(!mysql_select_db('myproject1', $cid)) die(mysql_error($cid));
echo 'Ok';
mysql_close($cid);
?>

Создадим репозиторий, и в него для проверки можно добавить свежесозданный index.php.
$ hg init
$ hg add index.php
$ hg ci -m "Initial commit"

Отредактируем файл hgrc внутри служебной папки репозитория для работы через веб-интерфейс.
$ cd .hg
$ nano hgrc

Внутрь напишем следующее:
[web] 
allow_push = *
push_ssl = false
contact = my 1 contact
description = My project 1 description

И запретим даже чтение этого файла другим пользователям, для всей же папки .hg разрешим запись группе, чтоб была возможность сделать push через http(s):
$ chmod o= hgrc
$ cd ..
$ chmod -R g+w .hg

Вернёмся в сессию суперпользователя, выйдя из su.
$ exit

Аналогичные манипуляции можно провернуть и для myproject2.
Теперь настало время настроить веб-интерфейс Mercurial. Напомню, мы в сессии суперпользователя в /var/www.
# nano /etc/apache2/sites-available/hg

Редактируем содержимое файла:
<VirtualHost *:80>
ServerAlias hg.local
AssignUserID hg hg
WSGIScriptAliasMatch ^(.*)$ /var/www/hg/hgweb.cgi$1
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
</VirtualHost>

Делаем симлинк:
# ln -s /etc/apache2/sites-available/hg /etc/apache2/sites-enabled/hg

Создаём под пользователем hg необходимые файлы:
# su hg
$ cd hg
$ nano hgweb.cgi

Содержимое hgweb.cgi:
#!/usr/bin/env python 
config = "/var/www/hg/hgweb.conf"
import cgitb; cgitb.enable()
import os
os.environ["HGENCODING"] = "UTF-8"
from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb import hgweb, wsgicgi
application = hgweb(config)

И ещё один файл:
$ nano hgweb.conf

С примерно таким содержимым:
[paths] 
myproject1 = /var/www/myproject1
myproject2 = /var/www/myproject2

Выходим из su обратно в сессию суперпользователя и перезапускаем апач.
$ exit
# service apache2 restart

Теперь самое сложное — настройка Trac.
# su trac
$ cd trac
$ mkdir myproject1 _env
$ cd myproject1_env
$ trac-admin . initenv
Project Name> myproject1
Database connection string> mysql://trac:123@localhost:3306/trac1

В общем случае строка для соединения с MySQL представляет из себя следующее: mysql://USERNAME:PASSWORD@HOST:PORT/DATABASENAME
Path to repository> /var/www/myproject1
$ trac-admin . deploy dep
$ cd conf
$ nano trac.ini

Находим следующий параметр и пишем туда hg:
repository_type = hg

И в конец дописываем (секции [components] обычно нет поначалу):
[components] 
tracext.hg.* = enabled

Это можно повторить и для второго проекта. Теперь добавим виртуальный хост апача:
$ exit
# nano /etc/apache2/sites-avaliable/trac

Сколько проектов у нас есть, столько WSGIScriptAlias и пишем.

<VirtualHost *:80>
ServerAlias trac.local
AssignUserID trac trac

DocumentRoot /var/www/trac
WSGIScriptAlias /myproject1 /var/www/trac/myproject1_env/dep/cgi-bin/trac.wsgi
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
</VirtualHost>

И последний штрих.
# ln -s /etc/apache2/sites-available/trac /etc/apache2/sites/enabled/trac
# service apache2 restart

4 комментария:

  1. А как в Вашей схеме коммитить базу мускула?

    ОтветитьУдалить
  2. Ну это слабое место и больной вопрос :) Можно хранить скрипты, меняющие структуру таблиц, чтоб в любой момент можно было их все по порядку снова запустить и получить пустые таблицы (или содержащие немного данных) с нужной структурой с нуля. Но этот способ хранения требует некоторых дополнительных усилий от разработчиков.

    ОтветитьУдалить
  3. базы можно бэкапить скриптом при затягивании или выдавливании

    ОтветитьУдалить

Ублюдочный Гугл поломал форму комментариев. Извините.

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