Хостинг репозиториев Mercurial в Вебе

Mercurial (команда hg) имеет встроенный веб-сервер для временной публикации репозитория в Вебе. Однако для долговременного хостинга нужна возможность доступа к репозиторию через веб-сервер типа lighttpd или httpd с аутентификацией, виртуальным хостингом и пр.

Коллекции репозиториев

При помощи файла hgweb.config можно опубликовать сразу несколько репозиториев.

Для выборочной публикации нескольких репозиториев используется секция файла [paths], а для публикации коллекции репозиториев из всех подкаталогов используется [collections].

Размещение файла hgweb.config в ФС может быть произвольным. Вот пример этого файла для размещения всех репозиториев из /srv/hg:

[collections]
/srv/hg = /srv/hg

Здесь первая часть имени — путь, который будет убран из URL к репозиторию. В данном случае репозиторий /srv/hg/foo будет доступен по относительному URL /foo/.

Опубликовать коллекцию при помощи встроенного веб-сервера можно так:

$ hg serve --webdir-conf /srv/hg/hgweb.config

Публикация через lighttpd описана ниже.

Для каждого репозитория полезно вывести имя его владельца и краткую информацию. Также можно выбрать один из нескольких стилей оформления. Пример файла настроек репозитория .hg/hgrc для хостинга в Вебе:

[web]
contact = Ivan Petrov <petrov@example.com>
description = Some project related to Arch Linux 
style = gitweb

Использование lighttpd и CGI

Здесь мы настроим виртуальный хостинг через lighttpd и CGI, базовый URL публикации и аутентификацию пользователей для выполнения hg push через HTTP digest auth.

Базовый конфиг

Для начала нужно активизировать следующие модули lighttpd в его конфигурационном файле (обычно /etc/lighttpd/lighttpd.conf):

server.modules += (
    "mod_rewrite",
    "mod_auth",
    "mod_cgi",
)

Будьте внимательны с порядком модулей. Он влияет на интерпретацию конфига. Обратитесь к докам по lighttpd для уточнения информации.

Для публикации группы репозиториев нам понадобится файл hgwebdir.cgi, идущий в пакете mercurial. Его можно положить рядом с hgweb.config, в случае необходимости поправив путь к этому файлу в самом hgwebdir.cgi. Будем предполагать, что репозитории и конфиги лежат в /srv/hg.

Настроим коллекцию репозиториев, опубликованную по адресу http://hg.example.com/collection/:

$HTTP["host"] == "hg.example.com" {
    url.rewrite-once = (
        "^/collection(/.*)$" => "/hgwebdir.cgi/$1",
    )

    $HTTP["url"] =~ "^(/hgwebdir.cgi/.*)$" {
        server.document-root = "/srv/hg"
        cgi.assign = (".cgi" => "/usr/bin/python")
    }
}

Наконец, в файле hgweb.config нужно скорректировать базовую часть URL, искажённую из-за CGI:

[web]
baseurl = /collection

Запись в репозиторий

Осталось настроить команду hg push для репозиториев, сконфигурировав аутентификацию и авторизацию.

Аутентификация, т. е. удостоверение личности, настраивается через конфиг lighttpd. Мы будем использовать HTTP digest auth, то есть посылку хэша пароля в сообщении HTTP по не шифруемому соединению TCP. Для этого в секцию виртуального хоста выше добавим настройки:

auth.backend = "htdigest"
auth.backend.htdigest.userfile = /srv/hg/users.htdigest

$HTTP["url"] =~ "^(/hgwebdir.cgi/.*)$" {
    # ...

    $HTTP["querystring"] =~ "cmd=unbundle" {
        auth.require = (
            "" => (
                "method" => "digest",
                "realm" => "petrov hg collection",
                "require" => "valid-user",
            ),
        )
    }
}

Здесь упомянут файл с записями пользователей /srv/hg/users.htdigest. Этот файл заполняется при помощи команды htdigest(1):

$ htdigest /srv/hg/users.htdigest "petrov hg collection" petrov

Этот файл наряду с hgweb.config и hgwebdir.cgi должен быть доступен для чтения процессу lighttpd.

На файл /srv/hg/users.htdigest рекомендуется установить права 600.

Далее нужно настроить авторизацию, т. е. контроль доступа. Это делается индивидуально для каждого репозитория в их .hg/hgrc. Ниже мы разрешаем выполнять hg push по соединению без SSL для пользователей ivanov и petrov:

[web]
push_ssl = false
allow_push = ivanov, petrov

Дополнительные параметры см. в hgrc(5).

После этого можно выполнять hg push на клиенте:

$ hg clone http://petrov@hg.example.com/collection/foo/
$ cd foo
$ hg paths
default = http://petrov@hg.example.com/collection/foo/
$ echo "hello world" > hello.txt
$ hg add hello.txt
$ hg ci -m "Added Hello world"
$ hg push

Другие варианты

Для хостинга также можно использовать:

  • Apache httpd и CGI
  • Встроенный веб-сервер в режиме демона и HTTP-прокси (nginx, lighttpd, etc.)

Внешние ссылки

  • Mercurial: Publishing repositories
  • Mercurial: Publishing repositories with hgwebdir.cgi
  • Lighttpd: mod_rewrite
  • Lighttpd: mod_cgi
blog comments powered by Disqus

Options

Tags

  • hosting
  • howto
  • mercurial
  • version-control
  • software

Content view

  • Source

Navigation

  • Index
  • Blog
  • All pages
  • Tags
  • Mercurial repo

Search page names

nqw powered

Creative Commons License Copyright © 2008-2010 spb-archlinux Group. Материалы вики доступны по лицензии Creative Commons.