Как стать автором
Обновить

Установка mercurial-репозитория на debian-сервер с apache2

Время на прочтение 4 мин
Количество просмотров 1.6K
Написал в своём блоге детальный мануал, как создать и вывести в веб через apache2 собственный mercurial-репозиторий на сервере с debian. Наверное, сгодится и для убунты.

Постараюсь по возможности обновлять одновременно и в блоге и тут, но блог приоритетней. Сразу прошу прощения за нераспарсенные блоки <code>, в блоге markdown, а тут html, парсер не хочет понимать сгенерённый html, так что не обращайте внимания на <code> и </code>



Задача: создать и настроить mercurial-репозиторий на debian-сервере с установленным apache2.

Всё довольно просто, но есть несколько тонких моментов. Все шаги справедливы для debian lenny и, возможно, для ubuntu (не знаю какой версии). Предполагается, что наш репозиторий будет доступен по адресу hg.example.com/public.

Некоторые соглашения



  • Все команды, которые нужно выполнить, предваряются либо символом «#» (команда должна быть выполнена с правами суперпользователя); либо символом «$» (команда должна быть выполнена с правами обычного пользователя).
  • Все шаги приводятся в рекомендованном порядке исполнения. Какой-либо шаг можно опустить только при условии, что вы действительно понимаете, что делаете.
  • В качестве редактора всюду используется vi, однако, конечно, можно использовать любой другой по вашему вкусу.


Шаги установки



  1. Устанавливаем mercurial:

    <code># aptitude install mercurial
    </code>
  2. Создаём отдельного пользователя в системе, именно этому пользователю будут принадлежать репозитории. Домашний каталог пользователя будет /home/hg.

    <code># useradd hg
    # mkdir /home/hg
    # chown hg:hg /home/hg
    </code>
  3. Логинимся (через sudo su - hg) под этим пользователем. Создаём каталог для репозитория (в нашем примере: /home/hg/repo)

    <code>$ mkdir /home/hg/repo
    </code>


    и каталог для DocumentRoot виртуального хоста:

    <code>$ mkdir /home/hg/web
    </code>
  4. Создаём непосредственно репозиторий:

    <code>$ cd repo
    $ hg init
    </code>


    Репозиторий создан, теперь необходимо настроить apache так, чтобы организовать доступ к нему через http.
  5. Устанавливаем apache2 и модуль suexec:

    <code># aptitude install apache2 apache2-suexec
    # a2enmod suexec
    </code>
  6. Настраиваем виртуальный хост для домена 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). Если вы хотите организовать приватный репозиторий, закомментируйте этот блок.
  7. Теперь необходимо создать скрипт, через который будет происходить доступ к репозиторию. В пакете 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).
  8. Открываем файл /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).
  9. Теперь необходимо определить, какое имя пользователя будет использоваться при 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>
  10. Готово, наш сетевой репозиторий имеет URL hg.example.com/public, hg push выполняется под именем hg-user и указанным в команде htpasswd паролем. Enjoy.


Несколько замечаний



Описывается процесс создания не-SSL репозитория, для SSL всё, в принципе, точно так же, только в блок для виртуального хоста нужно добавить директивы для SSL.

Отдельный юзер используется, чтобы не разводить бардак в каталогах других юзеров.

Скрипт помещается в каталог /var/www по той причине, что suexec требует, чтобы скрипты лежали именно там.
Теги:
Хабы:
+4
Комментарии 3
Комментарии Комментарии 3

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн