Установка сервера 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 комментария:

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

    ОтветитьУдалить
  2. Всё просто)
    С точки зрения фс на сервере:
    /var/lib/mercurial-server/repos/мойреп
    С точки зрения web:
    http://хост/мойреп
    ---
    То есть клонирование репозитория выглядит так:
    hg clone http://хост/мойреп

    ОтветитьУдалить
  3. Ошибка 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

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

    ОтветитьУдалить