Задача: создать и настроить 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 требует, чтобы скрипты лежали именно там.