Задача: создать и настроить mercurial-репозиторий на debian-сервере с установленным apache2.
Всё довольно просто, но есть несколько тонких моментов. Все шаги справедливы для debian lenny и, возможно, для ubuntu (не знаю какой версии). Предполагается, что наш репозиторий будет доступен по адресу http://hg.example.com/public.
Некоторые соглашения¶
-
Все команды, которые нужно выполнить, предваряются либо символом «
#» (команда должна быть выполнена с правами суперпользователя); либо символом «$» (команда должна быть выполнена с правами обычного пользователя). -
Все шаги приводятся в рекомендованном порядке исполнения. Какой-либо шаг можно опустить только при условии, что вы действительно понимаете, что делаете.
-
В качестве редактора всюду используется
vi, однако, конечно, можно использовать любой другой по вашему вкусу.
Шаги установки¶
-
Устанавливаем
mercurial:# aptitude install mercurial -
Создаём отдельного пользователя в системе, именно этому пользователю будут принадлежать репозитории. Домашний каталог пользователя будет
/home/hg.# useradd hg # mkdir /home/hg # chown hg:hg /home/hg -
Логинимся (через
sudo su - hg) под этим пользователем. Создаём каталог для репозитория (в нашем примере:/home/hg/repo)$ mkdir /home/hg/repoи каталог для DocumentRoot виртуального хоста:
$ mkdir /home/hg/web -
Создаём непосредственно репозиторий:
$ cd repo $ hg initРепозиторий создан, теперь необходимо настроить apache так, чтобы организовать доступ к нему через http.
-
Устанавливаем apache2 и модуль suexec:
# aptitude install apache2 apache2-suexec # a2enmod suexec -
Настраиваем виртуальный хост для домена
hg.example.com. Для этого нужно создать файл с описанием параметров виртуального хоста в каталоге/etc/apache2/sites-available:# vi /etc/apache2/sites-available/hg.regolit.comСоздаём файл примерно с таким содержимым:
NameVirtualHost *:80 <VirtualHost *:80> ServerName hg.example.com DocumentRoot /home/hg/web SuexecUserGroup hg hg Alias /public /var/www/hg-public <Directory "/var/www/hg-public"> Options ExecCGI DirectoryIndex hgweb.cgi AddHandler cgi-script .cgi Order allow,deny Allow from all AuthUserFile /home/hg/.hg.htpasswd AuthGroupFile /dev/null AuthName "public repo" AuthType Basic <LimitExcept GET> Require valid-user </LimitExcept> </Directory> </VirtualHost>Включаем только что созданный виртуальный хост и перезапускаем apache:
# a2ensite hg.example.com # /etc/init.d/apache2 force-reloadОбратите внимание на блок
<LimitExcept GET>, он означает, что пароль не будет спрашиваться при чтении репозитория (то есть http-запросах типаGET). Если вы хотите организовать приватный репозиторий, закомментируйте этот блок. -
Теперь необходимо создать скрипт, через который будет происходить доступ к репозиторию. В пакете
mercurial-commonуже есть нужный нам файл:/usr/share/doc/mercurial-common/examples/hgweb.cgi. Его нужно скопировать в каталог/var/www/hg-publicи немного исправить.# mkdir /var/www/hg-public # cp /usr/share/doc/mercurial-common/examples/hgweb.cgi /var/www/hg-public/ # chown -R hg:hg /var/www/hg-public # chmod +x /var/www/hg-public/hgweb.cgiДля корректной работы suexec необходимо, чтобы скрипт был в каталоге
/var/wwwи его владелец/группа должны бытьhg(вспоминаем директивуSuexecUserGroup hg hg). -
Открываем файл
/var/www/hg-public/hgweb.cgiв текстовом редакторе и правим. Заменяем:application = hgweb("/path/to/repo", "repository name")на
application = hgweb("/home/hg/repo", "Our public repo")Строка может выглядеть по-иному, но её легко можно найти и вписать полный путь к созданному репозиторию (меняем
/path/to/repoна/home/hg/repo). -
Теперь необходимо определить, какое имя пользователя будет использоваться при push-действиях. В данном примере используем имя
hg-user:# su - hg $ htpasswd -c /home/hg/.hg.htpasswd hg-userЗадаём какой-нибудь пароль. Далее необходимо указать это имя непосредственно в параметрах репозитория, для этого создаём файл
/home/hg/repo/.hg/hgrcсо следующим содержимым:[web] allow_push = hg-user push_ssl = false -
Готово, наш сетевой репозиторий имеет URL
http://hg.example.com/public/,hg pushвыполняется под именемhg-userи указанным в командеhtpasswdпаролем. Enjoy.
Несколько замечаний¶
Описывается процесс создания не-SSL репозитория, для SSL всё, в принципе, точно так же, только в блок для виртуального хоста нужно добавить директивы для SSL.
Отдельный юзер используется, чтобы не разводить бардак в каталогах других юзеров.
Скрипт помещается в каталог /var/www по той причине, что suexec требует, чтобы скрипты лежали именно там.