SVN + trac: несколько проектов на одном сервере

Несколько вступительных сток:
Данная тема поднималась тут не раз, но рассматривался вариант создания и настройки только одного репозитория. В моём случае нужно было создать три локальных репозитория на одной машине.
Как ОС была выбрана Ubuntu Server x64 с отключеными иксами…
Итак, приступим:

Задача

Установить на только что инсталлированный Ubuntu последнюю версию Trac, создать репозитории для нескольких проектов и настроить окружение соответственно. Структура проектов должна быть полностью корректной, установка максимально быстрой при минимальном количестве пакетов. Авторизация в репозитории и окружения Trac может быть общей, но позволяющей индивидуальную настройку для каждого проекта. Также, установка должна быть максимально независима от версий.

Дано

Ubuntu 10.10 Server x64
Два пользователя: user1 и user2
Два проекта: Some Project и Another Project
Требуется доступ в Trac и репозиторий по адресам /localProjects и /svn соотвественно

Решение

Пункт 1. Установка базовых дистрибутивов, доступных в пакетах.

Для начала можно установить дистрибутивы, доступные в репозиториях Ubuntu. Установим, предварительно обновив данные о пакетах:

sudo apt-get update
 sudo apt-get install python
 sudo apt-get install apache2
 sudo apt-get install subversion
 sudo apt-get install g++

Пункт 2. Установка trac-related пакетов через easy_install.

Для Python существует утилита, облегчающая установку python-пакетов, называемых также яйцами (они имеют расширение *.egg). Установим её:

wget peak.telecommunity.com/dist/ez_setup.py
 sudo python ./ez_setup.py

И посредством неё установим последние версии Pygments (инструмент для подсветки программного кода на Python), Genshi (механизм шаблонов от создателей trac) и собственно самого trac:

sudo easy_install Pygments
 sudo easy_install Genshi
 sudo easy_install Trac

Пункт 3. Создание репозиториев.

Создадим репозитории для наших проектов и сделаем первые коммиты, содержащие отправные точки для их структур. Все репозитории будут находиться в каталоге /var/svn, полностью доступном для сервера, каждый в своём подкаталоге — такой метод удобен при наличии нескольких проектов и это будет заметно в следующем пункте, на этапе настройки авторизации.

sudo mkdir /var/svn
 sudo mkdir /var/svn/someProject
 sudo mkdir /var/svn/anotherProject
 cd /tmp
 sudo rm -rfR * # удалить все обычные файлы
 sudo rm -rfR .* # удалить все скрытые/системные файлы
 mkdir /tmp/someProject
 mkdir /tmp/someProject/trunk
 mkdir /tmp/someProject/tags
 mkdir /tmp/someProject/branches
 mkdir /tmp/anotherProject
 mkdir /tmp/anotherProject/trunk
 mkdir /tmp/anotherProject/tags
 mkdir /tmp/anotherProject/branches
 sudo svnadmin create /var/svn/someProject
 sudo svn import ./someProject file:///var/svn/someProject \
 -m "Initial import"
 sudo svnadmin create /var/svn/anotherProject
 sudo svn import ./anotherProject file:///var/svn/anotherProject \
 -m "Initinal import"
 sudo chown -R www-data:www-data /var/svn

Пункт 4. Связывание apache и subversion.

Необходимо настроить доступ извне для созданных репозиториев. Для этого нужно установить модуль dav_svn для apache2 и заодно, раз мы работаем с subversion, установим связку subversion c Python, для корректной работы trac с репозиториями:

sudo apt-get install libapache2-svn
 sudo apt-get install python-subversion

Теперь нужно настроить установленный модуль (при установки он автоматически включается для apache, если нет — используйте a2enmod dav_svn по завершению настройки):

sudo vi /etc/apache2/mods-available/dav_svn.conf

Ниже приведено точное содержимое конфигурационного файла. При обращении на путь /svn/… модуль авторизации apache будет обращаться к файлу /etc/apache2/dav_svn.passwd за списком пользователей, а затем давать права на доступ к соответствующему проекту из файла /etc/apache2/dav_svn.authz. Обратите также внимание на использование SVNParentPath вместо SVNPath — таким образом subversion-модуль поймёт, что мы используем мультипроектную структуру и будет обрабатывать путь не как один общий репозиторий, а как несколько внутренних:

<Location /svn>
 DAV svn
 SVNParentPath /var/svn
 AuthType Basic
 AuthName "Subversion Repository"
 AuthUserFile /etc/apache2/dav_svn.passwd
 AuthzSVNAccessFile /etc/apache2/dav_svn.authz
 Require valid-user

Создадим соответствующих пользователей в файлах авторизации. Используйте пароли попроще для проверки и не забудьте их потом поменять:

sudo htpasswd -c /etc/apache2/dav_svn.passwd user1
 sudo htpasswd /etc/apache2/dav_svn.passwd user2

Создадим файл аутентификации:

sudo vi /etc/apache2/dav_svn.authz

В открытым файле опишем права доступа (на чтение — “r” и на запись — “w“) пользователей в соответствующие репозитории:

[/]
 user1=r
 user2=r
 
 [/someProject]
 user1=rw
 user2=r
 
 [/anotherProject]
 user1=r
 user2=rw

Пункт 5. Создание окружений trac.

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

sudo mkdir /var/trac
 cd /var/trac

Теперь создадим для каждого из них, по очереди, окружение:

sudo trac-admin someProject initenv
 sudo trac-admin anotherProject initenv

Имена проектов остаются на ваше усмотрение, тип репозиториев — по умолчанию svn (просто нажать Enter), путь к базе общий, по умолчанию (sqlite:db/trac.db, аналогично), пути к репозиториям: /var/svn/someProject и /var/svn/anotherProject соответственно.

Дадим права apache пользоваться этим каталогом.

sudo chown -R www-data:www-data /var/trac

Пункт 6. Связывание apache и trac.

Есть несколько вариантов такого связывания, мы остановимся на быстром, но надёжном способе — через mod_python (описания способов на сайте trac). Для этого модуль нужно установить (также, если он не включился после установки, по завершению настройки используйте a2enmod mod_python):

sudo apt-get install libapache2-mod-python

Настроим доступ к окружениям trac:

sudo vim /etc/apache2/sites-available/trac

Эта настройка специфична для использования mod_python (руководство на сайте trac, см. описания, если необходимы другие способы настройки). Обработчиком обращений по адресу /localProjects выступит модуль, он будет рассматривать каталог /var/trac/ как корень нескольких проектов и содаст страницу с их списком (редактируемый шаблон можно найти внутри исходников trac), аналогично принципам SVNParentPath, URI передаётся в код trac. Запросы на вход будут обрабатываться по пользователям из того же passwd файла, из которого берёт их список subversion, а их права на действия в окружениях trac раздаются через trac-admin или в GUI-версии TracAdmin, доступной для аминистраторов окружений (будьте внимательны, пользователи создаваемые через интерфейс также добавляются в этот файл и доступны к использованию для настройки авторизации в subversion через authz-файл (по умолчанию у них нет никаких прав)).

<Location /localProjects>
 SetHandler mod_python
 PythonInterpreter main_interpreter
 PythonHandler trac.web.modpython_frontend
 PythonOption TracEnvParentDir /var/trac
 PythonOption TracUriRoot /localProjects
 
 
 <LocationMatch /localProjects/[^/]+/login>
 AuthType Basic
 AuthName “Local Projects”
 AuthUserFile /etc/apache2/dav_svn.passwd
 Require valid-user

SVN, trac, ubuntu
http://habrahabr.ru/sandbox/22614/

Запись опубликована в рубрике Linux, svn, trac. Добавьте в закладки постоянную ссылку.