Собственно, данный пост я решил написать после ночных бдений с SVN. Да, у меня были проблемы, которые пришлось решить, возможно, нестандартными методами, но зато теперь всё работает так, как я хотел.
Управление репозиторием
Итак, для всего этого нам нужнен сам Apache (я использовал Apache 2) и дополнительные модули: dav и dav_svn.
Помимо этого, я ещё поставил просматривалку репозитория ViewVC, с которой потом долго и провозился.
Для того, чтобы заставить работать subversion через http, достаточно сделать следующее (делал в OpenSUSE 10.3):
Сначала включаем модули при помощи a2enmod:
a2enmod dav a2enmod dav_svn
Теперь можно перезагрузить конфигу апача (либо через restart, либо через reload):
/etc/init.d/apache2 restart
или
/etc/init.d/apache2 reload
После этого необходимо сконфигурировать виртуальный хост. Лично я хотел, чтобы у меня SVN-репозиторий был как отдельный поддомен в домене xskernel.org — то есть, svn.xskernel.org.
Для этого заводим отдельный виртуальный хост в апаче:
<VirtualHost *:80>
ServerName svn.xskernel.org
ErrorLog /var/log/apache2/svn-error.log
TransferLog /var/log/apache2/svn-access.log
<Location /svn >
DAV svn
SVNPath /home/svn/repositories/svn.xskernel.org
SVNListParentPath on
AuthType Basic
AuthName "XSystem Kernel Team repository"
AuthBasicProvider file
AuthUserFile /home/svn/auth/svn.xskernel.org.htpasswd
SetOutputFilter DEFLATE
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
</Location>
</VirtualHost>
Как видно, здесь в конфиге заводится локейшн /svn, который используется для работы DAV. Именно DAV позволяет полноценно работать с репозиторием через http.
Рассмотрим некоторые параметры:
SVNPath задаёт каталог, в котором располагается репозиторий, который будет ассоциирован с данным виртуальным хостом. Естественно, сам SVNRoot я спрятал (не стал использовать SVNRootPath).
AuthUserFile — файл, в котором будут в дальнейшем храниться пользователи и хэши их паролей, которым будет разрешён доступ в SVN.
LimitExcept накладывает ограничения на все команды кроме GET, PROPFIND, OPTIONS и REPORT, требуя авторизации (Require valid-user).
Отлично, теперь нужно завести соответствующий репозиторий. Я решил хранить все репозитории в отдельном каталоге /home/svn/repositories, поэтому создал репозиторий таким образом:
mkdir -p /home/svn/repositories svnadmin create /home/svn/repositories/svn.xskernel.org
Отлично, теперь репозиторий есть, надо сделать авторизацию. Для этого создаю файл паролей и завожу в нём пользователя:
mkdir -p /home/svn/auth touch /home/svn/auth/svn.xskernel.org.htpasswd htpasswd2 /home/svn/auth/svn.xskernel.org.htpasswd username
Теперь апачу нужно дать права на пользование репозиторием и файлами паролей, для чего присваиваю всем файлам пользователя, под которым работает апач:
chown -Rv webserver:web /home/svn
Сохраняем конфигурационный файл виртуальных хостов апача, перезагружаем конфигурацию по reload, и пробуем зайти по адресу http://svn.xskernel.org/svn/. WebDAV работает!
Просматривание репозитория
Вот с просматривалкой у меня и возникло много проблем. Хотелось, чтобы при заходе на http://svn.xskernel.org/ автоматически запускалась просматривалка, при этом она отображала бы только тот репозиторий, который ассоциирован с данным виртуальным хостом. Я перепробовал много различных вариантов и, в конце-концов, остановился на том, что изложу ниже.
WebDAV я поставил штатными средствами OpenSUSE — из репозитория, после чего забрал его из /srv/www и переместил в каталог /home/svn.
Для своего виртуального хоста завёл отдельную конфигу /home/svn/viewvc-svn.xskernel.org.conf, в которой прописал следующие параметры:
# Доступные репозитории для просмотра
svn_roots:
svn.xskernel.org : /home/svn/repositories/svn.xskernel.org
# Репозиторий, который следует просматривать по умолчанию
default_root = svn.xskernel.org
# Адрес обратной связи
address = team@xskernel.org
# Не использовать корень как компонент URL (то есть, не отображаются остальные репозитории в корне)
root_as_url_component = 0
# Путь к файлам с шаблонами отображения веб-страницы
template_dir = /home/svn/viewvc/svn.xskernel.org/templates
# компонент URL, по которому будут располагаться ресурсы для просматривалки (картинки и пр.)
docroot = /viewvc-docroot
Теперь заводим скрипт, который цепляет эту конфигу, копируя стандартный:
cp /home/svn/bin/cgi/viewvc.cgi /home/svn/bin/cgi/viewvc-svn.xskernel.org.cgi
И редактируем строки, прописывая:
LIBRARY_DIR = r"/home/svn/lib" CONF_PATHNAME = r"/home/svn/viewvc-svn.xskernel.org.conf"
Теперь скрипт /home/svn/bin/cgi/viewvc-svn.xskernel.org.cgi хватает конфигу /home/svn/viewvc-svn.xskernel.org.conf.
После всего этого заводим свои темплейты для ViewVC:
mkdir -p /home/svn/viewvc/svn.xskernel.org cp -R /home/svn/templates /home/svn/viewvc/svn.xskernel.org cp -R /home/svn/templates/docroot /home/svn/viewvc/svn.xskernel.org/viewvc-docroot
Прикручивание ViewVC к апачу
Теперь надо в каталоге /home/svn/viewvc/svn.xskernel.org завести файл index.html, который редиректит на подкаталог "/viewvc":
<pre> <html><head><META HTTP-EQUIV="Refresh" CONTENT="0; URL=/viewvc"><head> <body></body> </html> </pre>
Сделано это так потому, что если сам Апач осуществит редирект, SVN-клиент начнёт ругаться, что не может выполнить PROPFIND при импорте репозитория (проверено уже часовыми бдениями над mod_rewrie).
Прописываем ViewVC в конфиге виртуального хоста:
<VirtualHost *:80>
#...
ScriptAlias /viewvc "/home/svn/bin/cgi/viewvc-svn.xskernel.org.cgi"
Alias / /home/svn/viewvc/svn.xskernel.org/
<Directory /home/svn/viewvc/svn.xskernel.org/ >
Order allow,deny
Allow from all
DirectoryIndex index.html
</Directory>
</VirtualHost>
Параметр ScriptAlias указывает, какой скрипт следует запускать, когда URL содержит "/viewvc".
Перезагружаем конфигу апача, пробуем: http://svn.xskernel.org/.
Грузится страничка index.html, которая автоматом нас редиректит на http://svn.xskernel.org/viewvc/ и запускается скрипт /home/svn/bin/cgi/viewvc-svn.xskernel.org.cgi .
Заключение
Как видно, не всё так красиво в моей настройке, как хотелось бы. Если есть соображения/советы, как сделать лучше, то я их внимательно выслушаю.
Тем не менее, репозиторий ОС XSystem переехал с SourceForge.net ко мне на домашний сервер. Работает на порядок быстрее, чем тормозной сервис от SourceForge.net. Однако, от SF.net я не стал отказываться, а сделал его зеркалом моего репозитория. Как — в следующем посте.