Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> WWW —> svn+apache+trac

Установка и настройка SVN сервера с доступом к репозиториям по http протоколу.

Автор: FenX.


Понадобился мне как-то svn сервер,
да ещё и с возможностью просматривать содержимое репозиториев
в самом обыкновенном браузере,
Без каких-то там ssl и прочей приблуды.
"Прогуглив" тонну статей таки поставил сервер...
После 2х дней колупаний, решил накатать статью, может кому пригодится :)

Итак, имеем:
$ uname -r
7.0-RELEASE-p6


Задачи:
Система контроля версий ( Subversion )
Доступ к репозиториям по http протоколу ( Apache )
Красивая "web морда" для репозиториев.
( Я использую Trac, о чём и тут напишу, а так "морд" полно :) )

Установка:
Ставим mysql
Для хранения правил, груп, и логов Trac`a будем использовать базы mysql.
Всё-таки рекомендую устанавливать mysql самым первым из списка, по разного рода соображениям :)

Очень не плохую статью по mysql`у написал Lissyara,
рекомендую с ней ознакомиться http://www.lissyara.su/?id=1189

Для тех, кому лень читать - краткий курс молодого бойца:
Всё это делать не обязательно и, если mysql уже есть в системе, вполне можно использовать имеющуюся версию.
$ pkg_info | grep mysql
и если есть, то данный шаг пропускаем, иначе:
$ cd /usr/ports/databases/mysql50-server
$ make WITH_CHARSET=utf8 WITH_COLLATION=cp1251_bin \
BUILD_OPTIMIZED=yes BUILD_STATIC=yes \
&& make install clean


Ставим apache httpd server
Я ставил индейца 2.2, но думаю что это не принципиально :)
на момент установки, в портах была версия 2.2.9
$ cd /usr/ports/www/apache22
$ make config

[X] THREADS               Enable threads support in APR 
[X] BDB                   Enable BerkeleyDB dbm
[X] SVN                   Enable Subversion support
[X] DAV                   Enable mod_dav
[X] DAV_FS                Enable mod_dav_fs

$ make install clean

Собираем python
Python нужен для работы Trac системы.
Проверяем, установлен ли уже питон:
$ pkg_info | grep python
Если ответ положительный, что более чем вероятно (в списке появится что-то типа: pythonХХ-х.х.х),
То просто пропускаем этот шаг, если же питон не установлен, то:
$ cd /usr/ports/lang/python25
$ make config

Убираем пункты:
[ ] IPV6             Enable IPv6 support

$ make install clean

Ставим subversion
Для версии 1.5.4_2
$ cd /usr/ports/devel/subversion
$ make config

[X] MOD_DAV_SVN       mod_dav_svn module for Apache 2.X
[X] NEON              WebDAV/Delta-V repo access module (neon)
[X] BDB               db4 repository backend

$ cd ../py-subversion
$ make install clean


Установка trac
На момент установки в портах была версия 0.11.2
$ cd /usr/ports/www/trac
(все опции оставил по дефолту)
$ make install clean


Ставим mod_python
Для корректной работы Trac, нужна поддержка индейцем языка python.
$ cd /usr/ports/www/mod_python3
$ make install clean


Ставим mysql-python
Нужен для того, чтобы mysql научился понимать то,
что толкает ему питон, а в нашем случае это делает Trac :)
$ cd /usr/ports/databases/py-MySQLdb
$ make install clean


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

Ну а пока - продолжим-с :)

Теперь всю эту громадину необходимо отконфигурировать...

Конфигурирование:
Конфигурируем Apache 2.2
$ edit /usr/local/etc/apache22/httpd.conf
Обычно, при сборке Subversion модули в конфиг добавляются сами,
если вдруг этого не произошло, то добавляем:
LoadModule dav_svn_module       libexec/apache22/mod_dav_svn.so
LoadModule authz_svn_module     libexec/apache22/mod_authz_svn.so

Добавляем подгрузку python_module:
LoadModule python_module        libexec/apache22/mod_python.so

Конфигурируем начальные параметры:
# e-mail администратора :)
ServerAdmin admin@domain.com
# Адрес вашего сервера
ServerName http://www.domain.com:80
# стартовая директория.
DocumentRoot "/usr/local/www"

Находим первоначальный блок
<Directory />
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

и заменяем его на
<Directory />
    Options Includes Indexes FollowSymLinks
    AllowOverride All
    Allow from all
</Directory>

Удаляем первоначальный блок управления сайтом,
который без коментов выглядит так:
<Directory "/usr/local/www/apache22/data">
   Options Indexes FollowSymLinks
   AllowOverride None
   Order allow,deny
   Allow from all
</Directory>

Он нам не понадобится.

ну и наконец убираем комментарии со следующих строк:
# Нужен для подгрузки некоторых стандартных директорий и алиасов.
Include etc/apache22/extra/httpd-autoindex.conf
# Управление виртуальными хостами :)
Include etc/apache22/extra/httpd-vhosts.conf
# Подгружает мануал по апачу, может пригодиться.
Include etc/apache22/extra/httpd-manual.conf
# Несколько стандартных опций, которые не указаны в httpd.conf,
# но нужны для нормальной работы апача :)
Include etc/apache22/extra/httpd-default.conf

Теперь самое главное - создаём свои "хосты" :)
Вообще - просто мне так удобнее,
когда репозиторий доступен не по domain.com/svn, а по svn.domain.com...
Поэтому я пошёл путём разбивки на виртуальные хосты.
Да и может позже пригодиться,
когда понадобиться прикрутить на одну машину более одного сайта :)

Итак:
$ edit /usr/local/etc/apache22/extra/httpd-vhosts.conf
Удаляем все приведённые там примеры хостов и создаём свои:
<VirtualHost *:80>
    # e-mail админа сервера.
    ServerAdmin admin@domain.com
    # корень хоста.
    DocumentRoot "/usr/local/www/apache22/domain.com"
    # доменное имя, к которому привязан данный хост.
    ServerName domain.com
    # дополнительное имя, по которому будут на этот хост попадать.
    ServerAlias www.domain.com
    # лог ошибок для данного хоста
    ErrorLog "/usr/local/www/apache22/domain.com/error.log"
    # лог передаваемой информации для данного хоста.
    CustomLog "/usr/local/www/apache22/domain.com/access.log" common
</VirtualHost>

Создаём хост для нашего SVN`a
<VirtualHost *:80>
    # Это всё как и раньше.
    # Главное - обратите внимание на отсутствие директивы DocumentRoot
    # это связано с тем, что svn сервер будет искать корень репозитория
    # по пути от корня, указанного в этой дерективе.
    # и дабы в последствии избежать ошибок её можно убрать)
    # если же svn сервер будет не корнем хоста,
    # то корень svn`а должен располагаться на уровень ниже от DocumentRoot пути.
    ServerName svn.domain.com
    ErrorLog "/usr/local/www/apache22/svn-error.log"
    CustomLog "/usr/local/www/apache22/svn-access.log" common
    # ну а это сам блок настройки SVN`а
    <Location />
        # говорит апачу какой модуль использовать для обработки информации.
        DAV svn
        # разрешить просматривать корневой каталог.
        # в принципе - бессмысленная опция, т.к. не работает при включении
        # анонимного доступа :)
        SVNListParentPath on
        # корень SVN сервера, где будут храниться репозитории.
        SVNParentPath /usr/local/www/apache22/svn
        # тип авторизации. basic - использовать авторизацию по htpasswd
        AuthType Basic
        # сообщение в окне авторизации :)
        AuthName "My SVN Server"
        # фаил содержащий пароли для авторизации.
        AuthUserFile /usr/local/www/apache22/svn/svn-passwd
        # фаил с настройками прав доступа к репозиторию.
        AuthzSVNAccessFile /usr/local/www/apache22/svn/svn-access
        # Ниже приведён блок, с доступом на чтение для всех
        # Для чтения авторизация не нужна, для записи
        # - будет требоваться авторизация.
        # Если нужно чтобы и для чтения проходили авторизацию,
        # То заменить ВЕСЬ ниже следующий блок на:
        # Require valid-user
        <LimitExcept GET PROPFIND OPTIONS REPORT>
            Require valid-user
        </LimitExcept>
    </Location>
</VirtualHost>

Теперь создаём блок для нашей "web морды" к SVN`у
<VirtualHost *:80>
    DocumentRoot "/usr/local/www/apache22/trac/proj"
    ServerName proj.domain.com
    ErrorLog "/usr/local/www/apache22/trac/proj-error.log"
    CustomLog "/usr/local/www/apache22/trac/proj-access.log" common
    # Ничего нового :)
    #
    # А вот собственно настройка самого проекта :)
    #
    <Location />
        # подключаемый модуль, для обработки информации.
        SetHandler mod_python
        # использовать основной питоновский интерпретатор.
        PythonInterpreter main_interpreter
        # думаю из названия модуля понятно,
        # что подрубить трак как веб страницу :)
        PythonHandler trac.web.modpython_frontend
        # Путь к корню нашей мордашки :)
        PythonOption TracEnv /usr/local/www/apache22/trac/proj
        # Корневая директория
        # Т.е. по запросу какой ссылки будет выдаваться морда трака.
        # В нашем случае это proj.domain.com.
        # Если вместо / дописать что-то типа /trac
        # То трак откроется только по ссылке proj.domain.com/trac
        PythonOption TracUriRoot /
    </Location>
    #
    # Блок утпарвелия логинами для трака.
    # В приведённом здесь примере trac будет использовать тот же фаил-базу,
    # что и subversion
    #
    <Location /login>
        # тип авторизации
        AuthType Basic
        # заголовок окна авторизации
        AuthName "eA Rus Auth"
        # фаил-база, содержащий логины и пароли.
        AuthUserFile /usr/local/www/free-source.org/svn/svn-passwd
        # требовать авторизации ото всех пользователей.
        Require valid-user
    </Location>
</VirtualHost>

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

Конфигурируем mysql
Ну думаю, что конфигурацию mysql`а можно взять как-раз таки из статьи Лиса,
едиснтвенное - нам нужно создать свою базу и юзера для неё.
$ mysql -uroot -p

mysql> CREATE DATABASE trac DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> GRANT ALL PRIVILEGES ON trac.* TO trac@localhost IDENTIFIED BY 'указать_пароль';


Ну и всё собстно :)

Создаём все необходимые директории.
Ну для начала полистаем чуть выше и посмотрим, какие пути мы использовали.
Вот их все необходимо создать :)
А то ваш сервер вас такими словами обзывать будет :)

И так:
$ mkdir -p /usr/local/www/apache22/domain.com
$ mkdir -p /usr/local/www/apache22/svn
$ mkdir -p /usr/local/www/apache22/trac/proj
$ cd /usr/local/www/apache22/svn
$ mkdir myproject


Теперь выдаём права на директории:
$ chown -R www:www /usr/local/www
С правами всё)

Создаём репозиторий
$ svnadmin create /usr/local/www/apache22/svn/myproject

Теперь создаём фаил-базу с паролями для нашего репозитория.
$ htpasswd -cm /usr/local/www/apache22/svn/svn-passwd admin
Здесь:
htpasswd - утилита Apache`a, для генерации нужных нам паролей.
-cm - ключи
      ключ c - создать новый фаил, если уже есть - перезаписать.
      ключ m - использовать md5.
admin - имя пользователя, для которого будет добавлена запись.

Для добавления новых пользователей используйте команду:
$ htpasswd -m /usr/local/www/apache22/svn/svn-passwd user-name

Создаём фаил с привелегиями пользователей для репозитория.
$ edit /usr/local/www/apache22/svn/svn-access
# блок, содержащий группы.
[groups]
# группа devel и перечень пользователей в неё входящих.
devel = FenX, Admin, Tartos
# группа занимающаяся переводами.
trans = Jarek

# корень нашего SVN сервера
[/]
# доступ для анонимов на чтение.
* = r
# директория проекта myproject
[myproject:/]
# группе devel глобально разрешено чтение\запись
@devel = rw
# директория translate в репозитероии myproject
[myproject:/translate]
# группе trans разрешено чтение\запись.
@trans = rw
# директория разработчиков.
[myproject:/development]
# запрет для всех пользователей.
* = 
# разрешён доступ на чтение\запись только группе девелоперов.
@devel = rw

Ну с этим думаю всё :)

Создаём trac проект
$ trac-admin /usr/local/www/apache22/trac/proj initenv
!!! Комментариями указаны опции, которые необходимо указывать !!!
# указываем имя проекта. ex.: My SVN Project
Project Name [My Project]>
# mysql://trac:ваш_пароль@localhost/trac
Database connection string [sqlite:db/trac.db]>
# оставить как есть, т.е. просто тыкаем enter :)
Repository type [svn]>
# путь до корня репозитория. ex.: /usr/local/www/apache22/svn/myproject
Path to repository [/path/to/repos]>

Добавляем нашего админа:
$ trac-admin /usr/local/www/apache22/trac/proj permission add admin TRAC_ADMIN

После того, как репозиторий будет создан, можно отредактировать его фаил конфигов.
$ edit /usr/local/www/apache22/trac/proj/conf/trac.ini
редактировать можно по своему вкусу :)
Там в основном мелочные настройки,
основные мы уже сделали при создании проекта trac`a.

Ну вот в принципе и всё.
Проект полностью настроен.

Теперь запускаем:
$ echo 'apache22_enable="YES"' >> /etc/rc.conf
$ /usr/local/etc/rc.d/apache22 start

Если всё ок, то проверяем работает ли :)
$ ps axw | grep httpd
  580  ??  Ss     0:02,64 /usr/local/sbin/httpd -DNOHTTPACCEPT
 3489  ??  I      0:00,03 /usr/local/sbin/httpd -DNOHTTPACCEPT
.....
 3534  ??  I      0:00,02 /usr/local/sbin/httpd -DNOHTTPACCEPT

Если и у вас так же, то заходим по ссылке:
http://svn.domain.com/myproject
Сверху должно быть что-то типа
Revision 0: /

А внизу
Powered by Subversion version 1.5.1 (r32289).

если это так, то всё гут :)

теперь проверяем трак:
http://proj.domain.com

Если открылся трак и даже без мата, то значит всё вообще гут :)

Надеюсь что ничего не забыл.

Ну и конечно комментарии приветствуются :)



размещено: 2008-05-23,
последнее обновление: 2009-04-13,
автор: FenX


Wizard, 2008-05-20 в 23:51:16

Не рано ли собирать мускуль с тредами?

FenX, 2008-05-23 в 14:12:33

ммм... да, они тут в принципе не нужны :)
Просто с чем я собирал - не помню (давно было),
Поэтому взял параметры из статьи Лиса.

MicRO, 2008-05-24 в 22:54:41

Всё это дело собирается на порядок проще, если проэкт неособо большой mysql ваще мона не юзать лишние так сказать телодвижения... если есть trac зачем dav O_o

kam, 2008-05-24 в 23:04:39

хм... при сборке питона без THREADS
Trac упорно выдавал ошибку "Unsupported version control system "svn""

FenX, 2008-05-25 в 23:52:22

MicRO, ставил с mysql только потому, что он у меня стоял и до этого, нодо же его чем-то нагрузить))
Дав нужен для того, чтобы можно было с репозитория что-либо скачать svn клиентом.
В противном случае придётся поднимать демон svn-server,
А нафига это надо, если апач вполне сгодится?

kam, как ни странно, но у меня такая проблема возникла только тогда, когда я по глупости, решил собрать сначала svn, а уже потом питон.
Без тредов нормально работает.

FenX, 2008-05-29 в 18:41:08

Сорри, реально мой косяк :)
Спасибо за наводку, поправил.
Проверил свои конфиги, действительно, собирался питон с тредами...
Без них - не работает :(

WarWar, 2008-07-18 в 18:18:32

Ставилась версия 1.4.6_1
$ cd /usr/ports/devel/subversion
$ make config

[X] PYTHON            Python bindings

в 1.5.0_3 такой опции уже нет :(

FenX, 2008-07-24 в 2:20:34

Поправил статью.
Для 1.5.0_3 необходимы новые манипуляции.

rooty, 2008-08-19 в 19:37:10

Во-первых, нет строки
BROKEN=        depends on apr-db42-1.3.2 and apr-1.3.2 which conflict with each other

Во-вторых,
[root@bu]:/usr/ports/devel/py-subversion# make config
===> Options unchanged

Соответственно после make install clean нечего не появляется, и я не могу добавить модуль для апача.

[root@bu]:/usr/ports/devel/py-subversion# svnserve --version
svnserve, version 1.5.1 (r32289)
  compiled Aug 18 2008, 09:41:09

FenX, 2008-08-19 в 20:53:58

смотри внимательнее статью.
Данные действия предписывались для версии 1.5.0_3

Я бы не писал этого, если бы не собирал у себя.
Все действия были последовательно выполнены на моём сервере и только после этого задокументированы тут.

Как обстоят дела по сборке сейчас - не имею ни малейшего понятия.

FenX, 2008-08-19 в 20:55:44

Попробую на днях (как вернусь домой) посмотреть как собирается сейчас.
Тогда и отпишусь.

rooty, 2008-08-20 в 11:14:00

Ммм... соединил все с горем пополам... все работает... в принципе по статье, только немного иные шаги временами, и что-то редактировал еще Оо... ухх, голова не варит, спать спасть спать... FenX аригато )

FenX, 2008-08-20 в 11:29:32

Для текущей версии subversion в портах (1.5.1)
$ cd /usr/ports/devel/subversion
$ make config

Выбираем нужные опции
$ cd ../py-subversion
$ make install clean


статью обновлю чуть позже.

rooty, 2008-08-20 в 14:14:12

У меня не хотело компилитсо mod_python3 без THREADS в апаче...и еще там что-то было...

FenX, 2008-08-20 в 16:42:41

Я тоже заметил данный феномен при обновлении...
Старая версия компилилась и работала прикрасно.
Поэтому-то я до сих пор и не обновил статью...
Сейчас ищю все косяки, которые могут встрять с новыми версиями =\

vp, 2009-04-23 в 19:13:45

При работе с TortoiseSVN возникал вопрос с 301 redirect:
Repository moved permanently to "http://192.168.1.1/svn/test/"; please relocate
Решилось путём добавления в конфик апача в секцию <Location /path-to-svn> строчки:
BrowserMatch "TortoiseSVN" redirect-carefully

FenX, 2009-04-23 в 23:26:39

Я на форуме на эту тему уже отписывался.
разработчики SVN`а на эту тему рекомендуют
держать SVN репозиторий в отдельном пути,
от сайта.
или попросту не использовать директиву DocumentRoot.

У меня например черепаха работает и без этих извращений.

veles, 2010-12-27 в 17:57:02

При инсталяции:
$ cd ../py-subversion
$ make install clean

Была ошибка на патч помогло вот это :):

ln -s /usr/local/include/pth/pth.h /usr/local/include/python2.6/
ln -s /usr/local/include/pth/pthread.h/usr/local/include/python2.6/



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0544 секунд
Из них PHP: 40%; SQL: 60%; Число SQL-запросов: 77 шт.
Исходный размер: 52351; Сжатая: 12782