Установка и настройка SVN-сервера под Windows

Введение

В данном HOWTO я подробно опишу как установить и настроить SVN (subversion) сервер под ОС Windows.

Статья о настройке прав доступа SVN-сервера доступна здесь.

Внимание! CollabNet прекратили поддержку описанного в данной статье Subversion Server and Client и предлагают вместо него другой проект — Subversion Edge, который в несколько раз хуже и часто работает нестабильно. Если Вам нужен только svnserve (без Apache), перейдите на использование простого  и быстрого SlikSVN (во время установки установите все компоненты и особенно svnserve). Установка и настройка данного проекта описана в другой статье нашего сайта.

Шаг 1. Установка сервера.

Итак, для начала нам будет нужен сам дистрибутив с svn-сервером, который можно бесплатно скачать с официального сайта CollabNet (перед тем как что-то скачать, Вы должны пройти бесплатную регистрацию на этом сайте (зачем так сделано не очень понятно)). Вы должны скачать CollabNet Subversion Server and Client v1.6.9 (for Windows) (версия 1.6.9 — последняя на момент написания данного HOWTO).

После скачивания файла CollabNetSubversion-server-1.6.9-1.win32.exe (18,44 МБ), запускайте его и следуйте указаниям мастера. Мастер выполнит несколько шагов. Рассмотрим все шаги мастера по порядку:

  1. Приветствие мастера. Сразу жмите «Next«.
  2. Предложение прочитать онлайновый ReadMe. Жмите «Next«.
  3. Выберите компоненты, которые нужно установить: svnserve (собственно svn-сервер (устанавливать обязательно)) и Apache (устанавливайте только если хотите разрешить доступ к своим репозиториям из Интернета через обычные браузеры). Выбрав нужные компоненты, переходите к следующему шагу.
  4. На этом шаге предлагается выбрать порт для svn-сервера (настоятельно рекомендуется использовать стандартный 3690) и указать путь, где будут храниться репозитории (рекомендуется стандартное значение c:\svn_repository). Флажок в строке «Install svnserve to run as Windows service» позволит автоматически запускаться svn-серверу при запуске Windows (рекомендуется не снимать отсюда флажок). Внимание! Этого шага не будет, если на шаге 3 Вы не выбрали компонент svnserve.
  5. Теперь предлагается настроить Apache если Вы его выбрали на третьем шаге мастера установки.
    • Host/Server name — имя сервера. Рекомендуется оставить localhost.
    • Host Port — порт, на котором будет находиться Apache. Рекомендуется либо стандартный 80, либо 8080.
    • Install Apache to run as Windows service — позволяет Apache запускаться вместе с Windows.
    • Repository Path — путь к svn-репозиторию. Укажите то же значение, что Вы указывали на шаге 4. Рекомендуется стандартное значение C:\svn_repository.
    • Repository Location Prefix — префикс, по которому будет доступен svn-репозиторий. Пример: http://localhost:80/svn/. Если Вы будете использовать установленный Apache только для репозиториев svn, установите в этом поле лишь слэш «/«, в противном случае оставьте стандартное значение /svn.
  6. Выберите каталог для установки набора серверов и нажмите «Install«.
  7. На этом шаге предлагается включить уведомления о новых версиях программы. Рекомендуется снять все флажки.
  8. Нажмите «Finish«. Установка завершена.

Шаг 2. Установка клиента.

В качестве SVN-клиента мы будем использовать TortoiseSVN, подробнее о котором можно почитать в HOWTO.

Скачать программу можно на её официальном сайте программы на странице Downloads: http://tortoisesvn.net/downloads. Там же можно скачать пакет локализации, содержащий помимо перевода интерфейса программы, ещё и словарь проверки орфографии (применяется при коммите изменений).

Установка программы стандартна и не должна вызвать никаких сложностей.

Шаг 3. Настройка svnserve.

Настройку начнём с того, что создадим новый репозиторий со стандартными настройками, которые и будем редактировать. Для этого зайдём в Проводнике Windows в каталог, указанный в качестве «Repository path» во время установки сервера (стандартное значение — С:\svn_repository\), нажмём правой кнопкой по пустому месту в нём и выберем «TortoiseSVN» — «Create repository here«. Через несколько мгновений внутри каталога появятся файлы и подкаталоги, а также будет выведено сообщение об успешном создании репозитория. В дальнейшем путь к репозиторию я буду заменять на ПУТЬ_К_РЕПОЗИТАРИЮ.

Теперь мы должны создать пользователей, которые будут работать с репозиторием. Для этого мы должны открыть файл «ПУТЬ_К_РЕПОЗИТАРИЮ\conf\svnserve.conf» в любом текстовом редакторе, например Блокноте Windows или Notepad++. Здесь Вы должны раскомментировать (убрать перед строкой символ(ы) «#«) следующие строки:

anon-access = none
auth-access = write

Строка «anon-access = none» означает, что анонимы не смогут получить доступ к репозиторию вообще (сделано из соображений безопасности), а «auth-access = write» означает, что авторизованные пользователи получат полный доступ в пределах их ограничений, заданных в файле authz (если такая функция включена). Если Вы хотите, чтобы анонимы могли получить доступ только для чтения (например, разрабатываете OpenSource-проект), то установите «anon-access = read«.

Теперь Вы должны раскомментировать строку:

password-db = passwd

Эта строка указывает в каком файле будут находиться логины и пароли пользователей для авторизации на svn-сервере. Теперь откройте файл «ПУТЬ_К_РЕПОЗИТАРИЮ\conf\passwd» в любом текстовом редакторе и впишите в нём «логин_пользователя = пароль_пользователя» (разделителем служит знак равенства). Пример правильного файла passwd:

### This file is an example password file for svnserve.
### Its format is similar to that of svnserve.conf. As shown in the
### example below it contains one section labelled [users].
### The name and password for each user follow, one account per line.

[users]
# harry = harryssecret
# sally = sallyssecret
vova = kjkj345K
anton = Gh74oJId
dima = ir9895498
katya = o894584578
sergey = 985kdfjdfk

Убираем символ комментария из строки:

realm = My First Repository

В ней указывается имя Вашего репозитория. После знака равенства вместо My First Repository Вы можете указать любое другое имя. Оно выводится при запросе логина и пароля.

Настройка сервера с простой (simple) авторизацией завершена. Пример правильного файла конфигурации сервера:

### This file controls the configuration of the svnserve daemon, if you
### use it to allow access to this repository.  (If you only allow
### access through http: and/or file: URLs, then this file is
### irrelevant.)

### Visit http://subversion.tigris.org/ for more information.

[general]
### These options control access to the repository for unauthenticated
### and authenticated users.  Valid values are "write", "read",
### and "none".  The sample settings below are the defaults.
anon-access = none
auth-access = write
### The password-db option controls the location of the password
### database file.  Unless you specify a path starting with a /,
### the file's location is relative to the directory containing
### this configuration file.
### If SASL is enabled (see below), this file will NOT be used.
### Uncomment the line below to use the default password file.
password-db = passwd
### The authz-db option controls the location of the authorization
### rules for path-based access control.  Unless you specify a path
### starting with a /, the file's location is relative to the the
### directory containing this file.  If you don't specify an
### authz-db, no path-based access control is done.
### Uncomment the line below to use the default authorization file.
#authz-db = authz
### This option specifies the authentication realm of the repository.
### If two repositories have the same authentication realm, they should
### have the same password database, and vice versa.  The default realm
### is repository's uuid.
realm = Test Repository

[sasl]
### This option specifies whether you want to use the Cyrus SASL
### library for authentication. Default is false.
### This section will be ignored if svnserve is not built with Cyrus
### SASL support; to check, run 'svnserve --version' and look for a line
### reading 'Cyrus SASL authentication is available.'
# use-sasl = true
### These options specify the desired strength of the security layer
### that you want SASL to provide. 0 means no encryption, 1 means
### integrity-checking only, values larger than 1 are correlated
### to the effective key length for encryption (e.g. 128 means 128-bit
### encryption). The values below are the defaults.
# min-encryption = 0
# max-encryption = 256

Теперь пора проверить созданный нами svn-сервер, но сначала мы должны перезапустить его чтобы он смог считать изменённые конфигурационные файлы. Для этого набираем «Windows+R» — «cmd.exe«. В открывшейся командной строке пишем слелующие команды (по порядку):

net stop CSVNsvnserve
net start CSVNsvnserve

Открываем TortoiseSVN Repository Browser из контекстного меню любой папки и в качестве URL вводим: svn://127.0.0.1/. Сервер запросит указать логин и пароль, заданные в файле passwd и при успешной авторизации отобразит корневой каталог. Сервер успешно настроен и готов к управлению проектами.

Шаг 4. Настройка Apache.

Если Вы хотите, чтобы к Вашему репозиторию был доступ не только с помощью svn-клиентов, но и с помощью любого веб-браузера, то должны сделать ряд настроек.

Откройте в любом текстовом редакторе файл «%PROGRAMFILES%\CollabNet\Subversion Server\httpd\conf\httpd.conf«, где «%PROGRAMFILES%\CollabNet\Subversion Server\» — это путь установки svn-серверов. В конце файла httpd.conf найдите следующие строки:

DAV svn
SVNParentPath C:\svn_repository

и замените на такие:

DAV svn
SVNPath C:\svn_repository

AuthType Basic
AuthName "Subversion repository"
AuthUserFile C:\svn_repository\conf\appswd
Require valid-user

Здесь с:\svn_repository — путь к репозиторию svn. Измените в соответствии с Вашими настройками.

Теперь нужно создать файл паролей Apache. Для этого откройте командную строку Windows («Win+R» — «cmd.exe«) и выполните следующие команды:

cd "%PROGRAMFILES%\CollabNet\Subversion Server\httpd\bin"
htpasswd -cmb C:\svn_repository\conf\appswd ЛОГИН_ПОЛЬЗОВАТЕЛЯ_1 ПАРОЛЬ
htpasswd -mb C:\svn_repository\conf\appswd ЛОГИН_ПОЛЬЗОВАТЕЛЯ_2 ПАРОЛЬ
...
htpasswd -mb C:\svn_repository\conf\appswd ЛОГИН_ПОЛЬЗОВАТЕЛЯ_N ПАРОЛЬ

Внимание! Параметр -cm нужно указывать только при первом создании пользователя, т.к. он перезаписывает имеющийся файл. В пути к файлу паролей буква диска обязательно должна быть в верхнем регистре.

В качестве ЛОГИН_ПОЛЬЗОВАТЕЛЯ нужно указать все логины пользователей, указанные в файле passwd. Пароли также должны быть идентичны.

Настройка SVN over Apache 2 была успешно завершена. Теперь нужно перезапустить сервер командами консоли Windows:

net stop CollabNetSubversionApache
net start CollabNetSubversionApache

Протестировать сервер можно так: http://127.0.0.1:ПОРТ/ в любом веб-браузере. Будет запрошен логин и пароль для доступа к репозиторию.

59 commentaries to post

  1. @Алекс88
    Штатно такой функции нет, но можно в файрволе создать разрешающие правила для входящих соединений на порт 3690 только для определённых IP-адресов, а все остальные подключения блокировать. На Linux используйте iptables.

  2. Спасибо. Возник ещё один вопрос теперь уже с модулем для apache, в место Require valid-user установил Require user admin, но почему-то все остальные пользователи проекта тоже могут подключиться к нему не смотря на то что авторизация разрешена только для admin. Подскажите как разрешить авторизацию только для одного пользователя проектом а остальным запретить? А вообще хотелось бы сделать так, чтобы с одного ip заходили все пользователи, а с разных ip заходил только admin? Вот как я попытался это сделать но не получилось:

    DAV svn
    SVNParentPath /var/www/svn/
    AuthType Basic
    AuthzSVNAccessFile /etc/httpd/svn-acl.conf
    AuthName «Authorization»
    AuthUserFile /etc/httpd/svn-users.conf
    Require user admin
    Satisfy any
    Order Allow,Deny
    Allow from xxx.xxx.xxx.xxx

  3. Алекс88 :

    Спасибо. Возник ещё один вопрос теперь уже с модулем для apache, в место Require valid-user установил Require user admin

    Поздравляю, вы изобрели новую директиву! В статье же написано как прописывать пользователей и задавать им пароли. Использовать нужно только require valid-user, что означает, что войти может только успешно авторизовавшийся пользователь.

    Сами пользователи прописываются в файле, указанном в директиве AuthUserFile. Пример есть в статье:

    cd "%PROGRAMFILES%\CollabNet\Subversion Server\httpd\bin"
    htpasswd -cmb C:\svn_repository\conf\appswd ЛОГИН_ПОЛЬЗОВАТЕЛЯ_1 ПАРОЛЬ
    htpasswd -mb C:\svn_repository\conf\appswd ЛОГИН_ПОЛЬЗОВАТЕЛЯ_2 ПАРОЛЬ
    ...
    htpasswd -mb C:\svn_repository\conf\appswd ЛОГИН_ПОЛЬЗОВАТЕЛЯ_N ПАРОЛЬ
  4. @Vitaly
    require valid-user вообще можно не указывать, всё-ровно будет работать. У меня вопрос в другом. Есть сотрудники, которым положено пользоваться svn только из офисного Ip, а с других ip доступ должен быть закрыт, также есть сотрудники для которых доступ к svn должен быть как из офисного ip, так и с любого другого ip. Такое возможно реализовать, если да то подскажите как?

  5. Алекс88 :

    @Vitaly
    require valid-user вообще можно не указывать, всё-ровно будет работать.

    Будет пускать любого без авторизации.

    Алекс88 :

    @Vitaly
    Есть сотрудники, которым положено пользоваться svn только из офисного Ip, а с других ip доступ должен быть закрыт, также есть сотрудники для которых доступ к svn должен быть как из офисного ip, так и с любого другого ip. Такое возможно реализовать, если да то подскажите как?

    Скорее всего, нет по крайней мере штатными средствами без написания собственных модулей для Apache. Можно лишь создать список IP-адресов, которым будет разрешён доступ, а всем остальным закрыть.

    Пример:

    AuthUserFile /path/to/.htpasswd
    AuthName "Auth Area"
    AuthType Basic
    Require valid-user
    Satisfy any
    Deny from all
    Allow from 192.168.1.
    Allow from 127.0.0.1

    Это разрешит доступ из подсети 192.168.1.0/24, а также для локального хоста.

  6. @Vitaly
    Спасибо за помощь, в общем решил свою проблему так:
    Для офисных сотрудников настроил доступ к репозиторию по протоколу svn://, в брандмауэре iptables настроил разрешающее правило на порт 3690 для офисного ip, по остальным ip доступ запрещён.
    Для привилегированных сотрудников доступ к репозиторию настроен через apache http://.
    Таким образом удалось добиться нужного результата. Надеюсь кому-нибудь это тоже будет полезно)

  7. @Алекс88
    Главное следите, чтобы оба сервиса (svnserve и apache) были запущены от одного пользователя в системе, либо принадлежали одной группе (например svnusers), иначе возникнут серьёзные проблемы и конфликты доступа.

  8. Настроил всё, как написано, однако после запуска apache не могу получить доступ к репозиторию через браузер в соответствии с этой инструкцией:

    Протестировать сервер можно так: http://127.0.0.1:ПОРТ/ в любом веб-браузере. Будет запрошен логин и пароль для доступа к репозиторию.

    При подключении к порту 127.0.0.1:8080 требует логин и пароль, после ввода и того и другого снова требует пароль. И так до бесконечности.

    1. То, что сейчас выложено на сайте CollabNet, не имеет никакого отношения к описанному в статье, т.к. они давно прекратили поддержку того продукта.

Обсуждение закрыто.