Написал в своём блоге детальный мануал, как создать и вывести в веб через apache2 собственный mercurial-репозиторий на сервере с debian. Наверное, сгодится и для убунты.
Постараюсь по возможности обновлять одновременно и в блоге и тут, но блог приоритетней. Сразу прошу прощения за нераспарсенные блоки <code>, в блоге markdown, а тут html, парсер не хочет понимать сгенерённый html, так что не обращайте внимания на <code> и </code>
Задача: создать и настроить mercurial-репозиторий на debian-сервере с установленным apache2.
Всё довольно просто, но есть несколько тонких моментов. Все шаги справедливы для debian lenny и, возможно, для ubuntu (не знаю какой версии). Предполагается, что наш репозиторий будет доступен по адресу
Описывается процесс создания не-SSL репозитория, для SSL всё, в принципе, точно так же, только в блок для виртуального хоста нужно добавить директивы для SSL.
Отдельный юзер используется, чтобы не разводить бардак в каталогах других юзеров.
Скрипт помещается в каталог
Постараюсь по возможности обновлять одновременно и в блоге и тут, но блог приоритетней. Сразу прошу прощения за нераспарсенные блоки <code>, в блоге markdown, а тут html, парсер не хочет понимать сгенерённый html, так что не обращайте внимания на <code> и </code>
Задача: создать и настроить mercurial-репозиторий на debian-сервере с установленным apache2.
Всё довольно просто, но есть несколько тонких моментов. Все шаги справедливы для debian lenny и, возможно, для ubuntu (не знаю какой версии). Предполагается, что наш репозиторий будет доступен по адресу
hg.example.com/public
.Некоторые соглашения
- Все команды, которые нужно выполнить, предваряются либо символом «
#
» (команда должна быть выполнена с правами суперпользователя); либо символом «$
» (команда должна быть выполнена с правами обычного пользователя). - Все шаги приводятся в рекомендованном порядке исполнения. Какой-либо шаг можно опустить только при условии, что вы действительно понимаете, что делаете.
- В качестве редактора всюду используется
vi
, однако, конечно, можно использовать любой другой по вашему вкусу.
Шаги установки
- Устанавливаем
mercurial
:
<code># aptitude install mercurial </code>
- Создаём отдельного пользователя в системе, именно этому пользователю будут принадлежать репозитории. Домашний каталог пользователя будет
/home/hg
.
<code># useradd hg # mkdir /home/hg # chown hg:hg /home/hg </code>
- Логинимся (через
sudo su - hg
) под этим пользователем. Создаём каталог для репозитория (в нашем примере:/home/hg/repo
)
<code>$ mkdir /home/hg/repo </code>
и каталог для DocumentRoot виртуального хоста:
<code>$ mkdir /home/hg/web </code>
- Создаём непосредственно репозиторий:
<code>$ cd repo $ hg init </code>
Репозиторий создан, теперь необходимо настроить apache так, чтобы организовать доступ к нему через http. - Устанавливаем apache2 и модуль suexec:
<code># aptitude install apache2 apache2-suexec # a2enmod suexec </code>
- Настраиваем виртуальный хост для домена
hg.example.com
. Для этого нужно создать файл с описанием параметров виртуального хоста в каталоге/etc/apache2/sites-available
:
<code># vi /etc/apache2/sites-available/hg.regolit.com </code>
Создаём файл примерно с таким содержимым:
<code>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> </code>
Включаем только что созданный виртуальный хост и перезапускаем apache:
<code># a2ensite hg.example.com # /etc/init.d/apache2 force-reload </code>
Обратите внимание на блок<LimitExcept GET>
, он означает, что пароль не будет спрашиваться при чтении репозитория (то есть http-запросах типаGET
). Если вы хотите организовать приватный репозиторий, закомментируйте этот блок. - Теперь необходимо создать скрипт, через который будет происходить доступ к репозиторию. В пакете
mercurial-common
уже есть нужный нам файл:/usr/share/doc/mercurial-common/examples/hgweb.cgi
. Его нужно скопировать в каталог/var/www/hg-public
и немного исправить.
<code># 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 </code>
Для корректной работы suexec необходимо, чтобы скрипт был в каталоге/var/www
и его владелец/группа должны бытьhg
(вспоминаем директивуSuexecUserGroup hg hg
). - Открываем файл
/var/www/hg-public/hgweb.cgi
в текстовом редакторе и правим. Заменяем:
<code>application = hgweb("/path/to/repo", "repository name") </code>
на
<code>application = hgweb("/home/hg/repo", "Our public repo") </code>
Строка может выглядеть по-иному, но её легко можно найти и вписать полный путь к созданному репозиторию (меняем/path/to/repo
на/home/hg/repo
). - Теперь необходимо определить, какое имя пользователя будет использоваться при push-действиях. В данном примере используем имя
hg-user
:
<code># su - hg $ htpasswd -c /home/hg/.hg.htpasswd hg-user </code>
Задаём какой-нибудь пароль. Далее необходимо указать это имя непосредственно в параметрах репозитория, для этого создаём файл/home/hg/repo/.hg/hgrc
со следующим содержимым:
<code>[web] allow_push = hg-user push_ssl = false </code>
- Готово, наш сетевой репозиторий имеет URL
hg.example.com/public
,hg push
выполняется под именемhg-user
и указанным в командеhtpasswd
паролем. Enjoy.
Несколько замечаний
Описывается процесс создания не-SSL репозитория, для SSL всё, в принципе, точно так же, только в блок для виртуального хоста нужно добавить директивы для SSL.
Отдельный юзер используется, чтобы не разводить бардак в каталогах других юзеров.
Скрипт помещается в каталог
/var/www
по той причине, что suexec требует, чтобы скрипты лежали именно там.