Expertus metuit
Настройка Mercurial-репозитория на Debian/apache2
2009-05-09 03:05
Теги: mercurial, debian, linux

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

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

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

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

  • Все шаги приводятся в рекомендованном порядке исполнения. Какой-либо шаг можно опустить только при условии, что вы действительно понимаете, что делаете.

  • В качестве редактора всюду используется vi, однако, конечно, можно использовать любой другой по вашему вкусу.

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

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

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

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

    $ mkdir /home/hg/repo
    

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

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

    $ cd repo
    $ hg init
    

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

  5. Устанавливаем apache2 и модуль suexec:

    # aptitude install apache2 apache2-suexec
    # a2enmod suexec
    
  6. Настраиваем виртуальный хост для домена 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). Если вы хотите организовать приватный репозиторий, закомментируйте этот блок.

  7. Теперь необходимо создать скрипт, через который будет происходить доступ к репозиторию. В пакете 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).

  8. Открываем файл /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).

  9. Теперь необходимо определить, какое имя пользователя будет использоваться при 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
    
  10. Готово, наш сетевой репозиторий имеет URL http://hg.example.com/public/, hg push выполняется под именем hg-user и указанным в команде htpasswd паролем. Enjoy.

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

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

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

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

Комментарии

Текст комментария (разметка: *курсив*, **полужирная**, [ссылка](http://example.com) или <http://example.com> ещё)
Имя (обязательно, 50 символов или меньше)
Email, на который получать ответы (не будет опубликован)
Веб-сайт
© 2006—2016 Sergey Stolyarov | Работает на Pyrone