Опять давно ничего не писал :) А сегодня решил напомнить, что я жив и рассказать, как поднять свой hg репозитарий с web мордой на веб-сервере Lighttpd.
Предположим, что mercurial и Lighttpd у вас уже установлены, а репозитарии hg будут храниться в /var/www. Т.к. hgweb мы будем запускать через fastcgi (единственный возможный на lighttpd, не считая прокси), то нам потребуется .fcgi скрипт, который будет создавать wsgi сервер с сокетом. Т.к. у меня кучка django сайтов, то я сделал папку /var/www/fcgi, в которой все их и храню :)
- Создадим такую папку и положим в файл hgweb.fcgi такой код:
from mercurial import demandimport; demandimport.enable()
import os
os.environ["HGENCODING"] = "UTF-8"
from mercurial.hgweb.hgwebdir_mod import hgwebdir
from mercurial.hgweb.request import wsgiapplication
from flup.server.fcgi import WSGIServer
def make_web_app():
return hgwebdir("hgweb.conf")
def wsgiapplication2(app_maker):
application = app_maker()
def run_wsgi(env, respond):
path = env['PATH_INFO'].replace('hgweb.fcgi/','')
env['PATH_INFO'] = path
return application(env, respond)
return run_wsgi
WSGIServer(wsgiapplication2(make_web_app)).run()
- Тамже, положим файл hgweb.conf с конфигурацией нашего сервера:
[paths]
/repo_name = /path/to/repo
[web]
style = gitweb
allow_archive = bz2 gz zip
baseurl =
В секции [paths] определяются все репозитории, которые будут видны в hgweb.
Baseurl - устанавливает префикс в url для доступа к репозитарию. В моем случае, ссылка будет http://example.com/repo_name.
3. Создадим репозиторий hg, либо склонируем его с локальнйо машины по ssh :)
cd /path/to/repo
hg init
cd /path/to/repo
hg clone . ssh://login@example.com//path/to/repo
При клонировании по ssh, важно не забыть именно два слэша, после адреса.
- Конфигурируем lighttpd.
Создаем новый конфиг, я назвал его 15-hgweb.conf, имя значения не имеет впринципе :) Кладем в папочку и включаем:
/etc/lighttpd/conf-available/
ln -s /etc/lighttpd/conf-available/15-hgweb.conf /etc/lighttpd/conv-enabled/15-hgweb.conf
Содержимое файла 15-hgweb.conf:
$HTTP["host"] == "hg.example.com" {
server.document-root = ""
server.errorlog = "/var/log/lighttpd/hgweb.error.log"
accesslog.filename = "/var/log/lighttpd/hgweb.access.log"
accesslog.format = "%h %l %u %f %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i""
server.follow-symlink = "enable"
url.rewrite-once = (
"^/(.*)$" => "/hgweb.fcgi/$1",
)
fastcgi.server = (
"/hgweb.fcgi" => (
"main" => (
"socket" => "/tmp/hgweb.socket",
"check-local" => "disable",
"bin-path" => "/path/to/hgweb.fcgi",
"broken-scriptfilename" => "enable",
"min-procs" => 1,
"max-procs" => 1,
)
)
)
alias.url = (
"/static" => "/usr/share/mercurial/templates/static",
)
$HTTP["querystring"] =~ "cmd=unbundle" {
auth.backend = "htpasswd"
auth.backend.htpasswd.userfile = "/path/to/passwd"
auth.require = ( "" => (
"method" => "basic",
"realm" => "gigimon Repo",
"require" => "valid-user"
)
)
}
}
Последняя секция с авторизацией нужна для возможности делать push в репозитории. Если хотите сделать его публичным дял просомтра, либо убрать возможность пуша, то можете ее полностью убрать.
Также, для пуша требуется, чтобы в lighttpd был настроен SSL, в дефолтной поставке дебиана такое есть. Проверить можно в /etc/lighttpd/lighttpd.conf , обычно в самом низу:
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/lighttpd.pem"
}
Файл с паролями, который указывается в auth.backend.htpasswd.userfile, создается командой htpasswd входящей в apache2-utils
5. Теперь, если хотим разрешить пуш некоторым лицам, нам требуется настроить сам репозиторий через файл hgrc
cat /path/to/repo/.hg/hgrc
[web]
allow_push = user1, user2
description = "example.com development"
Также, помимо разрешения, в этом файле задаются многие параметры для репозитория. Я использую авто апдейт кода при пуше в него, через строку:
[hooks]
changegroup.upd = hg update
После перезагрузки lighttpd
/etc/init.d/lighttpd restart
По вашему адресу, должен будет появиться и работать hgweb, надеюсь у вас он появился :)