Как настроить веб‑доступ к репозиториям Subversion через Apache
Важно: инструкция ориентирована на FreeBSD и исходный пример использует Berkeley DB для хранения репозиториев. Если вы предпочитаете механизмы хранения без BDB (FSFS), смотрите раздел «Альтернативные подходы».
Требования и термины
- Система: FreeBSD (описанные пути соответствуют стандартной портовой установке).
- Права: root или эквивалент для установки пакетов и редактирования конфигурации.
- Короткие определения:
- Subversion (SVN) — система контроля версий.
- Apache — веб‑сервер, обеспечивающий доступ к репозиториям через HTTP(S).
- mod_dav_svn — модуль Apache, реализующий DAV-интерфейс для Subversion.
- Berkeley DB (BDB) — хранилище данных, может использоваться Subversion для репозиториев.
Шаги установки (пошагово)
1. Установка Apache с поддержкой Berkeley DB
Перейдите в каталог портов и соберите Apache 2.0.x с опцией BDB:
box# cd /usr/ports/www/apache20/
box# make -DWITH_BDB4 install clean
some installation steps... Добавьте запуск Apache при загрузке системы:
box# echo 'apache2_enable="YES"' >> /etc/rc.conf 2. Установка Subversion с поддержкой mod_dav_svn
box# cd /usr/ports/devel/subversion
box# make -DWITH_MOD_DAV_SVN install clean
some installation steps...Примечание: если у вас уже установлен Subversion без mod_dav_svn, см. раздел “Подключение модуля к существующей установке”.
3. Проверка установки модуля в Apache
Проверьте, что модуль mod_dav_svn и authz модуль загружены в конфигурации Apache:
box# cat /usr/local/etc/apache2/httpd.conf | grep svnОжидаемый вывод:
LoadModule dav_svn_module libexec/apache2/mod_dav_svn.so
LoadModule authz_svn_module libexec/apache2/mod_authz_svn.so 4. Создание тестового репозитория
box# mkdir /usr/home/svn
box# mkdir /usr/home/svn/repos
box# svnadmin create /usr/home/svn/repos/test5. Создание файлов аутентификации и контроля доступа
box# mkdir /usr/home/svn/access
box# cd /usr/home/svn/access
box# htpasswd -cm users root
password:**
box# htpasswd -m users viewer
password:***Файл контроля доступа (пример):
box# vi controlСодержимое файла control:
[test:/]
root = rw
viewer = r
6. Конфигурация Apache для чтения репозиториев
Создайте файл конфигурации в Includes:
box# cd /usr/local/etc/apache2/Includes/
box# cat svn.confСодержимое svn.conf:
DAV svn
SVNParentPath /usr/home/svn/repos
SVNIndexXSLT "http://svn.example.com/svnindex.xsl"
AuthzSVNAccessFile /usr/home/svn/access/control
# anonymous first
Satisfy Any
Require valid-user
# authenticating them valid ones
AuthType Basic
AuthName "Subversion Repositories at example.com"
AuthUserFile /usr/home/svn/access/users
Apache автоматически читает все файлы из Includes при старте, поэтому svn.conf будет подхвачен. Файлы XSLT для индексирования находятся по шаблону в /usr/local/share/subversion/xslt/ — скопируйте them.xsl и another.css в ваш DocumentRoot при необходимости оформления.
7. Виртуальный хост и документ‑рут
Пример виртуального хоста:
NameVirtualHost *:80
ServerAdmin [email protected]
ServerName svn.example.com
DocumentRoot /usr/local/www/pages/svn.example.com
CustomLog /var/log/svn.example.com-access_log common
8. Перезапуск Apache и тест
/usr/local/etc/rc.d/apache2.sh restartОткройте в браузере http://svn.example.com/svn/repos/test — система должна запросить логин/пароль и показать репозиторий в ревизии 0.
Настройка уведомления о коммите (post-commit hook)
Создайте исполняемый файл в hooks:
box# cd /usr/home/svn/repos/test/hooks/
box# cat post-commit[code]
#!/usr/local/bin/php
$message = "SubVersion Commit
Project: Test
http://svn.example.com/svn/repos/test full repository
==============Comments==============
";
$repos = $argv[1];
$version = $argv[2];
$message .= `svnlook log -r $version /usr/home/svn/repos/test`;
$message .= "
===========List of Changes========
";
$message .= `svnlog diff -r $version /usr/home/svn/repos/test`;
mail("[email protected]","SubVersion Commit $repos $version",$mensaje,"From: [email protected]");
?>
[/code]Убедитесь, что скрипт исполняемый (chmod +x post-commit) и корректно установлен путь к PHP/инструментам svnlook/svnlog.
Подключение модуля к существующей установке Subversion
Если Subversion уже установлен, но без mod_dav_svn, можно переустановить пакет портов с нужными опциями:
box# cd /usr/ports/devel/subversion
box# make deinstall
box# make -DWITH_MOD_DAV_SVN -DWITHOUT_BDB4 install cleanЭтот пример показывает, как переустановить с отключённым BDB, если вы предпочитаете FSFS или иные механизмы хранения.
Альтернативные подходы
- Использовать svnserve для доступа по протоколу svn:// — легче настраивать, но без HTTP(S)‑функционала веб‑просмотра.
- Хранение репозиториев в FSFS вместо Berkeley DB — более устойчивый вариант при аварийных перезагрузках и проще в резервировании.
- Интеграция аутентификации через LDAP/Active Directory с помощью mod_authnz_ldap — удобна для корпоративных сред.
- Использовать обратный прокси (например, nginx) перед Apache для SSL‑терминации и rate‑limiting.
Мини‑методология (быстрая проверка)
- Установить Apache с нужными опциями.
- Установить Subversion с mod_dav_svn.
- Создать репозиторий и файлы authz/htpasswd.
- Добавить конфигурацию в Includes и перезапустить Apache.
- Протестировать доступ и права.
- Добавить хук post-commit, настроить мониторинг.
Списки задач по ролям
Администратор сервера:
- Установить пакеты и зависимости.
- Настроить запуск Apache при старте.
- Настроить права доступа к файловой системе для репозиториев.
Разработчик/пользователь:
- Проверить доступ через браузер и через SVN‑клиент (например, TortoiseSVN).
- Проверить возможности чтения/записи согласно учётной записи.
Аудитор/безопасник:
- Проверить конфигурацию AuthType/AuthzSVNAccessFile.
- Проверить передачу логинов через HTTPS.
Критерии приёмки
- При обращении к http://svn.example.com/svn/repos/test браузер запрашивает учётные данные.
- Пользователь с правами rw может зафиксировать изменения, пользователь с r — только читать.
- Скрипт post-commit корректно запускается и отправляет уведомления.
Тесты и проверочные сценарии
- Попытка перехода к URL без логина → запрос аутентификации.
- Логин viewer (read only) → доступ к просмотру, попытка commit → отклонено.
- Логин root (rw) → успешный commit и наличие изменений в репозитории.
- Повторный запуск apache2.sh restart без ошибок в логах (/var/log/error_log).
Рекомендации по безопасности
- Используйте HTTPS (TLS) для защиты учётных данных при передаче.
- Держите файлы репозиториев в отдельном каталоге с ограничениями доступа (только нужные uid/gid).
- Не храните учётные данные в открытом виде — используйте htpasswd или интеграцию с LDAP.
- Ограничьте список пользователей в AuthzSVNAccessFile и регулярно ревизируйте права.
- Резервное копирование: делайте регулярные дампы репозиториев и копии конфигураций.
Краткий глоссарий (в одну строку)
- SVNParentPath — директива Apache, указывающая родительский каталог для нескольких репозиториев.
Когда этот метод не подходит
- Если нужен только быстрый приватный доступ без HTTP, проще использовать svnserve.
- Для больших корпоративных инсталляций может быть удобнее использовать готовые платформы (GitLab, Bitbucket) с расширенными UI и интеграциями.
Итог и дальнейшие шаги
- После успешной базовой настройки: включите HTTPS, интегрируйте аутентификацию с корпоративным каталогом при необходимости и настройте мониторинг хостинга и бэкапов.
Коротко: вы установили Apache с поддержкой BDB, добавили Subversion с mod_dav_svn, создали репозиторий и настроили доступ через Apache. При необходимости переключайтесь на FSFS, добавляйте SSL и внешнюю аутентификацию.
С уважением, ждём ваши улучшения и вопросы.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента