Pull to refresh

Свой SVN на виртуальном (shared) хостинге

Reading time4 min
Views7.1K
svn
Решили мы как то с приятелем, запустить стартап не стартап, а так, сайт для души. Решили — значит будет запущен. Бюджет… А давай не купим ещё по 2 кружки пива, на это и запустим. В общем денег на домен да на виртуальный хостинг на валуехосте. Так люди мы «взрослые», и делать всё привыкли основательно, нам нужна система управления версиями и выкладыванием. Было решено поднять subversion репозиторий с возможностью раздачи доступа к нему нескольким разработчикам с разными логинами на valuehost. Но у нас виртуальный хостинг со всеми его ограничениями, что делать?



Необходимые условия:


Их всего два (в общем случае): наличие ssh-доступа к серверу хостера, и возможность ходить на этот SSH по ключу.
Кстати, хостер не обязательно должен быть valuehost.ru, смотрите в статье пример с valuehost и транслируйте на свою ситуацию, смысл везде одинаков.

Определяем установлен ли subversion:



[megauser@megaserver ~]$ svn
-bash: svn: command not found
[megauser@megaserver ~]$ svnserve
-bash: svnserve: command not found


Не установлен, значит установим его под своим аккаунтом.
Если в Вашем случае Subversion уже установлен, то пропускайте все действия
до пункта 4 «Настраиваем репозиторий и доступ к нему».

Устанавливаем Subversion


Первым делом смотрим, есть ли возможность собирать программы из исходников:

[megauser@megaserver ~]$ make
-bash: make: command not found
[megauser@megaserver ~]$ gcc
-bash: gcc: command not found


Возможности нет, значит придется собирать программы на другой машине
с такой же ОС, как и у хостера:

[megauser@megaserver ~]$ uname -srm
FreeBSD 6.3-RELEASE i386


Находим машину с такой же операционкой, куда у нас есть доступ, или, например,
ставим на домашний компьютер нужную операционку. Необходимо, чтобы на этой
машине у вас был доступ на запись в каталог, в который вы планируете установить
subversion на сервере хостера. В нашем случае это был каталог /pub/home/megauser/myroot
Собирали subversion мы без всяких хитростей, всё как в мануале для случая необходимости
только простого сервера svnserve, без интеграции svn в apache:

wget subversion.tigris.org/downloads/subversion-1.5.1.tar.gz
wget subversion.tigris.org/downloads/subversion-deps-1.5.1.tar.gz
tar xvzf subversion-1.5.1.tar.gz
tar xvzf subversion-deps-1.5.1.tar.gz
cd subversion-1.5.1
./configure --prefix=/pub/home/megauser/myroot --enable-all-static --disable-mod-activation --without-apache --without-apxs --without-serf --without-berkeley-db --with-ssl
make
make install


(Примечание: на данный момент последняя версия subversion — 1.5.4, но на момент наших
действий была только 1.5.1, поэтому пример основан на ней, думаем что можно брать 1.5.4
без каких либо изменений, но на всякий случай почитайте CHANGELOG)

Всё, SVN собран и установлен по нужному для нас пути, забираем его на сервер хостера:

tar cvzf ~/builded-svn.tgz /pub/home/megauser/myroot/

Потом переходим в SSH-консоль хостера:

[megauser@megaserver ~]$ wget your.server/builded-svn.tgz
(или забираете файл любым другим возможным способом, хоть тем же scp)
[megauser@megaserver ~]$ tar xvzf builded-svn.tgz


Всё, SVN установлен, осталось только добавить /pub/home/megauser/myroot/bin в
переменную окружения PATH, чтобы можно было запускать команду svn без указания полного
пути к ней. Пропишите в ~/.bashrc или ~/.profile или аналогичный по смыслу файл строку

export PATH=~/myroot/bin:${PATH}

Перелогиньтесь, и проверьте работоспособность свежеустановленного SVN:

[megauser@megaserver ~]$ svn
Type 'svn help' for usage.
[megauser@megaserver ~]$ svnserve
You must specify exactly one of -d, -i, -t or -X.
Type 'svnserve --help' for usage.


Если ответы будут другие — действуйте по ситуации, пока всё не наладится. На этом установка завершена.

Настраиваем репозиторий и доступ к нему



Первым делом создаём репозиторий:

svnadmin create /pub/home/megauser/myrepo

Описывать как залить в репозиторий начальную структуру проектов, как настроить нужные хуки и тому подобное я не буду,
для этого есть svnbook.red-bean.com/nightly/ru/index.html

Затем настраиваем ключевой доступ по протоколу svn+ssh к нашему репозиторию:
(на сервере valuehost был SSH в варианте «ssh.com», а не «openssh», как бывает на linux-системах, соответственно наши примеры под вариант «ssh.com»,
но используя соответствующие мануалы вы легко сможете сделать тоже самое для linux).

На рабочих компьютерах будущих пользователей репозитория создаёте пары ключей, публичный сохраняете в формате «ssh.com», и заливаете его на сервер
хостера в ~/.ssh2/id_rsa_<virtual_user_name>.pub, права файлу даёте 0600, чтобы ssh не пугался, и не отвергал пользователя с этим ключем по причине
большой доступности файла с ключем.

Затем создаёте файл ~/.ssh2/authorization с такими же правами доступа — 0600. В файле пишете следующее:

Key id_rsa_user1.pub
Options command="/pub/home/megauser/myroot/bin/svnserve -t -r /pub/home/megauser/myrepo --tunnel-user=user1", no-port-forwarding, no-x11-forwarding, no-agent-forwarding, no-pty

Key id_rsa_user2.pub
Options command="/pub/home/megauser/myroot/bin/svnserve -t -r /pub/home/megauser/myrepo --tunnel-user=user2", no-port-forwarding, no-x11-forwarding, no-agent-forwarding, no-pty

То есть на каждого svn-пользователя — две строки. В данном конкретном примере мы создали двух SVN-пользователей, user1 и user2.
Заметьте — именно user1 и user2, а не ваш оригинальный логин на сервер хостера будут использоваться как авторы коммитов в репозиторий,
что нам собственно и требовалось.

Всё, репозиторий и доступ к нему настроен, для проверки сделайте на рабочем компьютере в PuTTY (или другом ssh-клиенте) сессию с такими же параметрами как и обычная Ваша сессия доступа на сервер хостера,
но с приватным ключем, который Вы сгенерировали недавно для svn, и публичную часть от которого разместили в ~/.ssh2/id_rsa_.pub.
Запускайте эту сессию, если всё ок, то вы должны увидеть примерно такую строку

( success ( 2 2 ( ) ( edit-pipeline svndiff1 absent-entries commit-revprops depth log-revprops partial-replay ) ) )

Это означает что всё хорошо, вы можете брать Tortoise или любой другой SVN-клиент, и подключаться к svn+ssh://server.of.your.hoster.ru/
с использованием нужных приватных ключей.

Чтобы вам меньше мучаться — вот архив с нашим каталогом /pub/home/megauser/myroot/
Помимо SVN в нём еще есть VIM, MC, rsync и простенький скрипт release, которым мы выкладываем закоммиченные изменения в боевую локацию сервера.
Вот такой подарок, пользуйтесь на здоровье :)

p.s.: вопросы «зачем вам это, есть же....» задавать не стоит. Хотелось сделать так
Tags:
Hubs:
Total votes 80: ↑75 and ↓5+70
Comments67

Articles