Хостинг репозиториев 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
