воскресенье, 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. базы можно бэкапить скриптом при затягивании или выдавливании

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

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