Установка сервера Mercurial с доступом по HTTP на Debian 7 (Wheezy)

В данной статье я был хотел поделиться своим опытом развёртывания сервера Mercurial на одном из самых популярных дистрибутивов Linux. Я старался максимально просто и лаконично описать процесс настройки столь мощной и сложной системы как Mercurial в связке с web-сервером Apache2.
Мне от системы требовались следующие возможности:
- аутентификация по паролю
- просмотр через web изменений и коментариев сделанных пользователями
- коммит через протокол http или ssh
- множество репозиториев в одном хранилище
- и максимальная похожесть на систему git

Установка и настройка Mercurial

Установка сервера

Для того чтобы установить необходимый набор пакетов достаточно выполнить следующую команду:

$ sudo apt-get install mercurial mercurial-server

Настройка сервера

Во время установки пакет mercurial-server создаст пользователя hg с домашней директорией /var/lib/mercurial-server.
Создадим тестовый репозиторий, для этого авторизуемся из под пользователя hg:

$ sudo su -l hg

По умолчанию у данного пользователя домашняя директория не в /home:

$ pwd
/var/lib/mercurial-server/

Перейдём в репозитории и создадим новый:

$ cd repos
$ hg init testrepo

Протестируем репозиторий:

$ cd testrepo

Создадим тестовый файлик:

$ echo "test msg" > test.txt
$ hg status
? test.txt

Добавим его в индекс:

$ hg add test.txt
$ hg status
A test.txt

Попробуем закоммитить файл:

$ hg ci -m 'asd'
прервано: не задано имя пользователя (см. "hg help config")

Система требует задать имя пользователя от которого будет выполняться коммиты:

$ mcedit ~/.hgrc

Добавим в этот файл информацию о пользователе

[ui]
username = hg@server

После этого повторим коммит:

$ hg ci -m 'asd'

Ошибок больше нет.

Добавим описание репозитория

После того как мы настроим web-доступ к нашему репозиторию мы сможем увидеть его description. Для этого отредактируем файл:

$ mcedit /var/lib/mercurial-server/repos/testrepo/.hg/hgrc

Запишем в него следующее:

[web]
description = Тут описание репозитория 

Настройка доступа к Mercurial через HTTP 

Установка apache2

Как и всегда лаконичная команда в консоли:

$ sudo apt-get install apache2 apache2-utils libapache2-mod-wsgi

Настройка VHost для Mercurial

Отредактируем файл конфигурации:

sudo mcedit /etc/apache2/sites-available/mercurial.conf

 Там будет следующее содержимое:

<VirtualHost *:80>
        ServerAdmin admin@company.ru
        ServerName repo.company.ru
        DocumentRoot /var/lib/mercurial-server/repos/
        # Настройка WCGI
        WSGIProcessGroup hg
        WSGIDaemonProcess hg user=hg group=hg threads=2 maximum-requests=1000
        # Обработчик WSGI
        WSGIScriptAlias / /var/lib/mercurial-server/repos/hgwebdir.wsgi
        # Аутентификация
        <Location />
                AuthType Basic
                AuthName "Restricted Files"
                AuthUserFile /var/lib/mercurial-server/repos/.htpasswd

                Require valid-user
        </Location>
        # Логи сервера
        ErrorLog ${APACHE_LOG_DIR}/error.repo.log
        CustomLog ${APACHE_LOG_DIR}/access.repo.log combined
</VirtualHost>

Главное не забыть настроить хост в прямой зоне DNS-сервера, где "repo.company.ru >>> x.x.x.x".
Включим указанный сайт штатными средствами apache2:

$ sudo a2ensite mercurial.conf

Затем перезапустим сервер:

$ sudo /etc/init.d/apache2 restart 

Настройка скрипта, отображающего содержимое репозитория 

Далее настроим скрипт, для работы с репозиторием:

$ sudo mcedit /var/lib/mercurial-server/repos/hgwebdir.wsgi

Запишем в него следующее содержимое:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
os.environ['HGENCODING'] = 'utf-8'

from mercurial.hgweb.hgwebdir_mod import hgwebdir
from mercurial.hgweb.request import wsgiapplication

path = os.path.dirname(os.path.abspath(__file__))
application = hgwebdir(path+'/hgwebdir.conf')

Теперь пропишем конфигурацию для указанного выше скрипта:

$ sudo mcedit /var/lib/mercurial-server/repos/hgwebdir.conf

Запишем в этот файл следующее:

[web]
style = coal
allow_push = *
push_ssl = no

[paths]
testrepo = /var/lib/mercurial-server/repos/testrepo/

Есть небольшой хак, допустим в директории /var/lib/mercurial-server будет несколько репозиториев и возможно в будущем придётся их добавлять то достаточно в графе [paths] указать корневую директорию:

[paths]
/ = /var/lib/mercurial-server/repos/*

Последний штрих:

$ sudo chown hg:hg /var/lib/mercurial-server/repos/hgwebdir.wcgi /var/lib/mercurial-server/repos/hgwebdir.conf

Настроим доступ только для авторизованных пользователей

Для этого используем штатную утилиту из пакета apache2.utils:

htpasswd -c /var/lib/mercurial-server/repos/.htpasswd username 

Теперь попытаем залогиниться, откроем через любой браузер адрес нашего сервера mercurial, после чего авторизуемся и перед нами будет список репозиториев, который мы указали в файле hgwebdir.conf.

Дальнейшее обслуживание

Если в дальнейшем потребуется добавить новый репозиторий:

$ sudo su -l hg
$ cd /var/lib/mercurial-server/repos/
$ hg init newrepo
$ mcedit hgwebdir.conf

Добавить строку в [paths]:

newrepo = /var/lib/mercurial-server/repos/newrepo/

И всё, ничего перезапускать не требуется.

Как пользоваться

Продолжение тут: http://devppp.blogspot.ru/2013/10/merurial.html

3 thoughts on “Установка сервера Mercurial с доступом по HTTP на Debian 7 (Wheezy)

  1. Сдалал всё по вашей инструкции, однако непонятно теперь, где искать этот репозиторий, как зайти на него в браузере и как клонировать его на клиентских машинах. Спасибо!

  2. Ошибка Internal Server Error из-за
    # Настройка WCGI
    WSGIProcessGroup hg
    WSGIDaemonProcess hg user=hg group=hg threads=2 maximum-requests=1000
    # Обработчик WSGI
    WSGIScriptAlias / /var/lib/mercurial-server/repos/hgwebdir.wsgi

    В чем может быть беда?

Comments are closed.